<?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: ArmelDev</title>
    <description>The latest articles on DEV Community by ArmelDev (@meledjearmel).</description>
    <link>https://dev.to/meledjearmel</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%2F1425758%2F1babaa62-018c-442f-b5f7-35cfa1f4e1f3.png</url>
      <title>DEV Community: ArmelDev</title>
      <link>https://dev.to/meledjearmel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/meledjearmel"/>
    <language>en</language>
    <item>
      <title>GitLab: two critical flaws in ten days, from discovery to patch</title>
      <dc:creator>ArmelDev</dc:creator>
      <pubDate>Wed, 21 Oct 2026 21:00:04 +0000</pubDate>
      <link>https://dev.to/meledjearmel/gitlab-two-critical-flaws-in-ten-days-from-discovery-to-patch-39i9</link>
      <guid>https://dev.to/meledjearmel/gitlab-two-critical-flaws-in-ten-days-from-discovery-to-patch-39i9</guid>
      <description>&lt;p&gt;On October 21, 2026, GitLab released emergency versions &lt;strong&gt;19.5.1, 19.4.3, 19.3.6, 19.2.9, 19.1.9, 19.0.10 and 18.11.13&lt;/strong&gt;. They fix &lt;strong&gt;CVE-2026-110264&lt;/strong&gt;, a critical flaw rated &lt;strong&gt;10.0&lt;/strong&gt;, the maximum score, which can allow an unauthenticated attacker to execute code on a GitLab server. It is the second flaw of this kind in ten days. Here is what happened, and what to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem comes from the regular expression engine
&lt;/h2&gt;

&lt;p&gt;Both flaws share the same nature: an &lt;strong&gt;integer overflow&lt;/strong&gt; when compiling a specially crafted regular expression. The component at fault is &lt;strong&gt;Onigmo&lt;/strong&gt;, Ruby's regular expression engine, which GitLab ships in its packages.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-97229&lt;/strong&gt; (October 12): the malicious expression goes through the CI/CD configuration, in a &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file. It affects versions 19.2 and later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-110264&lt;/strong&gt; (October 21): a flaw of the same nature, but affecting &lt;strong&gt;every version since GitLab 7.0&lt;/strong&gt; , released in 2014. According to the detection rules published by GitLab, it can be triggered by a simple Org-mode ( &lt;code&gt;.org&lt;/code&gt; ) file, whose rendering passes an expression to the engine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In both cases, the code runs as GitLab's &lt;code&gt;git&lt;/code&gt; system account, which has access to repositories, CI/CD secrets and the instance configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every self-managed instance is affected
&lt;/h2&gt;

&lt;p&gt;GitLab.com is already patched and GitLab Dedicated customers have nothing to do. Self-managed instances, Community and Enterprise alike, must be updated.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Branch&lt;/th&gt;
&lt;th&gt;Fixed version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;19.5&lt;/td&gt;
&lt;td&gt;19.5.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19.4&lt;/td&gt;
&lt;td&gt;19.4.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19.3&lt;/td&gt;
&lt;td&gt;19.3.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19.2&lt;/td&gt;
&lt;td&gt;19.2.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19.1&lt;/td&gt;
&lt;td&gt;19.1.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19.0&lt;/td&gt;
&lt;td&gt;19.0.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7.0 to 18.11&lt;/td&gt;
&lt;td&gt;18.11.13&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; the versions released on October 12 (19.4.2, 19.3.5 and 19.2.8) fix the first flaw, but not the second. An instance updated on that date is vulnerable again.&lt;/p&gt;

&lt;p&gt;The fixes for 19.2, 19.1, 19.0 and 18.11 are exceptional backports, outside GitLab's usual policy. That alone shows how serious the problem is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two other serious flaws in the same update
&lt;/h2&gt;

&lt;p&gt;The October 21 release fixes eleven flaws in total. Two of them, rated high, deserve special attention:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-15723&lt;/strong&gt; (CVSS 8.2): an authentication flaw that can allow &lt;strong&gt;account takeover&lt;/strong&gt; when SAML authentication and automatic LDAP linking are enabled. Organizations connecting GitLab to their corporate directory are directly concerned.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-112212&lt;/strong&gt; (CVSS 7.5): a &lt;strong&gt;cache poisoning&lt;/strong&gt; issue in OAuth/OIDC discovery, the mechanism used to sign in through an external identity provider.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These flaws are fixed by the same versions: a single update takes care of everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  From discovery to patch: a tense month
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;GitLab 7.0 is released. According to the October 21 advisory, every version since then is affected by CVE-2026-110264.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;September 23, 2026&lt;/td&gt;
&lt;td&gt;GitLab fixes two other critical flaws (CVE-2026-93577 and CVE-2026-89078, CVSS 9.9), exploitable with an authenticated account. According to The Hacker News, researcher joaxcar reported four code execution flaws in GitLab's regular expression engine within a month.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 12, 2026&lt;/td&gt;
&lt;td&gt;CVE-2026-97229 (CVSS 10.0) is fixed in versions 19.4.2, 19.3.5 and 19.2.8.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 13, 2026&lt;/td&gt;
&lt;td&gt;Rapid7 reproduces code execution on the official GitLab CE 19.4.1 image.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 16, 2026&lt;/td&gt;
&lt;td&gt;Researcher Jonah Burgess publishes a proof-of-concept exploit for CVE-2026-97229. Being able to push a branch to a public project on the instance is enough.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 20, 2026&lt;/td&gt;
&lt;td&gt;GitLab publishes two detection rules: "Onigmo native worker crash" and "Org mode render error burst".&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 21, 2026&lt;/td&gt;
&lt;td&gt;CVE-2026-110264 (CVSS 10.0) is fixed. It was reported by joaxcar through the HackerOne bug bounty program, and the fix is backported down to the 18.11 branch. The same update fixes ten other flaws, including CVE-2026-15723 (8.2) and CVE-2026-112212 (7.5).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 21, after the release&lt;/td&gt;
&lt;td&gt;GitLab reports no exploitation in the wild. CISA has not added the flaw to its catalog of exploited vulnerabilities.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A public exploit already exists for the first flaw, and both share the same root cause. Assume that exposed instances will be targeted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Patching: updating is the only real protection
&lt;/h2&gt;

&lt;p&gt;GitLab offers no workaround for CVE-2026-110264. Example for an Omnibus installation on Debian/Ubuntu (replace &lt;code&gt;gitlab-ee&lt;/code&gt; with &lt;code&gt;gitlab-ce&lt;/code&gt; depending on your edition):&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Check the installed version
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;gitlab-rake gitlab:env:info | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-A2&lt;/span&gt; &lt;span class="s2"&gt;"GitLab information"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Back up before doing anything
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;gitlab-backup create
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /etc/gitlab/gitlab.rb /etc/gitlab/gitlab-secrets.json /root/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backup does not include &lt;code&gt;gitlab.rb&lt;/code&gt; or &lt;code&gt;gitlab-secrets.json&lt;/code&gt;: copy them separately.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Update
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;gitlab-ee
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your instance is several versions behind, follow GitLab's official upgrade path rather than jumping straight to the latest version.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. For Docker, change the image
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull gitlab/gitlab-ee:19.5.1-ee.0
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adjust the tag to your branch and edition.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Check that the fix is active
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;gitlab-rake gitlab:env:info | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-A2&lt;/span&gt; &lt;span class="s2"&gt;"GitLab information"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;gitlab-ctl status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Plan ahead:&lt;/strong&gt; on a single-node server, versions 19.4.3 and 19.3.6 include database migrations that make GitLab unavailable during the operation. Multi-node installations can follow the zero-downtime upgrade procedure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security advice to follow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before updating
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Take inventory&lt;/strong&gt; of every GitLab instance, including test or forgotten servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handle internet-facing instances first&lt;/strong&gt; , especially those with public projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Take a snapshot or full backup&lt;/strong&gt; so you can roll back.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  While waiting for the fix
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Disable open sign-up&lt;/strong&gt; for new users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restrict anonymous access&lt;/strong&gt; to public projects and prevent untrusted users from creating or editing projects.&lt;/li&gt;
&lt;li&gt;If possible, &lt;strong&gt;limit access to the instance&lt;/strong&gt; to a VPN or known IP addresses.&lt;/li&gt;
&lt;li&gt;If your instance uses SAML with automatic LDAP linking, &lt;strong&gt;review recent sign-ins&lt;/strong&gt; and newly linked accounts, in light of CVE-2026-15723.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These measures reduce the attack surface, but do not fix the flaws.&lt;/p&gt;

&lt;h3&gt;
  
  
  After updating
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Monitor logs&lt;/strong&gt; : repeated worker crashes or bursts of errors when rendering &lt;code&gt;.org&lt;/code&gt; files are red flags. The two detection rules published by GitLab target exactly these cases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look for signs of compromise&lt;/strong&gt; on instances exposed before the fix: unusual processes started by the &lt;code&gt;git&lt;/code&gt; account, recent files in GitLab directories, recently created accounts or access tokens, abnormal outbound connections.&lt;/li&gt;
&lt;li&gt;If in doubt, &lt;strong&gt;rotate secrets&lt;/strong&gt; : CI/CD variables, personal and project access tokens, deploy keys, runner registration tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A shared component, a shared risk
&lt;/h2&gt;

&lt;p&gt;As with PHP2Shell the same week, the defect does not come from business code, but from a core component everyone uses without thinking about it: here, Ruby's regular expression engine. A flaw in such a deep building block can stay hidden for years, then hit every version of a product at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  What now?
&lt;/h2&gt;

&lt;p&gt;If you updated GitLab on October 12, do it again today. And ask yourself one question: do you know exactly how many GitLab instances run in your organization?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt; &lt;a href="https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-5-1-released/" rel="noopener noreferrer"&gt;GitLab – October 21 advisory&lt;/a&gt; · &lt;a href="https://thehackernews.com/2026/10/critical-gitlab-flaw-cvss-100-could.html" rel="noopener noreferrer"&gt;The Hacker News&lt;/a&gt; · &lt;a href="https://www.rapid7.com/blog/post/etr-cve-2026-97229-critical-unauthenticated-remote-code-execution-in-gitlab/" rel="noopener noreferrer"&gt;Rapid7&lt;/a&gt; · &lt;a href="https://www.helpnetsecurity.com/2026/10/13/gitlab-ci-cd-regular-expression-compiler-vulnerability-cve-2026-97229/" rel="noopener noreferrer"&gt;Help Net Security&lt;/a&gt; · &lt;a href="https://cybersecuritynews.com/poc-gitlab-rce-vulnerability/amp/" rel="noopener noreferrer"&gt;Cyber Security News&lt;/a&gt; · &lt;a href="https://hol.org/guard/security/campaigns/cve-2026-110264-gitlab-onigmo-regex-unauthenticated-rce" rel="noopener noreferrer"&gt;HOL&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>vulnerability</category>
      <category>update</category>
      <category>gitlab</category>
    </item>
    <item>
      <title>PHP2Shell: two critical PHP vulnerabilities, from discovery to patch</title>
      <dc:creator>ArmelDev</dc:creator>
      <pubDate>Wed, 21 Oct 2026 16:45:05 +0000</pubDate>
      <link>https://dev.to/meledjearmel/php2shell-two-critical-php-vulnerabilities-from-discovery-to-patch-5f7n</link>
      <guid>https://dev.to/meledjearmel/php2shell-two-critical-php-vulnerabilities-from-discovery-to-patch-5f7n</guid>
      <description>&lt;p&gt;On October 21, 2026, the PHP team released emergency updates: &lt;strong&gt;PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35&lt;/strong&gt;. These versions fix two critical vulnerabilities, nicknamed &lt;strong&gt;PHP2Shell&lt;/strong&gt;, that allow remote code execution without authentication. Here is what happened, and what to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The flaw is in PHP, not in your code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-109618&lt;/strong&gt; : if a request hits the &lt;code&gt;memory_limit&lt;/code&gt; at the wrong moment, PHP can leave internal data half-initialized, then treat it as valid. The result: memory corruption.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-109619&lt;/strong&gt; : a badly timed fatal error can leave internal state pointing to memory from a previous request. A later request handled by the same worker can then reuse that already-freed memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are rated &lt;strong&gt;9.2 on CVSS v4.0&lt;/strong&gt;. On Apache with mod_php, a single request can trigger the attack before the application even runs. Code execution was also confirmed on PHP-FPM through some application code paths.&lt;/p&gt;

&lt;p&gt;Because the defect lives in the interpreter, it affects everything running on it: WordPress, &lt;a href="https://armeldev.xyz/en/skills" rel="noopener noreferrer"&gt;Laravel&lt;/a&gt;, Drupal, Magento, Joomla and in-house applications. No line of application code can protect against it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every version is affected, and some will never be fixed
&lt;/h2&gt;

&lt;p&gt;The problem goes back at least to PHP 5.4. Every installation serving web requests is exposed: PHP-FPM, Apache mod_php, php-cgi, FrankenPHP and LiteSpeed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Branch&lt;/th&gt;
&lt;th&gt;Fixed version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8.5&lt;/td&gt;
&lt;td&gt;8.5.12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.4&lt;/td&gt;
&lt;td&gt;8.4.27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.3&lt;/td&gt;
&lt;td&gt;8.3.36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.2&lt;/td&gt;
&lt;td&gt;8.2.35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.1 and earlier&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;No official fix&lt;/strong&gt; (end of life)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  From discovery to patch: a two-year story
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;PHP's first external security audit in years, carried out by Quarkslab and funded by the Sovereign Tech Agency through OSTIF. While fixing one of the reported issues, a PHP core developer spots the first signs of the memory-handling defect. An exploit is considered in theory, but no concrete vector is found.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024 – 2026&lt;/td&gt;
&lt;td&gt;Several fixes are explored, but each comes at a cost: compatibility breaks, denial-of-service risk, or changes forced on third-party extensions. Work stops and restarts for months. The PHP Foundation itself acknowledges a structural failure, tied to its decision process and lack of resources.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Early 2026&lt;/td&gt;
&lt;td&gt;PHP's code is scanned with AI tools, as part of a partnership with Alpha-Omega.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 2026&lt;/td&gt;
&lt;td&gt;The PHP Foundation creates a team dedicated to ecosystem security.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;July 30, 2026&lt;/td&gt;
&lt;td&gt;Security firm Calif starts an audit of PHP.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;August 11, 2026&lt;/td&gt;
&lt;td&gt;Calif reports an unconditional remote code execution with the same root cause as the defect spotted in 2024. OpenAI reports the same root cause the same day. Fixing it becomes the top priority.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;August 24 and September 18, 2026&lt;/td&gt;
&lt;td&gt;Wiz, then OpenAI, report additional attack vectors.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 20, around 15:00 UTC&lt;/td&gt;
&lt;td&gt;The CVE IDs leak on forums and social media, with a wrong release time and an incorrect score of 10.0. No technical details leak.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 20, 19:30 UTC&lt;/td&gt;
&lt;td&gt;PHP publishes a pre-announcement and moves the release from October 22 to October 21.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 20, around 20:00 UTC&lt;/td&gt;
&lt;td&gt;Calif mistakenly publishes a demo video. Deleted, it gets copied and speeds up exploit development.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 21, 07:41 UTC&lt;/td&gt;
&lt;td&gt;Chainguard breaks the embargo by publishing patched images, making it possible to study the fix before its official release.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 21, 14:00 UTC&lt;/td&gt;
&lt;td&gt;Official release of the fixed versions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 21, after the release&lt;/td&gt;
&lt;td&gt;watchTowr, Patchstack and Aikido (citing Cloudflare) report exploitation attempts. PHP has not confirmed exploitation, and CISA has not added the CVEs to its catalog of exploited vulnerabilities.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Exploit tools are circulating. Assume that exposed servers will be scanned.&lt;/p&gt;

&lt;h2&gt;
  
  
  Patching: updating is the only real protection
&lt;/h2&gt;

&lt;p&gt;Several workarounds have circulated, such as disabling &lt;code&gt;session.upload_progress&lt;/code&gt;. According to watchTowr, changes to &lt;code&gt;.ini&lt;/code&gt; files are not enough to prevent exploitation.&lt;/p&gt;

&lt;p&gt;Example on Debian/Ubuntu with Ondřej Surý's packages (replace &lt;code&gt;8.4&lt;/code&gt; with your version):&lt;/p&gt;

&lt;h3&gt;
  
  
  1. List installed versions and check the active one
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; /etc/php
php8.4 &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Check that the fixed package is available
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
apt-cache policy php8.4-fpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Candidate&lt;/code&gt; line should show the fixed version. If not, the repository is not updated yet: wait and try again.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Upgrade every package for that version, keeping your configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--only-upgrade&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; Dpkg::Options::&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"--force-confold"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="si"&gt;$(&lt;/span&gt;dpkg &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="s1"&gt;'php8.4*'&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^ii/ {print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repeat for &lt;strong&gt;every&lt;/strong&gt; installed version, even those no site uses.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Restart long-running PHP processes
&lt;/h3&gt;

&lt;p&gt;PHP-FPM restarts with the update, but command-line workers do not. For a Laravel application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan queue:restart
php artisan horizon:terminate
php artisan octane:reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Check that the fix is active
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php8.4 &lt;span class="nt"&gt;-v&lt;/span&gt;
php-fpm8.4 &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ubuntu's automatic security updates do not cover third-party PHP repositories: the update has to be run manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security advice to follow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before updating
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Take inventory&lt;/strong&gt; of every server, container and VM running PHP, including forgotten internal tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handle internet-facing servers first&lt;/strong&gt; , then internal ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Take a snapshot or backup&lt;/strong&gt; so you can roll back if something goes wrong.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Depending on your environment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; : rebuild images from a patched base image, then redeploy containers. Updating a running container is not enough.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared hosting&lt;/strong&gt; : check the PHP version in the control panel and contact your host if the fix has not been applied yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PHP 8.1 or older&lt;/strong&gt; : migrate to a supported branch, or check that your distribution has backported the fix into its package.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  While waiting for the fix
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enable, if possible, web application firewall (WAF) rules. Cloudflare, for example, added emergency rules. This is a temporary layer of protection, not a replacement for the update.&lt;/li&gt;
&lt;li&gt;Disable &lt;code&gt;expose_php&lt;/code&gt; so the PHP version does not appear in HTTP headers. This makes it harder for attackers to spot you, without fixing the flaw.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  After updating
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Monitor logs&lt;/strong&gt; and processes: a PHP process spawning a shell or system commands is a red flag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look for signs of compromise&lt;/strong&gt; on servers exposed before the fix: recent or unknown PHP files (webshells), new scheduled tasks, unusual outbound connections.&lt;/li&gt;
&lt;li&gt;If in serious doubt, &lt;strong&gt;rebuild the server&lt;/strong&gt; from a clean backup and rotate secrets (passwords, API keys, &lt;code&gt;.env&lt;/code&gt; file).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI has changed the scale of the problem
&lt;/h2&gt;

&lt;p&gt;The defect had been spotted as early as 2024 without a concrete exploitation path. Recent audits, backed by AI tools, revealed its real impact. According to Wiz, frontier AI models sharply reduced the effort needed to turn this old flaw into an exploit. The PHP Foundation also notes a sharp rise in reports, and points out that the language's security still relies on a handful of funded developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What now?
&lt;/h2&gt;

&lt;p&gt;Update your internet-facing servers first, then the rest. And ask yourself one simple question: how many of your servers still run a PHP version that will never receive another fix?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt; &lt;a href="https://thephp.foundation/blog/2026/10/21/todays-php-security-release-and-how-were-strengthening-php-security/" rel="noopener noreferrer"&gt;PHP Foundation&lt;/a&gt; · &lt;a href="https://laravel.com/forge/docs/knowledge-base/php-security-release-october-2026" rel="noopener noreferrer"&gt;Laravel Forge&lt;/a&gt; · &lt;a href="https://php-net.pro/fr/news/php-8-5-12-est-disponible-avec-des-correctifs-de-securite" rel="noopener noreferrer"&gt;php-net.pro&lt;/a&gt; · &lt;a href="https://watchtowr.com/intelligence/php-remote-code-execution-php2shell/" rel="noopener noreferrer"&gt;watchTowr&lt;/a&gt; · &lt;a href="https://patchstack.com/articles/php-major-vulnerability-alert-10-2026/" rel="noopener noreferrer"&gt;Patchstack&lt;/a&gt; · &lt;a href="https://www.helpnetsecurity.com/2026/10/21/php2shell-php-vulnerabilities-patched-cve-2026-109618-cve-2026-109619/" rel="noopener noreferrer"&gt;Help Net Security&lt;/a&gt; · &lt;a href="https://socradar.io/blog/php2shell-cve-2026-109618-cve-2026-109619/" rel="noopener noreferrer"&gt;SOCRadar&lt;/a&gt;&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>security</category>
      <category>php</category>
      <category>vulnerability</category>
    </item>
    <item>
      <title>With AI, staying in control of your architecture</title>
      <dc:creator>ArmelDev</dc:creator>
      <pubDate>Tue, 20 Oct 2026 10:00:04 +0000</pubDate>
      <link>https://dev.to/meledjearmel/with-ai-staying-in-control-of-your-architecture-50k3</link>
      <guid>https://dev.to/meledjearmel/with-ai-staying-in-control-of-your-architecture-50k3</guid>
      <description>&lt;p&gt;&lt;em&gt;I don't let AI decide how my projects are structured. I define it, and the AI follows. Well, most of the time.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sometimes it steps outside the frame: ignoring a principle, working around a design pattern, adding a layer nobody asked for. It's quickly fixed. But only because I know exactly what I expected.&lt;/p&gt;

&lt;p&gt;And that, to me, is where real control lies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture is decided before the first prompt
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg0n8utc7c185pb5mbad0.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg0n8utc7c185pb5mbad0.jpg" alt="A developer designs the project architecture before turning to AI" width="799" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before I open an assistant, I already know how the project is organized: where the business logic lives, how the layers communicate, which patterns I use and why.&lt;/p&gt;

&lt;p&gt;AI doesn't have that big picture. It answers what you show it: a file, a function, a question. If you don't give it the frame, it invents one. And that improvised frame changes from one answer to the next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture can't be delegated. It has to be passed on.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  AI follows… until it improvises
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2pdnuf9wc1528gf3dz76.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2pdnuf9wc1528gf3dz76.jpg" alt="A robotic arm places a block outside the planned structure" width="799" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even with clear instructions, AI sometimes drifts. It puts business logic in a controller instead of a service. It creates a useless abstraction. It adds a dependency for something three lines would have covered.&lt;/p&gt;

&lt;p&gt;Taken one by one, each of these deviations looks harmless. The code works. But as they pile up, they turn a coherent project into a patchwork that is hard to maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  You can only fix quickly what you have clearly defined
&lt;/h2&gt;

&lt;p&gt;Spotting a deviation requires a reference. If I know a given process must go through a service, I see immediately when the AI strays from it. Without that marker, the same code would look perfectly acceptable.&lt;/p&gt;

&lt;p&gt;That's why the rules must exist before generation: written conventions, a deliberate folder structure, named principles. The more explicit the frame, the faster the correction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How fast you correct depends on how clear your frame is.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  You are still the architect
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnytg3cl7og9yo9mic9b4.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnytg3cl7og9yo9mic9b4.jpg" alt="The developer holds the blueprint while the AI builds" width="799" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI speeds up writing code. It doesn't carry responsibility for its coherence.&lt;/p&gt;

&lt;p&gt;Reviewing, turning down a suggestion, simplifying what got overcomplicated, documenting decisions so they outlive the project: that's the work that keeps a codebase healthy over time.&lt;/p&gt;

&lt;p&gt;AI is an excellent builder. But the blueprint of the house stays in our hands.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;So, are you the one guiding the AI, or is it slowly drawing your architecture for you?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>ai</category>
      <category>architecture</category>
      <category>technology</category>
    </item>
    <item>
      <title>A good application doesn't start with code</title>
      <dc:creator>ArmelDev</dc:creator>
      <pubDate>Wed, 14 Oct 2026 08:06:42 +0000</pubDate>
      <link>https://dev.to/meledjearmel/a-good-application-doesnt-start-with-code-1d1b</link>
      <guid>https://dev.to/meledjearmel/a-good-application-doesnt-start-with-code-1d1b</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When you're a developer, it's natural to start a project with the technology.&lt;/p&gt;

&lt;p&gt;Which stack? Which architecture? Which database? Which API?&lt;/p&gt;

&lt;p&gt;These are important questions. But they often come too early.&lt;/p&gt;

&lt;p&gt;Before thinking about code, you need to understand &lt;strong&gt;what you're trying to build, for whom, and why&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;An application can be technically excellent yet solve the wrong problem.&lt;/p&gt;

&lt;p&gt;Conversely, a simple solution can have enormous value when it precisely meets a real need.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A good application starts with a problem to understand, not with code to write.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  01 — Start with the problem
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F294irgqfjxx3ixcu1arp.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F294irgqfjxx3ixcu1arp.jpg" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before drawing a screen or creating a database, one question must be clear:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What problem are we trying to solve?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A user generally doesn't think in features.&lt;/p&gt;

&lt;p&gt;They don't say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;« I need a dynamic form with conditional logic. »&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They say instead:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;« My sink is clogged. I need to find someone to help me. »&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This difference is fundamental.&lt;/p&gt;

&lt;p&gt;The product must understand the user's need, rather than asking them to understand how the product works.&lt;/p&gt;

&lt;h2&gt;
  
  
  02 — Complexity must belong to the system
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc11ige23s2keo8tpuubx.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc11ige23s2keo8tpuubx.jpg" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's a principle I place a lot of importance on:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Complexity must belong to the system, not to the user.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's take a simple example: a person wants to have their phone repaired.&lt;/p&gt;

&lt;p&gt;The system may need to know the brand, model, screen condition, battery, or whether the device powers on.&lt;/p&gt;

&lt;p&gt;But that doesn't mean you should immediately present ten fields to fill out.&lt;/p&gt;

&lt;p&gt;The user can simply write:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;« My Samsung fell and the screen no longer turns on. »&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The system must then transform this description into useful information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The user expresses their problem. The system gradually structures the information.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  03 — Design the journey before the screens
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsy8335hlresvf3p4364z.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsy8335hlresvf3p4364z.jpg" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another mistake is to start directly with the interface.&lt;/p&gt;

&lt;p&gt;We design a welcome screen, a form, a results page, a profile…&lt;/p&gt;

&lt;p&gt;But several coherent screens do not guarantee a coherent journey.&lt;/p&gt;

&lt;p&gt;I prefer to start with another question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What should happen between the moment the user expresses their need and the moment their problem is actually solved?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We can then represent the journey simply:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Need → understanding → qualification → matchmaking → choice → intervention → confirmation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each step must have a reason to exist.&lt;/p&gt;

&lt;p&gt;Each requested piece of information must also have a purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  04 — The MVP is not an incomplete application
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faa9u2ntgd3ljpe2myn7w.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faa9u2ntgd3ljpe2myn7w.jpg" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An MVP is not simply a large application from which features are removed.&lt;/p&gt;

&lt;p&gt;It's rather:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;the smallest version capable of validating an important hypothesis.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This sometimes means accepting not to build everything.&lt;/p&gt;

&lt;p&gt;Integrated payment? Later.&lt;/p&gt;

&lt;p&gt;Advanced automation? Later.&lt;/p&gt;

&lt;p&gt;Complex dashboard? Later.&lt;/p&gt;

&lt;p&gt;The initial goal is to build what allows us to verify that the product truly delivers value.&lt;/p&gt;

&lt;h2&gt;
  
  
  05 — Technology comes next
&lt;/h2&gt;

&lt;p&gt;Once the problem, journey, and scope are defined, technical choices become much simpler.&lt;/p&gt;

&lt;p&gt;We can then think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the architecture;&lt;/li&gt;
&lt;li&gt;the data;&lt;/li&gt;
&lt;li&gt;the business rules;&lt;/li&gt;
&lt;li&gt;the automations;&lt;/li&gt;
&lt;li&gt;artificial intelligence;&lt;/li&gt;
&lt;li&gt;scalability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Technology then becomes what it should be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;a means to build the product correctly, not the product itself.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is easy to fall in love with a technology.&lt;/p&gt;

&lt;p&gt;It is much more important to stay focused on the user's problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  06 — AI does not replace design
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcp67yktbtsxcnxcruqxm.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcp67yktbtsxcnxcruqxm.jpg" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Artificial intelligence today allows rapid generation of code, interfaces, or even architectures.&lt;/p&gt;

&lt;p&gt;But producing something quickly does not mean producing &lt;strong&gt;the right thing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;An AI can perfectly solve a poorly defined problem.&lt;/p&gt;

&lt;p&gt;That is why I consider AI a powerful tool for design and execution, but not a replacement for product thinking.&lt;/p&gt;

&lt;p&gt;First, you must know &lt;strong&gt;what to build&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Only then can AI help determine &lt;strong&gt;how to build it more efficiently&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  07 — Designing also means managing uncertainty
&lt;/h2&gt;

&lt;p&gt;In the real world, not all information is always available.&lt;/p&gt;

&lt;p&gt;The user may not know the answer.&lt;/p&gt;

&lt;p&gt;A situation can evolve.&lt;/p&gt;

&lt;p&gt;A professional may need to confirm certain information.&lt;/p&gt;

&lt;p&gt;A good system must be able to function despite this uncertainty.&lt;/p&gt;

&lt;p&gt;It should not necessarily block the user simply because information is missing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A well-designed product knows how to move forward even when all information is not yet known.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  08 — Code remains essential
&lt;/h2&gt;

&lt;p&gt;All of this obviously does not mean that development is secondary.&lt;/p&gt;

&lt;p&gt;Good design without good execution remains a good idea.&lt;/p&gt;

&lt;p&gt;Development turns journeys, rules, and product decisions into a real, reliable, and scalable system.&lt;/p&gt;

&lt;p&gt;But code must serve a clear intention.&lt;/p&gt;

&lt;p&gt;A few hours of design can sometimes prevent several days of unnecessary development.&lt;/p&gt;

&lt;h2&gt;
  
  
  09 — Building an application is building a system
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjpntduciynoqjgh9gegn.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjpntduciynoqjgh9gegn.jpg" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An application is not just an interface.&lt;/p&gt;

&lt;p&gt;Behind every screen there are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;users;&lt;/li&gt;
&lt;li&gt;data;&lt;/li&gt;
&lt;li&gt;rules;&lt;/li&gt;
&lt;li&gt;decisions;&lt;/li&gt;
&lt;li&gt;states;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>productdesign</category>
      <category>ux</category>
      <category>softwaredevelopment</category>
      <category>mvp</category>
    </item>
    <item>
      <title>A simple application for the user can be complex behind</title>
      <dc:creator>ArmelDev</dc:creator>
      <pubDate>Wed, 14 Oct 2026 08:06:30 +0000</pubDate>
      <link>https://dev.to/meledjearmel/a-simple-application-for-the-user-can-be-complex-behind-k44</link>
      <guid>https://dev.to/meledjearmel/a-simple-application-for-the-user-can-be-complex-behind-k44</guid>
      <description>&lt;h2&gt;
  
  
  Introduction — Visible simplicity often hides great complexity
&lt;/h2&gt;

&lt;p&gt;When an application is well designed, its use often seems obvious.&lt;/p&gt;

&lt;p&gt;The user clicks, provides some information and gets a result. They don’t need to understand what happens behind the scenes.&lt;/p&gt;

&lt;p&gt;Yet, this apparent simplicity can hide a large amount of logic, rules, and technical decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User-side simplicity is often the result of well‑managed system-side complexity.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What the user sees
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7hsdki4xb59hqkeope3x.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7hsdki4xb59hqkeope3x.jpg" alt="What the user sees" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The user generally sees only a small part of the application.&lt;/p&gt;

&lt;p&gt;They see an interface, some buttons, forms, and results. They simply expect to be able to accomplish their goal without having to think about the system’s internal workings.&lt;/p&gt;

&lt;p&gt;For example, to find a professional, they can simply describe their problem and submit a request.&lt;/p&gt;

&lt;p&gt;For them, the action is simple.&lt;/p&gt;

&lt;p&gt;And that is precisely what the user experience should aim to produce: &lt;strong&gt;a natural interaction, without unnecessary complexity.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What the system must handle
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs0rd58d12veh3yn8thiq.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs0rd58d12veh3yn8thiq.jpg" alt="What the system handles" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Behind this simple interaction, the system may have a lot of work to do.&lt;/p&gt;

&lt;p&gt;It must understand the provided information, determine what is relevant, apply business rules, verify available data, take constraints into account, and produce a coherent response.&lt;/p&gt;

&lt;p&gt;In some cases, it must also handle errors, missing information, various request states, or exceptional situations.&lt;/p&gt;

&lt;p&gt;The user does not need to know any of this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But the system, on the other hand, must be capable of handling it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Why shifting complexity to the user is a bad approach
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvaxlwfhulgkdygnapj6v.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvaxlwfhulgkdygnapj6v.jpg" alt="Do not shift complexity to the user" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A solution sometimes consists of directly asking the user for all the information the system needs.&lt;/p&gt;

&lt;p&gt;This may seem simpler to develop.&lt;/p&gt;

&lt;p&gt;But it often results in endless forms, incomprehensible technical choices, and additional steps.&lt;/p&gt;

&lt;p&gt;The problem is then shifted to the user.&lt;/p&gt;

&lt;p&gt;A user should not have to understand a product’s internal logic to be able to use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If the system is complex, it is not the user who should pay the price.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Designing complexity to make it invisible
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bzhj1pjfdue0d7s0taw.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bzhj1pjfdue0d7s0taw.jpg" alt="Make complexity invisible" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The real challenge is therefore to design this complexity so that it remains mainly behind the interface.&lt;/p&gt;

&lt;p&gt;This requires thinking about journeys, business rules, different scenarios, and the information truly needed at each step.&lt;/p&gt;

&lt;p&gt;Instead of asking for everything immediately, the system can gradually determine what it needs.&lt;/p&gt;

&lt;p&gt;Instead of exposing all possibilities, it can present only those relevant in the context.&lt;/p&gt;

&lt;p&gt;Thus, the developer’s job is not only to make a feature work.&lt;/p&gt;

&lt;p&gt;It also involves &lt;strong&gt;organizing complexity so that the user does not have to endure it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. A good product does not eliminate complexity: it handles it
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgaos1o8lnhu1nhuvcf17.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgaos1o8lnhu1nhuvcf17.png" alt="Complexity handled by the product" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Complexity is part of many digital products. It is rarely possible to eliminate it completely.&lt;/p&gt;

&lt;p&gt;The goal is rather to know &lt;strong&gt;where it should be placed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It can be in business rules, architecture, processing, validations, or internal mechanisms.&lt;/p&gt;

&lt;p&gt;But it shouldn't unnecessarily appear in every interaction with the user.&lt;/p&gt;

&lt;p&gt;A truly simple application is therefore not necessarily a technically simple application.&lt;/p&gt;

&lt;p&gt;It is often an application in which &lt;strong&gt;the complexity has been thought through enough to become invisible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And ultimately, it may be one of the developer's essential roles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;transform the system's complexity into simplicity for the user.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>userexperience</category>
      <category>productdesign</category>
      <category>simplicity</category>
    </item>
    <item>
      <title>When Should You Stop Adding Features?</title>
      <dc:creator>ArmelDev</dc:creator>
      <pubDate>Wed, 14 Oct 2026 08:05:49 +0000</pubDate>
      <link>https://dev.to/meledjearmel/when-should-you-stop-adding-features-592e</link>
      <guid>https://dev.to/meledjearmel/when-should-you-stop-adding-features-592e</guid>
      <description>&lt;h2&gt;
  
  
  Introduction — The temptation to keep adding more
&lt;/h2&gt;

&lt;p&gt;When designing an application, ideas never seem to run out. A new option, an additional dashboard, an automation, an integration… Every idea seems capable of improving the product.&lt;/p&gt;

&lt;p&gt;So we add one feature. Then another. And another, until the application becomes harder to understand, use, and maintain.&lt;/p&gt;

&lt;p&gt;Yet one question deserves to be asked before every new addition: &lt;strong&gt;does this feature genuinely bring value to the user?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The trap of a product that tries to do everything
&lt;/h2&gt;

&lt;p&gt;An application can gradually drift away from its original purpose. By trying to meet every possible need, it accumulates options, screens, and rules.&lt;/p&gt;

&lt;p&gt;User journeys become longer. Choices multiply. Some features are rarely used, yet they continue to weigh down both the interface and the codebase.&lt;/p&gt;

&lt;p&gt;The problem is not having lots of features. It is losing sight of which ones truly matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. A feature does not automatically add value
&lt;/h2&gt;

&lt;p&gt;An interesting idea is not automatically a priority. Before developing it, we need to understand what problem it solves, for whom, and in what situation.&lt;/p&gt;

&lt;p&gt;A feature can be technically impressive without being essential to everyday use. Conversely, a small improvement that removes an unnecessary step can transform the user experience.&lt;/p&gt;

&lt;p&gt;A product’s value is therefore not measured by the number of options it offers, but by its ability to help users achieve their goals.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Prioritizing means making choices
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvknwzplnw6nc49ciopkb.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvknwzplnw6nc49ciopkb.jpg" alt="Prioritizing features" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prioritizing is not simply about ranking a long list of requests. It means deciding what deserves to be built now, what can wait, and what perhaps should never be developed.&lt;/p&gt;

&lt;p&gt;For each idea, a few questions can help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What real need does this feature address?&lt;/li&gt;
&lt;li&gt;How often does this need arise?&lt;/li&gt;
&lt;li&gt;How does it contribute to the product’s main goal?&lt;/li&gt;
&lt;li&gt;What costs will it add in design, development, testing, and maintenance?&lt;/li&gt;
&lt;li&gt;Is there a simpler way to achieve the same result?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions do not always lead to an immediate answer. However, they force us to justify our choices instead of turning every suggestion into a development task.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The MVP brings us back to what matters
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpi9ihb53tkwjte6oahqt.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpi9ihb53tkwjte6oahqt.jpg" alt="Defining the MVP" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A minimum viable product (MVP) is neither a rushed version nor an application designed to frustrate users. It is a focused version that helps determine whether a solution addresses an important need.&lt;/p&gt;

&lt;p&gt;Its scope should be small enough to make progress and learn, yet coherent enough to deliver real value.&lt;/p&gt;

&lt;p&gt;Adding too many secondary features too early can delay the reality check: do users actually have this problem? Does the solution help them?&lt;/p&gt;

&lt;p&gt;Sometimes, it is better to launch a simple user journey, observe how people use it, and improve it based on concrete feedback than to spend months building every possibility we can imagine.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Saying no without closing the door to future improvements
&lt;/h2&gt;

&lt;p&gt;Rejecting a feature today does not mean it will never be useful. It simply means it may not be the right decision at this stage of the product.&lt;/p&gt;

&lt;p&gt;An idea can be saved for later, tested in the future, or replaced with a simpler approach. Needs evolve, and the product should evolve with them without losing sight of its purpose.&lt;/p&gt;

&lt;p&gt;The role of product design is not to anticipate every possibility from the outset. It is also to create a clear enough foundation for future decisions to be made at the right time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion — Do less, but do it better
&lt;/h2&gt;

&lt;p&gt;Adding a feature is often visible. Deciding not to add one can require even more thought.&lt;/p&gt;

&lt;p&gt;A good product is not one that responds to every request. It is one that understands its priorities and helps users accomplish what matters effectively.&lt;/p&gt;

&lt;p&gt;Before asking “What can we add?”, let’s get into the habit of asking: &lt;strong&gt;“What problem are we still trying to solve, and is this really the best way to solve it?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Product quality is built as much through the choices we make as through the features we decide to leave out.&lt;/p&gt;

</description>
      <category>productdesign</category>
      <category>ux</category>
      <category>softwaredevelopment</category>
      <category>mvp</category>
    </item>
    <item>
      <title>In the Age of AI, Being a Developer Means Knowing What to Build</title>
      <dc:creator>ArmelDev</dc:creator>
      <pubDate>Wed, 14 Oct 2026 08:03:03 +0000</pubDate>
      <link>https://dev.to/meledjearmel/in-the-age-of-ai-being-a-developer-means-knowing-what-to-build-k4a</link>
      <guid>https://dev.to/meledjearmel/in-the-age-of-ai-being-a-developer-means-knowing-what-to-build-k4a</guid>
      <description>&lt;h2&gt;
  
  
  Introduction — Code is no longer the only challenge
&lt;/h2&gt;

&lt;p&gt;With artificial intelligence, it is becoming easier to generate code, explore a language we know little about, or get help using a new framework. In just a few exchanges, we can get an initial implementation in a wide range of technologies.&lt;/p&gt;

&lt;p&gt;So, if AI can help us code in almost any language, what still makes a developer valuable?&lt;/p&gt;

&lt;p&gt;In my view, one question is becoming more important than the choice of technology: &lt;strong&gt;have we truly understood the need we are meant to address?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Knowing how to code is not enough to build the right product
&lt;/h2&gt;

&lt;p&gt;We can generate working code, create a compelling interface, and connect a database without actually solving the client’s real problem.&lt;/p&gt;

&lt;p&gt;A request may be framed as a list of features, while the real need lies elsewhere: saving time, reducing errors, simplifying a process, or gaining a better understanding of the business.&lt;/p&gt;

&lt;p&gt;If we move straight from the request to implementation, we risk building exactly what was asked for, but not necessarily what is useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. AI makes code more accessible, not decisions simpler
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqu6ymphx5smji9i5t39s.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqu6ymphx5smji9i5t39s.jpg" alt="AI makes it easier to produce code" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Programming assistants can explain a language, suggest an architecture, generate tests, or help fix an error. They speed up certain tasks and open up possibilities to more developers.&lt;/p&gt;

&lt;p&gt;But producing an answer quickly does not guarantee that it fits the context. The suggested code may overlook a business rule, mishandle an edge case, introduce a vulnerability, or become difficult to maintain.&lt;/p&gt;

&lt;p&gt;We therefore need to know how to read, question, test, and validate what we produce. AI can take part in the work; it does not remove the need to understand the result or take responsibility for its quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The real question comes before the technical choice
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frywn912nwamcgzennbn0.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frywn912nwamcgzennbn0.jpg" alt="Understand before building" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When facing a new project, we often instinctively start discussing the language, framework, database, or architecture. These decisions matter, but they should come after a first step: understanding the problem.&lt;/p&gt;

&lt;p&gt;Who faces this difficulty? In what situation? How is it handled today? What really needs to change? What constraints must we respect? And how will we know the solution works?&lt;/p&gt;

&lt;p&gt;The answers to these questions shape the product’s scope, its priority features, the user experience, and then the technical choices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The question is no longer just “Which technology will we use?” but “Do we understand the need well enough to choose the right solution?”&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Skill also means making the right trade-offs
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffuf4dbj4lmg8vepdmf8f.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffuf4dbj4lmg8vepdmf8f.jpg" alt="Making the right trade-offs" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As code production accelerates, our role does not disappear: it shifts further toward understanding, design, and decision-making. We need to distinguish what matters from what is unnecessary, choose an approach suited to the constraints, and anticipate the consequences of our decisions.&lt;/p&gt;

&lt;p&gt;The best solution is not always the most complex one, nor the one using the latest technology. It is the one that meets the need in a way that is reliable, understandable, and adaptable enough.&lt;/p&gt;

&lt;p&gt;A developer should not only ask whether they can build a feature. They should also ask whether it is necessary, whether it solves the right problem, and whether its cost is justified.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion — Understand before producing
&lt;/h2&gt;

&lt;p&gt;Artificial intelligence is changing our tools and the way we work. It can help us write code in a variety of languages and explore solutions more quickly. But it does not make understanding the need any less important. On the contrary, it makes that understanding even more decisive.&lt;/p&gt;

&lt;p&gt;Because it is possible to produce code faster than ever and be just as quick to get wrong what needed to be built.&lt;/p&gt;

&lt;p&gt;So before choosing a technology or asking AI to generate a feature, let’s take the time to ask the essential question: &lt;strong&gt;have we properly understood the problem we are trying to solve?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A developer’s value is not limited to the code they write. It is also measured by the relevance of the questions they ask, the decisions they make, and the quality of the solution they help build.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>ai</category>
      <category>productdesign</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
