<?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: Samuel Willows</title>
    <description>The latest articles on DEV Community by Samuel Willows (@user93390).</description>
    <link>https://dev.to/user93390</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%2F4035897%2F550b6ef1-a0aa-4c76-98b4-f2492800effb.jpg</url>
      <title>DEV Community: Samuel Willows</title>
      <link>https://dev.to/user93390</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/user93390"/>
    <language>en</language>
    <item>
      <title>The Problems with Modern Web Development</title>
      <dc:creator>Samuel Willows</dc:creator>
      <pubDate>Sun, 19 Jul 2026 02:59:16 +0000</pubDate>
      <link>https://dev.to/user93390/the-problems-with-modern-web-development-118c</link>
      <guid>https://dev.to/user93390/the-problems-with-modern-web-development-118c</guid>
      <description>&lt;p&gt;Before I critique modern web development, I want to make some points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I'm not discouraging anybody from web development.&lt;/li&gt;
&lt;li&gt;This is only my opinion and my experience of the story.&lt;/li&gt;
&lt;li&gt;Everyone has their own story.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Part 1. Javascript
&lt;/h2&gt;

&lt;p&gt;JavaScript is known for being the web's language. It's used everywhere in the web, and can also be used to make external applications outside of web development. JavaScript has many flaws in its language, such as its comparison logic. JavaScript uses the "strict equality operator" that tries to solve its weird type coercions (e.g [] == ![] being true). Another flaw is that JavaScript has poor maintainability. JavaScript has a poorly managed type system that introduces errors without proper error handling. You cannot explicitly define what error you're trying to catch in the try-catch statement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;functionThatThrowsError&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nx"&gt;MyError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of modern languages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;functionThatThrowsError&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MyError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;print&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error: ${e.message}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This adds complexity to try-catch statements and makes it almost impossible to handle errors in a robust manner. Another issue with JavaScript's maintainability is the wording of the language. JavaScript has two keywords called &lt;code&gt;undefined&lt;/code&gt; and &lt;code&gt;null&lt;/code&gt;. In practice these should mean the same thing but it doesn't. An undefined variable is an uninitialized variable, or a function that doesn't return anything. &lt;/p&gt;

&lt;p&gt;Undefined:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Returns undefined&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;// syntactically correct in JavaScript&lt;/span&gt;
&lt;span class="c1"&gt;// but will cause undefined &lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myCoolObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myCoolObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;property&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// still syntactically correct in JavaScript even though the property doesn't exist.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Null:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Returns a null name&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// output: null&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myCoolObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;property&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myCoolObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;property&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//output: null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Relying on these behaviors can cause your application or library to return unexpected results, leaving the code's true intent implicit.&lt;/p&gt;

&lt;p&gt;I'm not going to cover all the flaws of JavaScript into this one post, see more at &lt;a href="https://www.geeksforgeeks.org/JavaScript/advantages-and-disadvantages-of-javascript/" rel="noopener noreferrer"&gt;Geeksforgeeks&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 2. Ecosystem &amp;amp; Frameworks
&lt;/h2&gt;

&lt;p&gt;JavaScript is most notably known for having one of the largest ecosystems in the entire world. This ecosystem does come with a couple of concerns. One major concern is the severity of CVEs (Common Vulnerabilities and Exposures) JavaScript produces. One great example is CVE-2025-55182 which is:&lt;/p&gt;

&lt;p&gt;"A pre-authentication remote code execution vulnerability exists in React Server Components versions 19.0.0, 19.1.0, 19.1.1, and 19.2.0 including the following packages: react-server-dom-parcel, react-server-dom-turbopack, and react-server-dom-webpack. The vulnerable code unsafely deserializes payloads from HTTP requests to Server Function endpoints."&lt;/p&gt;

&lt;p&gt;&lt;em&gt;credit:&lt;/em&gt; &lt;a href="https://app.opencve.io/cve/CVE-2025-55182" rel="noopener noreferrer"&gt;&lt;em&gt;opencve&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Updating packages can solve this issue but on large enterprise applications, doing so could break code.&lt;br&gt;
Besides the ecosystem's security flaws, there are some awesome frameworks such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React (as mentioned)&lt;/li&gt;
&lt;li&gt;Vue&lt;/li&gt;
&lt;li&gt;Astro&lt;/li&gt;
&lt;li&gt;Svelte&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Personally, I use Vue because I like how fast and minimal it is. Vue brings other tools such as sass, postcss, typescript without reducing  performance. But these other options are respected in the community.&lt;/p&gt;

&lt;h2&gt;
  
  
  Runtime &amp;amp; Package managers
&lt;/h2&gt;

&lt;p&gt;Runtime is a critical part of web development. Depending on what runtime or framework you use, you may experience less performance or more. But even with optimized code, JavaScript has to painfully compile itself through a runtime like NodeJS. With lots of libraries and bad unoptimized DOM manipulation JavaScript can become really slow very fast.&lt;/p&gt;

&lt;p&gt;A JavaScript package manager is how you can install dependencies in your application. Some examples may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NPM&lt;/li&gt;
&lt;li&gt;Yarn&lt;/li&gt;
&lt;li&gt;Deno (w/ cross-compatibility)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NPM (Node package manager) is the flagship package manager for Node applications. Yarn is an alternative to NPM which offers faster speed &amp;amp; load times. Deno is a runtime but can still be a package manager since 2.0 that provides NPM integration. Deno allows you to store cache globally, not utilizing a &lt;code&gt;node_modules&lt;/code&gt; directory. When using any alternative package manager you are not dodging NPM vulnerabilities; you are still able to get affected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Critiquing Javascript (and it's tools) isn’t about tearing them down, it’s about understanding their limitations so we can write better &amp;amp; more secure software.&lt;/p&gt;

&lt;p&gt;What about you? What has your experience been like dealing with JavaScript's quirks or ecosystem vulnerabilities? Let me know in the comments below—I'd love to hear your story!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
    </item>
  </channel>
</rss>
