<?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: George</title>
    <description>The latest articles on DEV Community by George (@feketegy).</description>
    <link>https://dev.to/feketegy</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%2F117306%2Fdfb6a40c-8571-4035-90e6-18f028eb4468.png</url>
      <title>DEV Community: George</title>
      <link>https://dev.to/feketegy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/feketegy"/>
    <language>en</language>
    <item>
      <title>Technologies Change</title>
      <dc:creator>George</dc:creator>
      <pubDate>Sun, 23 Jun 2024 11:00:05 +0000</pubDate>
      <link>https://dev.to/primalskill/technologies-change-5hk</link>
      <guid>https://dev.to/primalskill/technologies-change-5hk</guid>
      <description>&lt;p&gt;I still remember dabbling with my father's first computer in the mid-90s when I was around 7 or 8 years old. Back then, the computer "unit" took up the space of a small desk, and the big CRT monitor was placed on top of the unit.&lt;/p&gt;

&lt;p&gt;My very first interaction with programming was when I opened a random exe file, saw a bunch of weird characters in the editor, and started editing it. To my surprise, the file didn't run anymore, so I edited more and more characters until, at one point, when I executed the file in the CLI, it turned the prompt green.&lt;/p&gt;

&lt;p&gt;That was the magic moment for me. After that point, I wanted nothing more than to sit in front of that IBM 80286 all day long and figure out what made that prompt switch to green; and then I discovered DOS BASIC.&lt;/p&gt;

&lt;p&gt;Fast forward to the early 2000s, I discovered web development with HTML4, CSS, JavaScript, and PHP v3. This journey continued until around 2010 when Node.js was released. In 2007 I founded my software development company, and then around 2015-ish, I had a client project requirement to be done in ReactJS on the front-end and Go on the back-end; and the rest is history.&lt;/p&gt;

&lt;p&gt;Along the way, I used almost all major programming languages in some form or another, either professionally or just as a hobby, ranging from C and Pascal in high school to Ruby, ASP, C#, modern PHP, Java, and the list could go on.&lt;/p&gt;

&lt;p&gt;My point is that in all these years, the technologies have changed radically, but more importantly, what remained constant were the &lt;a href="https://primalskill.blog/10-books-every-programmer-should-read"&gt;general programming principles I learned on my journey&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I wasn't using the same technologies in the 2010s as I was in the 2000s, and I'm not using the same tech now as I was a decade ago. If I had focused only on the technology, I would probably still be stuck in BASIC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I tell every developer I work with, to learn the general programming principles and they will be fine for the rest of their life.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you learn technologies instead of programming, you will become obsolete when (and not IF) that technology falls out of trend or is replaced by some AI automation.&lt;/p&gt;

&lt;p&gt;A decade ago my tech stack looked totally different than today and in the next ten years it will look radically different I'm 100% sure of it.&lt;/p&gt;




&lt;p&gt;Cover photo by &lt;a href="https://pixabay.com/users/seowoo_lee-21601663/"&gt;seowoo_lee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>learning</category>
      <category>softwaredevelopment</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Opinions After 20 Years of Software Development</title>
      <dc:creator>George</dc:creator>
      <pubDate>Wed, 12 Jun 2024 10:43:14 +0000</pubDate>
      <link>https://dev.to/feketegy/opinions-after-20-years-of-software-development-5cg7</link>
      <guid>https://dev.to/feketegy/opinions-after-20-years-of-software-development-5cg7</guid>
      <description>&lt;p&gt;Inspired by other articles I've read about various developers' opinions on software.&lt;/p&gt;

&lt;p&gt;These opinions formed along the way in my career that I wouldn't always agree with in the past, but that is called learning.&lt;/p&gt;

&lt;p&gt;So here's my list in no particular order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Have an open mind but also strong opinions:&lt;/strong&gt; People gather into tribes/camps on everything, like tabs vs. spaces, &lt;a href="https://primalskill.blog/a-brief-history-of-javascript-frameworks"&gt;JS vs. TS&lt;/a&gt;, etc. Having an open mind to new things is essential, but also strong opinions on things you know it's working, otherwise you will just drift with the flow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;There are no terrible programming languages:&lt;/strong&gt; They were created to solve problems, if you haven't faced that problem it doesn't automatically mean they are bad, it's just not the right one for your particular problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No such thing as right or wrong software:&lt;/strong&gt; only &lt;a href="https://primalskill.blog/wins-and-trade-offs-in-software"&gt;more or less fitting&lt;/a&gt; to the problem context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context switching does more damage than it seems:&lt;/strong&gt; Let developers develop. If you constantly interrupt them they will be much less performant. This includes setting up calls for every insignificant problem just to have a "face-to-face". 90% of things could be an e-mail or a Slack message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clients will lose focus on the bigger picture:&lt;/strong&gt; If the project is complex, there will come a time when those client calls are just &lt;a href="https://primalskill.blog/bikeshedding-in-software-engineering-teams"&gt;bikeshedding&lt;/a&gt; that will waste everybody's time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not everything is about work:&lt;/strong&gt; even if you love what you do, you must set up a healthy work-life balance. I love what I do with a passion, but I rarely do work stuff after 5 PM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://primalskill.blog/technologies-change"&gt;Technologies change&lt;/a&gt;:&lt;/strong&gt; I tell every dev I work with, to learn the general programming principles and they will be fine for the rest of their life. If you learn technologies instead of programming you will become obsolete when, and not if, that technology falls out of trend. 10 years ago my tech. stack looked totally different than today and in the next 10 years, I'm sure it will look radically different.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No FOMO:&lt;/strong&gt; It's nice to play with new technologies, but &lt;a href="https://primalskill.blog/how-to-keep-up-to-date-with-web-development"&gt;don't base your career on FOMO&lt;/a&gt;, like AI is the shiny new thing now, I do use it, and I play around with it, but I'm not jumping in head-first replacing my tech stack and approach to programming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross the bridge when you get there:&lt;/strong&gt; Don't write code toward inexistent scenarios. "What ifs" will miss the deadline every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code is the by-product of programming:&lt;/strong&gt; Software development is so much more than writing code, learn the other aspects of it. This is why metrics like LoC are useless and an anti-pattern. In my experience, writing code is 20% of the overall work that needs to be done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's human nature to be lazy:&lt;/strong&gt; A task will always fill out the time that is assigned to it. Lazy programming and coding practices should be nipped in the bud early on with a rather firm stance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Becoming bored is the leading cause of leaving a company:&lt;/strong&gt; when there's no end-sight to a task or a feature communications break down and boredom settles in. At first, devs. will go on auto-pilot and then switch jobs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boring and simple is always the right answer:&lt;/strong&gt; I would rather &lt;a href="https://primalskill.blog/on-writing-good-code"&gt;work with boring and simple technologies&lt;/a&gt; or projects than the new shiny things that don't get the job done or projects that will fade out of relevance very quickly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tooling is important:&lt;/strong&gt; Good tools that help you and other devs are important. If it's complicated to set up, nobody will use it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The more communication "choke points" the worse is the result:&lt;/strong&gt; If you can talk directly to somebody then do it. The more people in the communication chain the more problems and misunderstandings. It's like the game of Telephone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's a fine balance when asking for help:&lt;/strong&gt; What I want to hear from a dev is that they exhausted every possible avenue and can't move ahead, and only then ask for help. It's a &lt;a href="https://primalskill.blog/the-curse-of-software-knowledge"&gt;fine balance because devs could shy away very quickly from asking for help&lt;/a&gt; but also it's not productive to hold their hands on every minuscule thing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bet on the human:&lt;/strong&gt; Treat devs as humans and not "resources" and it will pay off in the long run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical interviews are almost useless:&lt;/strong&gt; Nobody can assess technical skills in this industry by doing 1 - 2 rounds of interviews. You could only have "some" idea. I would rather hire the individual with a paid internship for a couple of months to see if they are a good team fit, and this is also true from the developer's perspective. If the expectations are set upfront it's a win-win for everybody and there are no hard feelings if things don't align.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Processes are not important at the beginning&lt;/strong&gt;: only when you grow bigger do they become essential.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Junior devs will not be productive right away:&lt;/strong&gt; Depending on the onboarding processes, junior devs will need a couple of weeks to a few months before they can become productive on a project or team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The world is built on open source:&lt;/strong&gt; and it's &lt;a href="https://primalskill.blog/the-hamster-wheel-of-tech"&gt;hanging by a thin thread&lt;/a&gt;, that if breaks, will burn down this whole circus.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>softwaredevelopment</category>
      <category>learning</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>On Writing Good Code</title>
      <dc:creator>George</dc:creator>
      <pubDate>Sat, 01 Jun 2024 12:39:21 +0000</pubDate>
      <link>https://dev.to/primalskill/on-writing-good-code-3p3f</link>
      <guid>https://dev.to/primalskill/on-writing-good-code-3p3f</guid>
      <description>&lt;p&gt;Over the years I have realized that delivered code is light-years better than beautiful but useless code. This of course is not to belittle the "code artists" I look up to who have the mental capability to deliver "JIT code" that is also clean, beautiful, and reads like a good novel.&lt;/p&gt;

&lt;p&gt;So what about the rest of us? What can we do to make our code just that tiny bit better for our future selves and colleagues who will maintain it?&lt;/p&gt;

&lt;p&gt;I have gathered a few principles, North Stars if you will, to guide me along this journey, and the first is that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Programs must be written for people to read, and only incidentally for machines to execute. -- Hal Abelson&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Even though code will ultimately be interpreted and executed by machines, the code base itself should always be written with humans first in mind.&lt;/p&gt;

&lt;p&gt;I have never successfully got my way around in a code base that wasn't readable and the &lt;a href="https://primalskill.blog/wins-and-trade-offs-in-software"&gt;code architecture could easily be reasoned about&lt;/a&gt;. There's something beautiful when reading well-written code, the execution path flows in our mind like well-composed music.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A long descriptive name is better than a short enigmatic name. A long descriptive name is better than a long descriptive comment. -- Robert C. Martin&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are always two camps of people when we're talking about software, and the idea above is no exception. In the past developers and mentors always told new programmers to have small variable names, functions, and constants.&lt;/p&gt;

&lt;p&gt;This, like everything else, in programming is nuanced and can be interpreted in multiple ways. Yes, when variables don't have any meaningful underlying logic behind them and are ephemeral such as a counter variable in a loop, by all means, should have short names.&lt;/p&gt;

&lt;p&gt;Anything else should instantly let the reader know what it is about, a function called &lt;code&gt;UpdateProductStatusCode&lt;/code&gt; is leaps and bounds better than a function called &lt;code&gt;updProd&lt;/code&gt; or &lt;code&gt;upd_prod_st&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Also, the second part of the quote A long descriptive name is better than a long descriptive comment refers to the fact that if a developer has to write a long comment to explain what a function or code block is about is usually a "code smell" to refactor the code. Explaining complex code flows is still encouraged though, I like writing long comments to explain what a function does if the execution path is complicated.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Code is read more than it is written. -- Daniel Roy Greenfeld&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've written more about this concept in this &lt;a href="https://primalskill.blog/code-is-read-more-than-it-is-written"&gt;blog post here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This quote underlines the idea that the majority of developers' time is spent understanding code and only incidentally spending time writing code. I could argue that writing code is just a side effect of thinking deeply about a solution to a very specific software problem.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don't comment bad code, rewrite it. -- Brian Kernighan&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Commenting a badly written piece of code is lazy, but not everybody has the luxury of time to refactor code often, but nonetheless, everybody should strive for it.&lt;/p&gt;

&lt;p&gt;Production code is inherently messy and always in need of refactoring, commenting, and explaining why a poorly written function does what it does is always encouraged in my opinion when you don't have the necessary resources to improve it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In programming, boring and simple is always better than smart and complex. -- Rob Pike&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A straightforward and simple solution is always preferable because it is easier to understand, maintain, and debug. Simple code is more accessible to other developers who may need to work on it in the future, reducing the likelihood of introducing bugs or errors.&lt;/p&gt;

&lt;p&gt;Complex solutions, while they might seem clever or efficient, can introduce unnecessary complications, making the code harder to read or build on top of. Complex code can become a maintenance burden, as it needs more time to understand.&lt;/p&gt;

&lt;p&gt;I will always choose the &lt;a href="https://primalskill.blog/its-probably-fine"&gt;simple, boring, and battle-tested tech.&lt;/a&gt; over the latest and newest shiny thing as I mentioned at the beginning of this article that delivered code is better than beautiful code that misses the deadline.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>A Brief History of JavaScript Frameworks</title>
      <dc:creator>George</dc:creator>
      <pubDate>Fri, 29 Dec 2023 10:37:47 +0000</pubDate>
      <link>https://dev.to/feketegy/a-brief-history-of-javascript-frameworks-2g44</link>
      <guid>https://dev.to/feketegy/a-brief-history-of-javascript-frameworks-2g44</guid>
      <description>&lt;p&gt;&lt;em&gt;This article is inspired by Fireship's short video on web development.&lt;/em&gt;&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://www.youtube.com/shorts/aXcuz6fn8_w" rel="noopener noreferrer"&gt;
      youtube.com
    &lt;/a&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  JavaScript, The Programming Language
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxeyeiz5a5y4atl0qltuh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxeyeiz5a5y4atl0qltuh.jpg" alt="Old Dancing Baby"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;To start the article let me give you a very brief history lesson on JavaScript to understand why modern front-end development looks the way it does.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Netscape Communications Corporation, initially known as Mosaic Communications Corporation, was a pioneering American technology company that developed the first widely-used web browser, Netscape Navigator.&lt;/p&gt;

&lt;p&gt;In 1995, Netscape hired Brendan Eich with the goal of embedding the &lt;em&gt;Scheme&lt;/em&gt; programming language into its Netscape Navigator.&lt;/p&gt;

&lt;p&gt;However, within just 10 days of his hiring, Eich had &lt;em&gt;allegedly&lt;/em&gt; created a new programming language, initially named &lt;em&gt;Mocha&lt;/em&gt;, later renamed &lt;em&gt;LiveScript&lt;/em&gt;, and finally called &lt;em&gt;JavaScript&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Contrary to what the name suggests, &lt;em&gt;JavaScript&lt;/em&gt; has little to do with the &lt;em&gt;Java&lt;/em&gt; programming language. The naming decision was more of a marketing strategy since Java was gaining popularity at that time. In the late 1990s, Netscape attempted to standardize JavaScript through &lt;a href="https://ecma-international.org/" rel="noopener noreferrer"&gt;Ecma International&lt;/a&gt;, leading to the creation of the &lt;a href="https://ecma-international.org/publications-and-standards/standards/ecma-262/" rel="noopener noreferrer"&gt;ECMAScript standard&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Despite the ups and downs in JavaScript's history, including its battle with Microsoft during the &lt;em&gt;browser wars&lt;/em&gt;, more on that below, it has stood the test of time and is now one of the most popular programming languages in the world.&lt;/p&gt;

&lt;p&gt;Meanwhile, Netscape was acquired by AOL in 1999 and that was that, the product was discontinued in 2008.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Great Browser Wars
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtoevmnj2gjjg3xwa8h3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtoevmnj2gjjg3xwa8h3.gif" alt="Microsoft - you have no choice"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To understand what mess created that we tried to fix with more mess that we call modern front-end development we have to revert time all the way back to the mid-90s/early 2000s.&lt;/p&gt;

&lt;p&gt;You see, back in the early 2000s there wasn't much choice regarding browser flavors. You either used Netscape / Firefox or Microsoft Internet Explorer (IE), the former having the majority of market share in the high 90%.&lt;/p&gt;

&lt;p&gt;Safari and macOS (originally called Mac OS X) were just a blip on the radar no developer was taking seriously. I don't remember Safari having more than 0.5% market share in the early 2000s.&lt;/p&gt;

&lt;p&gt;Microsoft in the Gates &amp;amp; Ballmer era, but especially in the Gates era, was "very competitive" to say the least, and by "very competitive" I mean they simply annihilated any and all competition.&lt;/p&gt;

&lt;p&gt;The Web wasn't any different in Microsoft's eyes. Browsers weren't different from other commercial products, users had to &lt;strong&gt;buy&lt;/strong&gt; &lt;strong&gt;these applications&lt;/strong&gt; and install them on their PC.&lt;/p&gt;

&lt;p&gt;Microsoft wanted ALL the market share, so what they did was simply ship their browser, IE, with Windows as the default browser, so when users &lt;em&gt;"opened the Internet"&lt;/em&gt; it was IE shining back in their faces.&lt;/p&gt;

&lt;p&gt;As a response, Netscape tried to bundle their browser with other software that mainly ISPs provided to their customers, but Microsoft, being a behemoth, pulled the rug under their feet by requiring all 3rd party applications to be bundled with IE instead, making it a "required component for network access on Windows".&lt;/p&gt;

&lt;p&gt;Then they did whatever they were feeling like with the scripting languages in IE disregarding any standards other vendors were trying to come up with. It was either Microsoft's way or the highway, they simply did not care about web standards.&lt;/p&gt;

&lt;p&gt;If it were for Microsoft, we would all be using IE and VBScript today (even if I consider VBscript to be a more capable scripting language than JS back in the day).&lt;/p&gt;

&lt;p&gt;Oh, and they also reverse-engineered Netscape Navigator's scripting language that was JavaScript and called it &lt;em&gt;JScript&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In the end, Microsoft was found guilty of monopolizing the Web browser market and the verdict was that OS and browser must be two separate things and end users must be given the choice of using whatever browser they wanted.&lt;/p&gt;

&lt;p&gt;Between VBScript, JScript, and JavaScript, the latter won out simply because developers could use a single scripting language to develop for multiple browsers, but there was a time when a web page would use half-baked JavaScript and VBScript code intermingled in a large HTML mess.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: There were also many other scripting languages like PerlScript or ASP. Much like what WebAssembly is trying to solve today so developers can use any programming language on the client side and still be performant and cross-browser compatible.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  jQuery Was Born
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fez55terivm2dtgebv4yr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fez55terivm2dtgebv4yr.jpg" alt="What is jQuery"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the early 2000s, the Web was truly a wild-wild west place. There were many competing standards, and vendors still discovering how to "program" for the Web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If today's front-end development can be described as complex, back in the day it was chaotic and there weren't many online tutorials to turn to for help.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because of this, jQuery was created. Its original purpose was to expose a unified, cross-browser compatible API to the developers. You see, before jQuery if, for example, you wanted to listen to JS events you had to program it for at least two different "standards", if not more, to be cross-browser compatible.&lt;/p&gt;

&lt;p&gt;The code below is a tiny glimpse into the nightmare called web development circa 2005.&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;myEvent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click event&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;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventlistener&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;myEvent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&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;elem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;attachEvent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attachEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;onclick&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;myEvent&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;jQuery's execution was really good. Having a solid and simple API ironing out cross-browser compatibility issues so the developers don't have to, furthermore pioneering targeting browser features instead of browser user agents was a game changer.&lt;/p&gt;

&lt;p&gt;I remember first reading about jQuery on &lt;a href="https://www.quirksmode.org/" rel="noopener noreferrer"&gt;QuirksMode&lt;/a&gt; and was completely amazed at how simple was to work with. I only needed a single &lt;code&gt;script&lt;/code&gt; tag and boom, there it was, all my problems fixed, with a single line.&lt;/p&gt;

&lt;p&gt;It was an instant hit with web developers gaining mass adoption and driving a lot of modern web standards we love and use today. Let's not forget that jQuery still can be considered the &lt;a href="https://w3techs.com/technologies/overview/javascript_library" rel="noopener noreferrer"&gt;most widely used JavaScript framework today&lt;/a&gt; even though some say it's mostly thanks to WordPress.&lt;/p&gt;

&lt;p&gt;After "fixing" browser JS compatibilities the next step in jQuery's evolution was its plugin system. For the core to remain small, jQuery implemented a plugin system so developers could ship other library code and still use the goodies from jQuery; and what developers mainly created were reusable UI widgets like the famous &lt;a href="https://jqueryui.com/datepicker/" rel="noopener noreferrer"&gt;jQuery Datepicker&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backbone.js &amp;amp; AngularJS Entered the Chat
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9uh5344embx9piqwkoew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9uh5344embx9piqwkoew.png" alt="Coding Angular before it was easy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Backbone.js, released in 2010, was among the pioneers in bringing structure to client-side web applications and taking baby steps towards single-page applications (SPA).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some developers would argue that Backbone's more important role was kickstarting the philosophical shift towards front-end development.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not to take away the fame from the &lt;a href="https://en.wikipedia.org/wiki/YUI_Library" rel="noopener noreferrer"&gt;YUI Library&lt;/a&gt; which dabbled with the notion already.&lt;/p&gt;

&lt;p&gt;Before Backbone.js websites were delivered by a server-side application pushing HTML and CSS to the client-side browser and "progressively" enhancing the UX with JavaScript, hence the term "&lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement" rel="noopener noreferrer"&gt;progressive enhancement&lt;/a&gt;".&lt;/p&gt;

&lt;p&gt;As websites became more interactive, this necessitated keeping a client-side data model in sync with the server-side model and the DOM. Backbone.js addressed this need with a design built around an MVC-like (Model View Controller) architecture, thus marking a significant milestone in component-based web development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AngularJS&lt;/strong&gt;, on the other hand, is the brainchild of Google, first released in 2010, and subsequently, Angular 2+ from 2016 forward (collectively referred to as Angular), is not a library, unlike Backbone.js.&lt;/p&gt;

&lt;p&gt;Angular is a full-fledged, "feature-rich" JavaScript framework. It introduced the concept of “directives” (later implemented by Vue), which provided an elegant mechanism to extend the HTML syntax, thus allowing developers to create their custom HTML elements and an important concept in component-based development.&lt;/p&gt;

&lt;p&gt;With "directives", Angular enabled the creation of reusable components, a feature that would significantly enhance code maintainability and readability. So said the "marketing brochure".&lt;/p&gt;

&lt;p&gt;Ultimately, both Backbone.js and Angular started important conversations in the web development community about creating more efficient, maintainable, and scalable client-side applications, and starting the component-based web development "madness".&lt;/p&gt;

&lt;h2&gt;
  
  
  Transpiling With CoffeeScript
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmxltyquc8yuvz30crqcx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmxltyquc8yuvz30crqcx.jpg" alt="JS is not funny"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CoffeeScript's role in the evolution of JS frameworks is mainly attributed to the concept of "transpiling", in other words, the concept of source-to-source compilation; and it &lt;a href="https://news.ycombinator.com/item?id=1014080" rel="noopener noreferrer"&gt;was created by the same person&lt;/a&gt; who created Backbone.js.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=2037801" rel="noopener noreferrer"&gt;CoffeeScript's&lt;/a&gt; answer to developers who hated working with JS at this point and managing all the quirks and intricacies of the language is to create a new language altogether and then transform that language into JavaScript to be able to be used in browsers.&lt;/p&gt;

&lt;p&gt;Beyond easier syntax, the advanced features of CoffeeScript, such as destructuring assignments, classes, and array comprehension, have significantly simplified the process of building web components and ultimately these features found their way back into modern JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Node.js, JS Goes in the Upside Down
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe4cpdquaxe9ujpyocx48.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe4cpdquaxe9ujpyocx48.jpg" alt="Heaviest element in the Universe"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I think that Node.js was the fuel on the slow-burning fire that started the fast-paced development of client-side technologies and the adoption of the many modern JavaScript standards that we have today.&lt;/p&gt;

&lt;p&gt;Prior to Node.js, JavaScript was essentially a client-side language used for adding interactivity to web pages. Web developers had little to work with in terms of tooling for JS development, mostly relying on web browsers for runtime execution, and often resorting to manual code minification and concatenation by using other server-side technologies.&lt;/p&gt;

&lt;p&gt;The advent of Node.js brought JavaScript to the server-side, enabling developers to execute JavaScript outside the context of a browser.&lt;/p&gt;

&lt;p&gt;Even though the original premise (and proof) of Node.js is that JavaScript can be used anywhere, promising a more streamlined web development workflow, optimize code, catch errors, and automate repetitive tasks by using the same programming language on both server- and client-side, in fact, it kickstarted the exact opposite trend. &lt;em&gt;After all, it's not Node's fault how people are using the technology.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Node.js provided a platform for developing such tools, resulting in a rich ecosystem of packages like Grunt, Gulp, Webpack, Babel, and others.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arguably the second biggest innovation of Node.js was its package manager, NPM which drastically simplified the installation and distribution of JavaScript libraries and tools.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  React &amp;amp; the Descent Into Tooling Madness
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffqhm2b9l1heqvjlmod42.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffqhm2b9l1heqvjlmod42.jpg" alt="Developers at work"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now, we have arrived in full SPA, interactive, rich-web, enhanced to the gills mode web app territory and I believe React needs no introduction.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React, even though it didn't pioneer the complicated ecosystem we have around front-end development today, it sure influenced how we do things the &lt;em&gt;React way&lt;/em&gt;™.&lt;/p&gt;

&lt;p&gt;With the ever-more need to create highly interactive and performant web applications more and more tooling was created around module-based JavaScript code and the &lt;a href="https://primalskill.blog/how-to-keep-up-to-date-with-web-development" rel="noopener noreferrer"&gt;FOMO&lt;/a&gt; of tech engineering leads somewhat resulted in what we have today.&lt;/p&gt;

&lt;p&gt;My first introduction to React was in 2014-2015 when my team was outsourcing for a Silicon Valley client where the tech leads were fully sold on the early React Flux Architecture.&lt;/p&gt;

&lt;p&gt;I remember being adamantly against JSX echoing the larger web development community's voice: &lt;em&gt;"How could any sane developer embed HTML into JavaScript?!".&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But there it was, HTML in JS, then CSS in JS, and then as with many things in web development &lt;strong&gt;&lt;em&gt;you have to learn to love it&lt;/em&gt;&lt;/strong&gt;. Managing the application state in the browser and then reacting to it is all the rage now.&lt;/p&gt;

&lt;p&gt;React started and Vue continued the shift towards JavaScript-centric development by encouraging developers to write everything in JavaScript, including markup language and styles advocating "create once, use it anywhere" components, or at least that was the promise. React took it even further with React Native, the ambitious promise of using everything everywhere, including mobile, and writing it only once.&lt;/p&gt;

&lt;p&gt;React also fueled the trend of this &lt;a href="https://primalskill.blog/the-ikea-effect-in-software-development" rel="noopener noreferrer"&gt;&lt;em&gt;front-end feedback loop&lt;/em&gt;&lt;/a&gt; where more and more tooling and JS modules are created every day to further improve or fix the downsides of major JS frameworks that everybody decided to use not questioning whether it made sense to use the way it was intended to be used.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: If you have an hour, go watch the&lt;/em&gt; &lt;a href="https://www.youtube.com/watch?v=8pDqJVdNa44" rel="noopener noreferrer"&gt;&lt;em&gt;React.js Documentary&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Yes, it's good filming and production.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TypeScript &amp;amp; The Botched Type Surgery
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4giazuxyjq9vjhttbudn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4giazuxyjq9vjhttbudn.jpg" alt="TypeScript surgery"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just like CoffeeScript, TypeScript is a source-to-source programming language and not a JS framework, but plays a pivotal role in the evolution of these frameworks.&lt;/p&gt;

&lt;p&gt;At least that's what Microsoft and many thousands of developers are advocating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't get me wrong, type safety in a programming language is paramount, but I'm not fully onboard with bolting types on top of a language where dynamic types are intended to be a feature and not a bug.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;In this regard, I agree with DHH on the&lt;/em&gt; &lt;a href="https://world.hey.com/dhh/turbo-8-is-dropping-typescript-70165c01" rel="noopener noreferrer"&gt;&lt;em&gt;false promises&lt;/em&gt;&lt;/a&gt; &lt;em&gt;of TypeScript and why it makes sense&lt;/em&gt; &lt;a href="https://world.hey.com/dhh/open-source-hooliganism-and-the-typescript-meltdown-a474bfda" rel="noopener noreferrer"&gt;&lt;em&gt;not to use it in their products&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Before TypeScript came into play, JavaScript was known for its difficulty to manage in large-scale projects, and not just mainly because of the lack of static types. However, the lack of static typing doesn't make the language better and it made debugging and maintaining code increasingly complex as a project grew in size.&lt;/p&gt;

&lt;p&gt;TypeScript also offers powerful features like interfaces, enum types, and optional parameters that are absent in JavaScript but can be important to "taming the beast" in more complex JS projects.&lt;/p&gt;

&lt;p&gt;Also, TypeScript provides developer tooling that enables more accurate autocompletion, refactoring capabilities, and more (also, autocompletion and lint rules can be set up and just use &lt;a href="https://jsdoc.app/" rel="noopener noreferrer"&gt;JSDoc&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But TypeScript is essentially an additional layer on top of JavaScript, introducing a level of complexity and overhead that may not be required or suitable for every project or development team.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Although TypeScript provides a wide range of enhancements, it comes at the cost of needing to learn an entirely new language with its syntax, rules, and best practices. Not to mention figuring out type rules that other JS frameworks have implemented. For smaller projects or teams, this may prove to be a significant deterrence.&lt;/p&gt;

&lt;p&gt;TypeScript requires developers to annotate their variables, function returns, and arguments with their types. While this can make code easier to read and debug in large projects, it can slow down development. In other words, the very feature that makes TypeScript awesome in large-scale projects can turn into a horrible nightmare for smaller ones oftentimes reverting back to JavaScript is more productive.&lt;/p&gt;

&lt;p&gt;At the end of the day what TypeScript did is to &lt;a href="https://github.com/sirisian/ecmascript-types" rel="noopener noreferrer"&gt;start the conversation of having opt-in static types&lt;/a&gt; in JS maturing the language, which is awesome.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sunshine and Rainbows With Svelte
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkv636d7r6fb14v127obq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkv636d7r6fb14v127obq.jpg" alt="Riding into the sun"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By now every front-end developer has had it with the JS ecosystem. This is where Svelte enters the picture.&lt;/p&gt;

&lt;p&gt;One of the primary problems SvelteJS is trying to solve is the &lt;a href="https://primalskill.blog/bikeshedding-in-software-engineering-teams" rel="noopener noreferrer"&gt;unnecessary bloating&lt;/a&gt; that results from the usage of "traditional" frameworks, because by now React, Angular, and even Vue are considered "traditional" and conventional.&lt;/p&gt;

&lt;p&gt;Another area that Svelte is trying to amend is the steep learning curve presented by other frameworks and libraries. While frameworks such as React or Angular offer great power and flexibility, they can be overwhelming for beginners due to their complexity. Svelte, in contrast, is developed to be much more intuitive and easy to grasp. With its simpler syntax and less boilerplate code, developers with only a basic understanding of HTML, CSS, and JavaScript can become proficient in using Svelte in a relatively short time.&lt;/p&gt;

&lt;p&gt;Svelte can also be considered to be a programming language that compiles HTML-, CSS-, and JS-like code instead of a parser that parses regular HTML/CSS/JS.&lt;/p&gt;

&lt;p&gt;If we think about Svelte as a programming language then the code we write is a separate language that happens to look like HTML, CSS, and JS, but it's not. This is why Svelte goes into &lt;code&gt;devDependencies&lt;/code&gt; because we don't need any of Svelte's code in production in contrast with React and others.&lt;/p&gt;

&lt;p&gt;Typically, with traditional JavaScript frameworks, the client's browser must load the entire JavaScript bundle, parse, compile, and execute it before the user can interact with the application. This process can be slow and negatively impact the user experience, particularly on mobile or slow networks. SvelteJS solves this problem by doing the heavy lifting during the build process.&lt;/p&gt;

&lt;p&gt;Svelte, unlike React, is much more opinionated on how to do things which is not necessarily a bad thing. This is most notably can be seen in SvelteKit.&lt;/p&gt;

&lt;p&gt;Also, Svelte is one of the major frameworks that started talking about the place of MPAs (multi-page applications) in client-side development. Before that MPAs were considered this antiquated development method that no developer would use, &lt;strong&gt;ever&lt;/strong&gt; (wink, wink).&lt;/p&gt;

&lt;p&gt;Still, Svelte tries to &lt;a href="https://primalskill.blog/the-black-box-of-software-development" rel="noopener noreferrer"&gt;shine a beacon of hope&lt;/a&gt; in the muddy waters of broken front-end development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Htmx Deployed to the Front
&lt;/h2&gt;

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

&lt;p&gt;Okay, we are slowly coming full circle.&lt;/p&gt;

&lt;p&gt;If you never heard of htmx I don't blame you. It's a relatively new JS framework (at least its modern iteration), more like a paradigm shift from modern front-end development.&lt;/p&gt;

&lt;p&gt;While CoffeeScript, TypeScript, and Svelte all try to fix JavaScript by using something similar to JS, but only &lt;em&gt;the good parts&lt;/em&gt;™ then converting the whole thing into JS, the creator of htmx wants to start from scratch by not using JS altogether.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Alright, the above paragraph is not a fact, but it's funny nonetheless.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Htmx essentially lets web developers access AJAX, CSS Transitions, WebSockets, JS Events, and SSEs (server-sent events) directly in HTML without needing to write JavaScript (okay, some JS). It introduces a new approach (okay, it's not entirely new) to enhancing web apps by seamlessly transforming static HTML into dynamic content.&lt;/p&gt;

&lt;p&gt;Unlike other heavy JavaScript frameworks, htmx aims to shift the balance of responsibilities, taking a simpler approach to web development. By allowing developers to execute common dynamic UI interactions directly in HTML with its extensive attributes, or some would say directives, it significantly reduces the dependency on JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This reaffirms the principle of progressive enhancement in web development&lt;/strong&gt;, where HTML and CSS handle the foundation and layout, while JavaScript is kept lightweight and used for added interactivity when needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's worse is that htmx is annoyingly simple.&lt;/strong&gt; It's worse that we had to descend into slow madness to see the light at the end of the front-end development tunnel when there wasn't any tunnel nor pitch-black darkness because the techniques used by htmx were always there, invented by others decades ago.&lt;/p&gt;

&lt;p&gt;Through the use of backend languages, developers are allowed to build and modify their applications and keep data and state on the backend where it should be, whilst keeping the UI dynamic and responsive on the frontend where it should be.&lt;/p&gt;

&lt;p&gt;Ultimately this is a good thing because young developers will discover the true joys of front-end web development by not using modern JS frameworks at all, and this is not to say that React, Vue, Svelte, and Angular will vanish into thin air anytime soon. Baby steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full-stack devs are back baybieeee...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6tne1bldhq06rpb8o7r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6tne1bldhq06rpb8o7r.jpg" alt="New kids on the block"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Notable Exceptions
&lt;/h2&gt;

&lt;p&gt;I know I skipped many notable web technologies such as Alpine, Astro, Babel, Bun, Dojo, EmberJS, Esbuild, ES6, ExtJS, Express, Gatsby, GraphQL, Jamstack, KnockoutJS, Lit, MeteorJS, MERN, MooTools, Next, Nuxt, Parcel, Polymer, Preact, PWAs, Remix, REST, RollupJS, Rome, Ruby on Rails, RxJS, SproutCore, Sass, Skypack, Snowpack, SolidJS, Stencil, Stylex, Vite, Vue, Zig, and others... that all contributed to modern front-end development in some shape or form.&lt;/p&gt;

&lt;p&gt;The main reasons are that &lt;strong&gt;&lt;em&gt;1)&lt;/em&gt;&lt;/strong&gt; I can't cover everything, &lt;strong&gt;&lt;em&gt;2)&lt;/em&gt;&lt;/strong&gt; a lot of technologies have overlapping ideas, and finally &lt;strong&gt;&lt;em&gt;3)&lt;/em&gt;&lt;/strong&gt; I'm not that familiar with a lot of these technologies to have a sensible opinion about them.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>learning</category>
    </item>
    <item>
      <title>About Logging</title>
      <dc:creator>George</dc:creator>
      <pubDate>Sat, 21 Oct 2023 15:51:11 +0000</pubDate>
      <link>https://dev.to/primalskill/about-logging-1b2p</link>
      <guid>https://dev.to/primalskill/about-logging-1b2p</guid>
      <description>&lt;p&gt;This blog post will be about the DOs and DON'Ts of code logging I picked up along the way in my coding career.&lt;/p&gt;

&lt;p&gt;I don't have to emphasize the importance of logging, if you think that logging is not important at all, you should stop reading now. 😀&lt;/p&gt;

&lt;h2&gt;
  
  
  First off, the DOs and DON'Ts
&lt;/h2&gt;

&lt;p&gt;This is a quick list, a "cheat sheet" if you will, which I will expand on down below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DO log your program output to &lt;code&gt;stderr&lt;/code&gt;. This is meant for both errors and diagnostics, logs are classified as "diagnostic messages of a program".&lt;/li&gt;
&lt;li&gt;DO ensure the only place you're logging your program output to is &lt;code&gt;stderr&lt;/code&gt;, not a file, a DB, or a third-party service.&lt;/li&gt;
&lt;li&gt;DO adhere to structured logs. JSON is the go-to format for a majority, but if you're working with simple logs, &lt;a href="https://brandur.org/logfmt"&gt;logfmt&lt;/a&gt; works fine too.&lt;/li&gt;
&lt;li&gt;DO play around with log levels. The default level should be set to &lt;code&gt;INFO&lt;/code&gt; in production and &lt;code&gt;DEBUG&lt;/code&gt; in development.&lt;/li&gt;
&lt;li&gt;DO NOT log sensitive details such as PII data - stick to using IDs (e.g. user ID).&lt;/li&gt;
&lt;li&gt;DO NOT log and handle an error simultaneously.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Logging to stderr
&lt;/h3&gt;

&lt;p&gt;No matter the log level, it should be streamed to &lt;code&gt;stderr&lt;/code&gt;. From the docs on &lt;code&gt;stderr&lt;/code&gt; it reads like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Under normal circumstances every UNIX program has three streams opened for it when it starts up, one for input, one for output, and one for printing diagnostic or error messages.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Logs are diagnostics and are not necessarily meant to be consumed by the end user of the program.&lt;/p&gt;

&lt;p&gt;Keep in mind that many production systems do not adhere to this original POSIX standard though, and it's fine as long as the output stream is consistent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Log to stderr and nowhere else
&lt;/h3&gt;

&lt;p&gt;It's not the job of your program to log to a file, to a database, or to a 3rd party service. You will be making your program more complex if you do.&lt;/p&gt;

&lt;p&gt;Of course, there are exceptions, when for example logging to the standard streams is not possible.&lt;/p&gt;

&lt;p&gt;In all other cases, let other tools handle that for you, such as a log scraper that will send the logs to a Grafana, Loki, Datadog, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adhere to structured logging
&lt;/h3&gt;

&lt;p&gt;Structured logs are way easier to process by other machines than by humans, and this is the point exactly.&lt;/p&gt;

&lt;p&gt;You don't need to drill down into every log line separately, but to have an aggregate overview of the logs that your program is emitting based on which you can make meaningful decisions.&lt;/p&gt;

&lt;p&gt;Use JSON because it is widely used. I haven't encountered a log management service that doesn't support JSON, but if you like other formats, like XML or logfmt, then use those as long as you are consistent. Pick one format and adhere to it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Log levels
&lt;/h3&gt;

&lt;p&gt;This is a tricky one. Every developer has an opinion on which log levels should be used.&lt;/p&gt;

&lt;p&gt;I personally found that most programs do not need more than three levels which are &lt;code&gt;INFO&lt;/code&gt;, &lt;code&gt;ERROR&lt;/code&gt;, and &lt;code&gt;DEBUG&lt;/code&gt;. Not even &lt;code&gt;DEBUG&lt;/code&gt; is necessary in most cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So let me explain these levels:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;DEBUG&lt;/code&gt;: This should be default in development, this level is only enabled in production as a last resort, if everything else fails, which is also a good opportunity to improve on log messages. Usually, metrics and development events are logged on this level.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;INFO&lt;/code&gt;: Represents normal operation with sufficient metadata like, "user_id added record into DB", but not as exhaustive as DEBUG. Anything that helps you pinpoint the execution flow of your program.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ERROR&lt;/code&gt;: Usually, indicates an error that cannot be recovered from, e.g. "cannot insert data into the db", and with enough metadata that you can reconstruct the error when debugging.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You don't need these log levels:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;WARNING&lt;/code&gt;: these are basically INFO logs with a label attached to it. They are definitely not ERROR logs, but it's something that you should keep an eye on, e.g. "database query took 3 seconds", above the threshold considered normal. It could signal a lot of things out of the ordinary.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NOTICE&lt;/code&gt;, &lt;code&gt;FATAL&lt;/code&gt;, &lt;code&gt;ALERT&lt;/code&gt;, &lt;code&gt;CRITICAL&lt;/code&gt;, etc.: are all just semantics of either INFO or ERROR where a label would suffice, e.g. "INFO alert message alert=true".&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do not log sensitive data
&lt;/h3&gt;

&lt;p&gt;I can't state the obvious. Not one system is 100% hackproof.&lt;/p&gt;

&lt;p&gt;Logging sensitive data such as names and OMG, passwords is creating yet another attack vector.&lt;/p&gt;

&lt;p&gt;The best way to filter out sensitive data is to have an &lt;a href="https://en.wikipedia.org/wiki/Extract,_transform,_load"&gt;ETL (Extract-Transform-Load)&lt;/a&gt; function execute on the log messages before it is written to the destination stream.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do not handle errors and log them too
&lt;/h3&gt;

&lt;p&gt;Logging an error means you handled it. You either handle the error or log it if it's an unrecoverable error.&lt;/p&gt;

&lt;p&gt;For example, if a database insert fails, the code could retry the query like two more times, that's handling it. If the insert fails every time, the code should log that so somebody can inspect it later on.&lt;/p&gt;

&lt;p&gt;If you handle the error (e.g. retry the insert query) and log it too, that log line will be meaningless to whoever is analyzing the logs, because ultimately it wasn't an error that the program couldn't recover from.&lt;/p&gt;

&lt;h2&gt;
  
  
  The art of writing good logs
&lt;/h2&gt;

&lt;p&gt;Answering a few questions each time you wish to write a log line in your code is a good way to think about whether it's worth writing that log or not.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Can the event be reproduced from the logs?&lt;/strong&gt; If the event, be it a warning or an error, cannot be reproduced just from the logs it's not worth logging. For example, "cannot update table". Which table? Where in the code? What data was used?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Are the logs rich with enough metadata to understand what happened?&lt;/strong&gt; This is why structured logging is so important, that you can attach metadata to each log. Example of a bad log: "fetching data from URL failed", but doesn't include which URL, nor what request variables were sent. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can multiple log lines be correlated?&lt;/strong&gt; This is most prevalent in Web API services where multiple requests could be happening at the same time, making the log lines intertwined with each other. It is a good practice to attach a so-called "request_id" to individual logs so that you can track down and correlate these logs later on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the error clear just by reading the error logs?&lt;/strong&gt; The example above, "cannot update table", while it is a simple message, it's not clear. It does not help in any way, it can even be considered noise. A better message would be "cannot update table user_photos: user does not have access to group" with metadata such as &lt;code&gt;group_id: 123&lt;/code&gt; and &lt;code&gt;user_id: 456&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is it clear from the log when and where the event occurred?&lt;/strong&gt; A program execution can take many code paths that could result in the same error. For example, multiple functions can update the same database table. Do you know which code section resulted in an error and do you know when the error occurred? Save a timestamp and the "file:line" location with every log, like: "cannot update table user_photos" metadata &lt;code&gt;t=1697880685&lt;/code&gt; and &lt;code&gt;user_group_photos.php:38&lt;/code&gt; or separate it like &lt;code&gt;filename=user_group_photos.php&lt;/code&gt;, &lt;code&gt;line=38&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Individual log lines vs wide events
&lt;/h2&gt;

&lt;p&gt;There has always been a debate on whether log lines or wide events are a better choice.&lt;/p&gt;

&lt;p&gt;Every function follows an execution path. The question is do you emit multiple logs along this path or one big one at the end of the execution?&lt;/p&gt;

&lt;p&gt;In my experience, generally, individual log lines find their utility in CLI applications, where the execution path is small and clear enough, while web projects or request/response-based applications prefer wide events, enriched with metadata added throughout the execution path resulting in a single log line emitted at the end of the execution path.&lt;/p&gt;

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

&lt;p&gt;There you have it. My thoughts on the "art and science" of logging.&lt;/p&gt;

&lt;p&gt;It's not just about jotting down what your program is up to but analyzing it so you can make clear decisions about what to improve in your code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After all, what is a log good for if nobody reads it?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>softwaredevelopment</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Software Outsourcing Part 2: Myths and Truths</title>
      <dc:creator>George</dc:creator>
      <pubDate>Fri, 04 Aug 2023 06:52:06 +0000</pubDate>
      <link>https://dev.to/primalskill/software-outsourcing-part-2-myths-and-truths-3gph</link>
      <guid>https://dev.to/primalskill/software-outsourcing-part-2-myths-and-truths-3gph</guid>
      <description>

&lt;p&gt;&lt;em&gt;This article was originally published on &lt;a href="https://primalskill.blog/software-outsourcing-part-2-myths-and-truths"&gt;https://primalskill.blog/software-outsourcing-part-2-myths-and-truths&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For Part 1 see: &lt;a href="https://primalskill.blog/software-outsourcing-part-1-types-pros-and-cons"&gt;https://primalskill.blog/software-outsourcing-part-1-types-pros-and-cons&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Many C-level managers tasked with finding cost optimizations within their organization have a fear of outsourcing companies because of their lack of knowledge about outsourcing and hearing many "horror" stories about various companies.&lt;/p&gt;

&lt;p&gt;In this article, I will shed light on some of the myths and truths about software outsourcing. Let's start with the myths first as these are the most compelling ones and the biggest blockers for any prospective client to jump on board.&lt;/p&gt;

&lt;h2&gt;
  
  
  Myth: The software product will be of lower quality
&lt;/h2&gt;

&lt;p&gt;Software outsourcing companies ARE software development companies and the quality of code they produce can vary greatly. A US-based development team, which is usually not outsourcing, can produce code just as badly as a team from Bangladesh.&lt;/p&gt;

&lt;p&gt;There's absolutely no basis for this claim, which is more likely an unfounded fear from managers looking into outsourcing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Myth: You can't get to market quickly by outsourcing the product
&lt;/h2&gt;

&lt;p&gt;It's true that managing a remote team of any kind is more complex than an on-site dedicated one, but getting to market is not dependent on the outsourcing nature or the location of the team.&lt;/p&gt;

&lt;p&gt;A well-built team comprised of expert developers can just as easily get a product to market as any other team, the key is to manage expectations correctly.&lt;/p&gt;

&lt;p&gt;The perception that outsourcing cannot deliver a fast go-to-market process is a myth that stems from inadequate planning and communication, rather than the intrinsic nature of the outsourcing model.&lt;/p&gt;

&lt;p&gt;Through the use of offshore development centers, outsourcing can provide round-the-clock development support, thereby shortening the development cycle, improving product quality, and accelerating time to market.&lt;/p&gt;

&lt;h2&gt;
  
  
  Myth: Developers will steal your code and idea
&lt;/h2&gt;

&lt;p&gt;The right to the codebase, just as any other asset of a company is dictated by the terms of NDA contracts and intellectual property rights.&lt;/p&gt;

&lt;p&gt;Most outsourcing companies, just like any other company, have robust legal frameworks in place, and they respect the intellectual property rights of their clients.&lt;/p&gt;

&lt;p&gt;Due diligence needs to be carried out though, background checks of the company, what kind of legal framework the country has for outsourcing where the company is registered.&lt;/p&gt;

&lt;p&gt;BUT to build trust and establish a long-term partnership, a professional and well-reputed outsourcing provider relies heavily on its reputation, which means it will keep its clients' code and ideas completely confidential.&lt;/p&gt;

&lt;h2&gt;
  
  
  Myth: Language barrier of outsourcing teams
&lt;/h2&gt;

&lt;p&gt;It is a common myth that outsourcing software development to a team in another country will result in a significant language barrier.&lt;/p&gt;

&lt;p&gt;Many outsourcing companies, including my company, employ English as their primary business language and require their employees to be proficient in it.&lt;/p&gt;

&lt;p&gt;Teams also often have a dedicated project manager or team leader who acts as a liaison with the client and ensures effective communication cutting down the unnecessary "communication barriers" between many people.&lt;/p&gt;

&lt;h2&gt;
  
  
  Myth: Outsourcing will cut down costs
&lt;/h2&gt;

&lt;p&gt;A huge misunderstanding most of our clients make is to think that outsourcing development is dirt cheap and soon realize that development is indeed like any other service, you get what you paid for.&lt;/p&gt;

&lt;p&gt;Yes, outsourcing usually will cut down costs, but a key difference between a good outsourcing company and a bad one is that outsourcing to the good one won't cut down costs that much.&lt;/p&gt;

&lt;p&gt;20 to 30 percent cost reduction is a fair and also optimistic price point every manager should look for and it could be enough for an organization to jump on the boat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Truth: Cultural differences in outsourcing
&lt;/h2&gt;

&lt;p&gt;Cultural differences are an undeniable reality. Differences in work ethics, communication styles, and business practices can sometimes lead to misunderstandings and conflicts in the collaboration process.&lt;/p&gt;

&lt;p&gt;It's no secret that when outsourcing software development to another country, there will likely be some cultural differences to navigate.&lt;/p&gt;

&lt;p&gt;For example, a culture that values direct communication may clash with a more indirect communication style that prioritizes avoiding confrontation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Truth: Timezone differences of various teams
&lt;/h2&gt;

&lt;p&gt;As most people in the industry know, software outsourcing often involves timezone differences between client companies and their outsourcing partners, as well as other teams involved.&lt;/p&gt;

&lt;p&gt;These differences can sometimes make communication and coordination more complicated, as team members may be working during different hours of the day.&lt;/p&gt;

&lt;p&gt;Despite these differences, many outsourcing companies are able to accommodate clients by adjusting work hours or scheduling meetings at mutually convenient times.&lt;/p&gt;

&lt;p&gt;Also, asynchronous communication tools and project management software can facilitate easy sharing of updates and progress.&lt;/p&gt;

&lt;p&gt;Planning is harder, this is true, but there are a boatload of tools to help overcome the differences and successful collaboration can be achieved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Truth: The talent pool is much larger
&lt;/h2&gt;

&lt;p&gt;One of the most significant advantages of software outsourcing is that it allows clients to tap into a talent pool much more extensive than what they could find locally.&lt;/p&gt;

&lt;p&gt;This fact came to light with the early 2023 tech. layoffs. Most companies who laid off tech people did so to optimize their talent pool and most of them re-hired part of them in other locations.&lt;/p&gt;

&lt;p&gt;Moreover, outsourcing companies often have highly specialized developers, whose skill sets might be hard to find locally. This opens up opportunities for clients to work with top-tier developers who can deliver high-quality work.&lt;/p&gt;

&lt;p&gt;Also, this provides a competitive advantage as it allows businesses to scale their operations quickly and efficiently with access to a sizable pool of talent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Truth: Skills and costs are more optimized
&lt;/h2&gt;

&lt;p&gt;Deploying an external software development team can be an excellent way to optimize costs and resource management. These expert teams have the capacity to identify opportunities for cost reduction specific to their field and offer tailored solutions to meet the client's needs.&lt;/p&gt;

&lt;p&gt;Outsourcing brings a wealth of experience with them when tackling diverse projects. This experience provides adaptability to unique project types and unexpected situations, something an in-house team might not be equipped to handle.&lt;/p&gt;

&lt;p&gt;Team scalability is another advantage offered by outsourcing partners that businesses can use to their advantage. Quick resource scaling or reduction depending on project demands makes project management more agile and flexible.&lt;/p&gt;

&lt;p&gt;Besides providing technical expertise, external teams commonly offer a vast range of other services that companies can benefit from, including project management, quality assurance, and efficient documentation processes. These can frequently contribute to reduced project times and increased quality, allowing businesses to maximize their returns.&lt;/p&gt;

&lt;p&gt;For less money.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turnkey solutions without micromanaging
&lt;/h2&gt;

&lt;p&gt;Turnkey solutions are excellent options for businesses that prefer to deploy an external team to manage their technology needs without micromanaging. With turnkey solutions, businesses receive an all-encompassing solution, encompassing different technological areas that offer the convenience of having all technological matters centralized and managed by a single partner. With the caveat that businesses need to actively look for this because the sad reality is that most outsourcing companies are "coding sweatshops".&lt;/p&gt;

&lt;p&gt;In the context of software outsourcing, businesses need to communicate the broader project goals and ensure that developers are aware of the strategic direction as well as the product needs and limitations. By involving developers in problem-solving discussions, businesses can benefit from the developer's skills while raising their understanding of the strategic needs of a project, which a "turnkey" solution could offer to the client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Freelances vs Outsourcing Companies
&lt;/h2&gt;

&lt;p&gt;In software outsourcing, businesses have the option to outsource to freelancers or development agencies. While freelancers may lead to reduced costs, the main disadvantage is that clients may be directly responsible for managing the project and its various stages. In contrast, outsourcing to a development agency means that the client has a team to manage the project holistically and the agency is responsible for ensuring quality outcomes.&lt;/p&gt;

&lt;p&gt;Outsourcing companies that offer a full package from design to development, production deployment and maintenance are advantageous as they offer a seamless system from beginning to end, ensuring that each stage of the process works together harmoniously.&lt;/p&gt;

&lt;p&gt;Working with multiple outsourcing companies, however, can lead to communication challenges as each company may have different practices and methods. This can lead to defects, delays and a lower quality of work.&lt;/p&gt;

&lt;p&gt;Breaking up the project by teams working in isolation can cause communication challenges between teams, which ultimately leads to delays and lower project quality. It's crucial for businesses to consider these issues when outsourcing.&lt;/p&gt;

&lt;p&gt;In comparison, working with a company that can offer a full range of services from design to deployment and maintenance simplifies the process. By working with a single company, clients can reduce the challenges of fragmented communication and disjointed methods. A one-stop-shop solution provides accountability throughout the project's lifecycle, leading to timely completion, higher-quality outcome, and more predictable costs.&lt;/p&gt;

&lt;p&gt;Additionally, post-deployment maintenance and support are more robust as the company has intellectual property rights and proprietary knowledge of the project, meaning any issues that arise after deployment can be handled efficiently.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>business</category>
      <category>learning</category>
      <category>management</category>
    </item>
    <item>
      <title>The Black Box of Software Development</title>
      <dc:creator>George</dc:creator>
      <pubDate>Sun, 18 Sep 2022 10:29:26 +0000</pubDate>
      <link>https://dev.to/primalskill/the-black-box-of-software-development-4eoh</link>
      <guid>https://dev.to/primalskill/the-black-box-of-software-development-4eoh</guid>
      <description>&lt;p&gt;&lt;strong&gt;Think of software development as a box.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, this box is transparent at the start, but as you develop the application this box will get darker and &lt;strong&gt;darker&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Initially, you can see inside the transparent box, you can see all the code bits and pieces that keep the box together.&lt;/p&gt;

&lt;p&gt;A new task was assigned to a developer who starts working on it right away putting the implemented code in the box. The box gets &lt;strong&gt;darker&lt;/strong&gt;. Then another bit of code by another developer is put inside the box and the box, yet again, gets &lt;strong&gt;darker&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every new code from tasks, iterations, phases, or sprints, however you want to call it, will make this box ever so slightly darker up to the point when this box is &lt;strong&gt;completely black&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Developers can't see the contents of the black box, they don't know what's going on inside anymore. They have no idea what's keeping the box together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A team's job is not to let the box become completely black.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What prevents the box to be completely black?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's well-defined specifications. It's good tests, be it unit tests, integration, or end-to-end. It's also sane task deadlines, and a well-spent time in and around development reviews. It's refactoring stale code.&lt;/p&gt;

&lt;p&gt;Finally, it's team energy of overcoming the hurdles of a complex project and creating a solid architectural base for this imaginary box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remember, good code is just a side-effect of all of the above.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Image credit: Thorn Yang on Pexels.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Stay tuned and if you liked this post, please share it and comment on it below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>productivity</category>
      <category>architecture</category>
    </item>
    <item>
      <title>I Challenged Myself to Create an App in Less Than 24 Hours</title>
      <dc:creator>George</dc:creator>
      <pubDate>Fri, 22 Apr 2022 07:29:44 +0000</pubDate>
      <link>https://dev.to/feketegy/i-challenged-myself-to-create-an-app-in-less-than-24-hours-4odk</link>
      <guid>https://dev.to/feketegy/i-challenged-myself-to-create-an-app-in-less-than-24-hours-4odk</guid>
      <description>&lt;p&gt;So I challenged myself to see if I can create an app from idea all the way to production in less than 24 hours. &lt;/p&gt;

&lt;p&gt;Here it is! &lt;a href="https://breathe.so"&gt;https://breathe.so&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I had the idea of this app in mind for quite some time now. I implemented it in ~16,5 hours, from typing the first letter of the source code to desinging, deploying it to production, configuring the server and redirecting the domain.&lt;/p&gt;

&lt;h3&gt;
  
  
  About the app
&lt;/h3&gt;

&lt;p&gt;The app is about mental health and breathing. Mental health is important, I do breathing exercises almost daily and this app will help me, and hopefully others, to work on it even more.&lt;/p&gt;

&lt;p&gt;Currently there are two exercises called "Calm Down" and "Focus".&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Calm Down - it's a box type breathing exercise with 4 sec of breath in -&amp;gt; 4 sec hold -&amp;gt; 4 sec breathe out -&amp;gt; 4 sec hold. &lt;/li&gt;
&lt;li&gt;Focus - it's a in/out type of exercise with 6 sec breathe in -&amp;gt; 6 sec breathe out.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'm planning on adding more features if interest is high enough.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>showdev</category>
      <category>watercooler</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Software Outsourcing: Types, Pros and Cons</title>
      <dc:creator>George</dc:creator>
      <pubDate>Mon, 17 Jan 2022 09:02:10 +0000</pubDate>
      <link>https://dev.to/primalskill/software-outsourcing-types-pros-and-cons-130h</link>
      <guid>https://dev.to/primalskill/software-outsourcing-types-pros-and-cons-130h</guid>
      <description>

&lt;p&gt;&lt;em&gt;This article was originally published on &lt;a href="https://primalskill.blog/software-outsourcing-part-1-types-pros-and-cons"&gt;https://primalskill.blog/software-outsourcing-part-1-types-pros-and-cons&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;In 2004 I started working as a freelance software developer doing mostly outsourcing work for foreign clients. More than 17 years later I'm the founder of a software development company called &lt;a href="https://primalskill.com"&gt;Primal Skill&lt;/a&gt; with my partner having a dedicated team doing software outsourcing.&lt;/p&gt;

&lt;p&gt;Only now I just realized that I haven't addressed software outsourcing in a blog post, specifically what blockers our clients had when we first started working together.&lt;/p&gt;

&lt;p&gt;In this article, I will talk about what software outsourcing means, what types of outsourcing strategies are most common and what are the pros and cons of each.&lt;/p&gt;

&lt;p&gt;In part 2, I will dispel some of the myths and shed light on some of the truths of software development outsourcing I learned along the way.&lt;/p&gt;

&lt;p&gt;First, let's define what is software development outsourcing and let's look at the various forms of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Software Outsourcing?
&lt;/h2&gt;

&lt;p&gt;Simply put, software development outsourcing means the client delegates some or all software development processes to an outside party instead of keeping it in-house.&lt;/p&gt;

&lt;p&gt;It's up to the business to decide how much to keep in-house and how much, if not all, to outsource to various parties. A business can choose to outsource software development only, keeping design, maintenance, and system administration in-house.&lt;/p&gt;

&lt;p&gt;The primary purpose of outsourcing for most businesses is cutting down costs, which is somewhat a myth and we will see why is that later in part 2 of the article.&lt;/p&gt;

&lt;p&gt;Other reasons a business can choose to outsource are getting access to a larger and diversified pool of talent, scaling up the business, and/or covering other geographical locations.&lt;/p&gt;

&lt;p&gt;There are differences between outsourcing strategies mainly considering the outsourced work's location:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Off-shore outsourcing&lt;/strong&gt; means that the outsourced work is being executed in a different country, in a different time zone. For example, a US business outsources to a European company.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Near-shore outsourcing&lt;/strong&gt; means that outsourcing happens usually in a neighboring or close proximity country where the timezone is the same or a couple of hours different and the spoken language is usually the same. For example, a US business outsources work to Canada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-shore outsourcing&lt;/strong&gt; is when the outsourced work remains within the borders of the country, timezone and language are the same as the clients. For example, a US business with HQ in Los Angeles outsources work to San Francisco or New York.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TmpqYMZN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o5tw1esxuhk9lo2lxc52.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TmpqYMZN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o5tw1esxuhk9lo2lxc52.png" alt="Off-shore, near-shore, on-shore" width="880" height="624"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Red: On-shore, yellow: near-shore, blue: off-shore&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Software Outsourcing
&lt;/h2&gt;

&lt;p&gt;There are countless ways of dissecting an outsourcing process by either the business or the development agency that does the outsourcing for the business.&lt;/p&gt;

&lt;p&gt;The most common are as follows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Outsourcing to Freelancers
&lt;/h3&gt;

&lt;p&gt;A business decides to outsource software development to one or more freelancers located in other countries and timezones. A freelancer is a sole developer who doesn't work for an agency nor has a team of experts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wdNOut5Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4h2g6dr4vkzhpq2134yi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wdNOut5Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4h2g6dr4vkzhpq2134yi.png" alt="Outsourcing to freelancers diagram" width="574" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This approach is the most cost-effective and easy to set up as there is a lot of supply of freelancers across the Globe.&lt;/p&gt;

&lt;p&gt;This strategy is beneficial if the client only wants part of his business outsourced, for example having one or more freelancers for developing the software and a couple of freelancers for maintaining the server architecture where the codebase will be hosted.&lt;/p&gt;

&lt;p&gt;A business can also employ a freelancer for highly specific work that needs to be developed and there are no in-house experts to tackle the problem.&lt;/p&gt;

&lt;p&gt;The downside of this strategy is that the client will have to manage the individual freelancers and play the part of the project manager or even an engineering lead which can be time-consuming.&lt;/p&gt;

&lt;p&gt;Many freelancers work with an hourly rate pricing model, and they are usually working on many different projects.&lt;/p&gt;

&lt;p&gt;If the outsourced work is not continuous hiring a freelancer can be the most optimal way of doing work, with a minimum dedicated hours agreement with the freelancer which the client can either fulfill or not.&lt;/p&gt;

&lt;p&gt;This pricing model is beneficial for both parties because the freelancer will have a continuous stream of revenue even if work is not filled out for that week or month, and also beneficial for the business that they can retain the same freelancer on a week-to-week or month-to-month basis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Working With a Software Development Company
&lt;/h3&gt;

&lt;p&gt;This is the most popular form of doing software outsourcing and it is not limited to development. In this strategy the client contracts a software development agency, usually found in another part of the World, for developing and maintaining the software.&lt;/p&gt;

&lt;p&gt;How work is executed, is usually, dictated by the outsourcing company, which can decide to employ freelancers, set up a specific team of engineers, or even outsource the whole work to another company.&lt;/p&gt;

&lt;p&gt;What the outsourcing company can and can't do is stipulated in the contract and in non-disclosure agreements (NDAs) as well as national and international laws such as GDPR in Europe.&lt;/p&gt;

&lt;p&gt;Depending on how the work is set up, the outsourcing company can still decide to rotate individual team members in-house to better optimize their costs and the workflow without input from the client.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9g7YN6pE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x5vk2ggdfl1haohsy2az.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9g7YN6pE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x5vk2ggdfl1haohsy2az.png" alt="Outsourcing to a dev company diagram" width="880" height="665"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The client, in many cases, only communicates with a member from the outsourcing company, who in most cases is a project manager or an engineering team lead and is usually responsible for multiple projects that the outsourcing agency does.&lt;/p&gt;

&lt;p&gt;Depending on the outsourcing company services the processes a client can outsource can vary. Some outsourcing companies offer full-service solutions from project alignment to server maintenance while others only a limited but well-defined solutions.&lt;/p&gt;

&lt;p&gt;In some cases, the client hires managers who are more aligned with the business and report directly to the client and outsource the rest. &lt;/p&gt;

&lt;p&gt;Software development companies have flexible pricing models, ranging from hourly rates to fixed prices models.&lt;/p&gt;

&lt;p&gt;For smaller projects, a fixed price model is more beneficial as it can optimize the costs upfront for the entire project or forecast the costs for a project phase.&lt;/p&gt;

&lt;p&gt;For larger projects, an hourly rate pricing model is better because it's harder to estimate the whole project scope upfront therefore the client pays for the work that's finished.&lt;/p&gt;

&lt;h3&gt;
  
  
  Outsourcing to an Agency With a Dedicated Team
&lt;/h3&gt;

&lt;p&gt;This approach is similar to outsourcing to a development company, the only difference is that the client is guaranteed a dedicated team assembled for the duration of the project. &lt;/p&gt;

&lt;p&gt;This team is solely responsible for developing the client's project and their time is carved out and locked down for that single project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lBPpH00M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8auswenwylgbmr8rf16u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lBPpH00M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8auswenwylgbmr8rf16u.png" alt="Outsourcing to a dedicated team within a dev company diagram" width="880" height="665"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The outsourcing agency, in this case too, can decide to rotate team members in-house, or have a contractual agreement that locks down the individual team members for the project.&lt;/p&gt;

&lt;p&gt;The client can directly communicate with individual team members, or have a dedicated project manager and/or engineering team lead.&lt;/p&gt;

&lt;p&gt;Depending on which parts of the project the client is outsourcing, this strategy usually offers a turnkey solution for the software project, including development, maintenance, platform administration, and on-call support team. It makes sense to the business to outsource all of it.&lt;/p&gt;

&lt;p&gt;The pricing model is similar to other strategies, having an hourly rate for the scoped out project phases, both parties can optimize work being done on their ends.&lt;/p&gt;

&lt;p&gt;The time-to-market with a dedicated team is also logically faster since the project phases are decided upon by the team and team members are not pulled away on other projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Outsourcing Team for Hire
&lt;/h3&gt;

&lt;p&gt;This method got more popular in recent years, where a client outsources the bulk of the development to a dedicated outsourcing team but hires the managers and tech lead (C-level managers) directly and keeps these people in-house.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--USzjTT_o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2pihhq1zmgd21veuqnt3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--USzjTT_o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2pihhq1zmgd21veuqnt3.png" alt="Team for hire diagram" width="607" height="685"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The client has a contract with the outsourcing company but retains and works with the team directly through the in-house managers. The development company essentially leases out the team or a couple of engineers to the client.&lt;/p&gt;

&lt;p&gt;In this scenario, the managers hired by the client and the outsourcing engineers form the project team. The engineers report to the managers and the managers to the client and the development company handles the rest such as offering a space for the engineers, handling administrative costs, and so on. The engineers are still employed by the development company.&lt;/p&gt;

&lt;p&gt;This strategy is beneficial for the client because the development team can handle the administrative costs, local taxes, and engineer salaries, while the development company has a constant revenue stream without the headache of managing the team.&lt;/p&gt;

&lt;p&gt;It makes sense for large projects to use this method where the client wants to get a closer grip on the outsourced development process.&lt;/p&gt;

&lt;p&gt;The pricing model can vary, the parties can set up an hourly rate paid directly to the development company, a fixed rate for a specific project phase, or a hybrid model for various outsourced departments, e.g. development having hourly rate, devops team having fixed price.&lt;/p&gt;

&lt;h3&gt;
  
  
  Having One or More Outsourced Teams Directly Hired by the Client
&lt;/h3&gt;

&lt;p&gt;This approach entails that the client directly hires a team in a different country to cut down on costs, have a larger pool of talent with experts who are not available in the clients' country.&lt;/p&gt;

&lt;p&gt;This team is not employed by an outsourcing company, but by the client directly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kFoJeiOV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h0jiiku3yjv0vonds9zi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kFoJeiOV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h0jiiku3yjv0vonds9zi.png" alt="Directly hired by client team diagram" width="824" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the most expensive solution out of all the outsourcing strategies above because the client needs to factor in administrative costs, local taxes as well as team costs, but this solution offers the greatest control and flexibility to the software project that's being outsourced.&lt;/p&gt;

&lt;p&gt;The dedicated team can also be located in different countries, in different time zones, and speaking different languages which makes the logistics of this strategy more complex.&lt;/p&gt;

&lt;p&gt;This strategy is usually chosen by a business that either wants to offer their software to a specific market at a specific geographic location and has a dedicated team at that location to offer support for the software or wants to scale up the business more rapidly by having access to a greater pool of engineers.&lt;/p&gt;

&lt;p&gt;The approach is optimized for large, complex projects with a development run-down measured in years, where continuous development is being done and released to the public.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decentralized Teams Hired by the Client
&lt;/h3&gt;

&lt;p&gt;This strategy is similar to hiring teams directly by the client one exception being that these teams are spread across the Globe while a single dedicated team (like the previous strategy above) is present in a single location be it off-shore or near-shore.&lt;/p&gt;

&lt;p&gt;These teams can be composed of a variety of people freelance designers, devops engineers, managers, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R2XNuek9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k0jrmbxp8ihhfu6cwkgo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R2XNuek9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k0jrmbxp8ihhfu6cwkgo.png" alt="Decentralized teams diagram" width="700" height="921"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This approach makes sense if the client has an ongoing, long-term project built directly for the end-users or there are multiple variations of the software (e.g. different versions for different locations) or support is necessary on location across the World.&lt;/p&gt;

&lt;p&gt;Managers can be located on-shore (e.g. C-level managers), while other teams in mixed off-shore, near-shore or on-shore locations.&lt;/p&gt;

&lt;p&gt;The various teams can and should communicate directly with other teams to streamline the whole development workflow.&lt;/p&gt;

&lt;p&gt;Some of the teams can even be a 3rd party outsourcing company offering development support or dedicated freelancers hired to do a specific task that needs comprehensive expertise in that field (e.g. AI experts or data scientists).&lt;/p&gt;

&lt;h2&gt;
  
  
  Which Outsourcing Strategy Is More Optimal for Your Project?
&lt;/h2&gt;

&lt;p&gt;To find out which outsourcing strategy is most beneficial for your project or if outsourcing is good for the project at all, first, you need to create a profile on the project.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Are You Technologically Proficient?
&lt;/h3&gt;

&lt;p&gt;A software project is wildly different from other non-technical projects. You need to understand the various parts and phases of a software project.&lt;/p&gt;

&lt;p&gt;We had clients who were great business strategists and project managers but lacked technological literacy. They tried to develop their project with freelancers at first but failed then approached a software development company (Us), understood the different strategies employed in a software project, and could create a better strategy for their business.&lt;/p&gt;

&lt;p&gt;If you have a software project but lack a deep insight into the development process it's better to outsource the whole project to a development company that will also manage the project for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Size of the Project
&lt;/h3&gt;

&lt;p&gt;If you have a small project and can't guarantee continuous work for a team, then your best bet will be freelancers.&lt;/p&gt;

&lt;p&gt;If the project size will increase over time, it can be passed to a team at a development company that offers proper management for the project offloading this work from your shoulders.&lt;/p&gt;

&lt;p&gt;Having an already developed project it will be harder to pass the whole project to a development team. In this case, the best strategy is to either hire freelancers to expand the development team or hire a dedicated team that can be onboarded to the project by your tech leads.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Supported Costs
&lt;/h3&gt;

&lt;p&gt;Failing to optimize costs can make or break a software project. Not realizing the true cost of development can result in chaos making a project deadline unmanageable.&lt;/p&gt;

&lt;p&gt;Having a good team who can break down the project phases and estimate them with somewhat good accuracy is essential. Remember an estimate is not a guarantee, therefore supporting overrun project costs needs to also be factored in.&lt;/p&gt;

&lt;p&gt;Having a dedicated team employed by you comes with additional administrative costs and/or local taxes (e.g. opening a company in the country, hiring company administrators, hiring accountants, etc).&lt;/p&gt;

&lt;p&gt;To quickly scale up your business the best strategy is to either hire freelancers in the short- to mid-term or outsource directly to a development company that has the necessary capacity to do this.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Team Availability
&lt;/h3&gt;

&lt;p&gt;The nature of the software project will dictate the urgency of development for it. A project where a future event needs to be met such as a web app created for an online conference going live on a fixed date is different from a project that implements new features without a strictly fixed deadline.&lt;/p&gt;

&lt;p&gt;Outsourcing teams can run behind a client's time by hours, availability is also determined if a team is dedicated to a project or not. If a team works on multiple outsourcing projects they need to factor in development time for your project's tasks.&lt;/p&gt;

&lt;p&gt;These tasks are not implemented immediately, but days or weeks after scoping it out.&lt;/p&gt;

&lt;p&gt;If emergency work has to be done on the project, like a serious bug fix or responding to market demand quickly, a freelancer or even an outsourcing team is not usually available at the exact moment.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Support and Maintenance
&lt;/h3&gt;

&lt;p&gt;Every software project will need support and maintenance at some point, the question is at which stage of the project's life cycle. &lt;/p&gt;

&lt;p&gt;These tasks can be outsourced further to a separate dedicated team that can offer support for customers either on-site or through a support call center.&lt;/p&gt;

&lt;p&gt;Development maintenance is usually done by the team who develops the project, but the on-call support and disaster recovery can be outsourced to a separate team that can guarantee 24/7 availability.&lt;/p&gt;




&lt;p&gt;All these variables need to be factored in before you decide to outsource the software project.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hope you liked part 1 of this article. In part 2 I will tackle the myths and truths of software outsourcing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Stay tuned and if you liked this post, please share it and comment on it below.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>business</category>
      <category>learning</category>
      <category>management</category>
    </item>
    <item>
      <title>Do you read the license of an open-source package you're using?</title>
      <dc:creator>George</dc:creator>
      <pubDate>Wed, 12 Jan 2022 11:41:25 +0000</pubDate>
      <link>https://dev.to/primalskill/do-you-read-the-license-of-an-open-source-package-youre-using-7a4</link>
      <guid>https://dev.to/primalskill/do-you-read-the-license-of-an-open-source-package-youre-using-7a4</guid>
      <description>&lt;p&gt;Open-source doesn't necessarily mean it's free to use in all cases. Do you read licenses?&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>3 Tales of Tricky Statistics</title>
      <dc:creator>George</dc:creator>
      <pubDate>Tue, 01 Jun 2021 14:05:35 +0000</pubDate>
      <link>https://dev.to/primalskill/3-tales-of-tricky-statistics-3dgp</link>
      <guid>https://dev.to/primalskill/3-tales-of-tricky-statistics-3dgp</guid>
      <description>&lt;p&gt;Statistics can often be misleading, here's an example. Take the number of billionaires in ten countries:&lt;/p&gt;

&lt;p&gt;💰 United States - 585&lt;br&gt;
💰 China - 476&lt;br&gt;
💰 India - 131&lt;br&gt;
💰 Germany - 114&lt;br&gt;
💰 Russia - 98&lt;br&gt;
💰 Hong Kong - 67&lt;br&gt;
💰 Canada - 64&lt;br&gt;
💰 United Kingdom - 54&lt;br&gt;
💰 Brazil - 43&lt;br&gt;
💰 Italy - 42&lt;/p&gt;

&lt;p&gt;From this list, we can safely say that the US is clearly leading here, or can we? This number is not showing reality because the underlying comparison, billionaires to nr. of people is different in each country.&lt;/p&gt;

&lt;p&gt;Normalizing the basis to compare to, let's say, per million people would be a much better metric because every country on the list above has at least a million citizens.&lt;/p&gt;

&lt;p&gt;The list below shows this:&lt;/p&gt;

&lt;p&gt;👉 Hong Kong ~8.93&lt;br&gt;
👉 Canada ~1.70&lt;br&gt;
👉 US ~1.6&lt;br&gt;
👉 Germany ~1.37&lt;br&gt;
👉 United Kingdom ~0.81&lt;br&gt;
👉 Italy ~0.69&lt;br&gt;
👉 Russia ~0.67&lt;br&gt;
👉 China ~0.3&lt;br&gt;
👉 Brazil ~0.19&lt;br&gt;
👉 India ~0.09&lt;/p&gt;

&lt;p&gt;This list shows a totally different picture. We compared two dimensions normalizing one to the other and calculated the average.&lt;/p&gt;



&lt;p&gt;Another case where averaging can be misleading is employee salaries and the national or company-wide average, which is not a very accurate metric simply because if we take five employees in a company with the following salaries: &lt;/p&gt;

&lt;p&gt;👶 Employee 1 - 5,000.00 USD / month&lt;br&gt;
👶 Employee 2 - 5,500.00 USD / month&lt;br&gt;
👶 Employee 3 - 6,000.00 USD / month&lt;br&gt;
👶 Employee 4 - 12,000.00 USD / month&lt;br&gt;
👶 Employee 5 - 14,000.00 USD / month&lt;/p&gt;

&lt;p&gt;On average we could say that an employee has 8,500.00 USD / month. Employee 1 wouldn't agree.&lt;/p&gt;

&lt;p&gt;A better metric would be the median salary, which is considered a more neutral measure and it's 6,000.00 USD / month.&lt;/p&gt;

&lt;p&gt;So, next time you interview for a job and the HR person says "Oh yeah, our employees get around X amount of USD per month" you should ask if it's on average or median? 😁&lt;/p&gt;



&lt;p&gt;A wonderfully elegant yet horrible metric is lines of code in a codebase. It's wonderful because it's straightforward, it's a number everybody can understand, one project has 100.000 LoC another project has 20.000 LoC, therefore, the former is bigger than the latter.&lt;/p&gt;

&lt;p&gt;Yet it's a horrible metric because managers often use it to measure developer productivity.&lt;/p&gt;

&lt;p&gt;Why is that? Well, a program can be written in an infinite amount of ways, one developer can write a function in 5 lines another can write it in 25 lines. Which is better?&lt;/p&gt;

&lt;p&gt;Also, the process of writing code differs from let's say writing this blog post. A developer can write 1000 lines of code, deleting 300, and modifying the rest to be under 500 LoC.&lt;/p&gt;

&lt;p&gt;Or, one project can adhere to one type of coding style another to a different one, for example, the same exact code can be written in four different ways:&lt;/p&gt;

&lt;p&gt;Ten lines:&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three lines:&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;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&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;Four lines:&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;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&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;One line:&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;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&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;Using lines of code as a blanket statistic to measure productivity is horrible but if a manager uses this metric, by logic, the developer who wrote it in ten lines is the most productive.&lt;/p&gt;

&lt;p&gt;Developer productivity is a really complex metric, there's no single truth, but we can employ a variety of other strategies such as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The number of bugs QA caught after a feature was implemented.&lt;/li&gt;
&lt;li&gt;Effort of feature vs. time of development.&lt;/li&gt;
&lt;li&gt;Time and effort of peer reviews.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the end, WTF/minute is a better metric than LoC. 🙃&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PQ18LXRi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oqbehnv8h17gy1dr79tv.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PQ18LXRi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oqbehnv8h17gy1dr79tv.jpeg" alt="WTFs/minute"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Cover photo by &lt;a href="https://twitter.com/charlesdeluvio"&gt;charlesdeluvio&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was originally published on &lt;a href="https://primalskill.blog/3-tales-of-tricky-statistics"&gt;https://primalskill.blog/3-tales-of-tricky-statistics&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Please comment and consider sharing this article; and if you have any questions you can contact me here in the comments or on &lt;a href="https://twitter.com/feketegy"&gt;Twitter&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>software</category>
      <category>statistics</category>
      <category>analytics</category>
    </item>
    <item>
      <title>How to Keep Up to Date with Web Development</title>
      <dc:creator>George</dc:creator>
      <pubDate>Tue, 12 Jan 2021 10:38:21 +0000</pubDate>
      <link>https://dev.to/primalskill/how-to-keep-up-to-date-with-web-development-495n</link>
      <guid>https://dev.to/primalskill/how-to-keep-up-to-date-with-web-development-495n</guid>
      <description>

&lt;p&gt;&lt;em&gt;This article was originally published on &lt;a href="https://primalskill.blog/how-to-keep-up-to-date-with-web-development"&gt;https://primalskill.blog/how-to-keep-up-to-date-with-web-development&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Approaching this behemoth of an industry called web development can be overwhelming at times, everybody had that feeling of missing out on web development, especially the chaos that's happening in the &lt;em&gt;front-end world&lt;/em&gt;...&lt;/p&gt;

&lt;p&gt;...But just like any other problem, you break it down into smaller pieces. Think of the areas in web development you're lacking knowledge, then look for resources to fill that gap.&lt;/p&gt;

&lt;p&gt;You also need to &lt;em&gt;practice learning&lt;/em&gt; to be more proficient in it. Have a really good understanding of the basic programming principles first, that drive web development.&lt;/p&gt;

&lt;p&gt;Focus on the fundamentals if you think you're lacking knowledge in that area, then build on top of that the new techniques and strategies that interest you.&lt;/p&gt;

&lt;p&gt;There's too much noise on the Internet as it is, especially in tech, you need to focus on &lt;em&gt;extracting the signal&lt;/em&gt; from the noise. By focusing on the programming principles you're building on top of a solid foundation because programming principles rarely change, it gets re-invented. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Object-oriented_programming"&gt;OOP&lt;/a&gt; is not new, &lt;a href="https://en.wikipedia.org/wiki/Functional_programming"&gt;functional programming&lt;/a&gt; isn't either, &lt;a href="https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller"&gt;MVC&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;DRY&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/KISS_principle"&gt;KISS&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Single-responsibility_principle"&gt;SRP&lt;/a&gt; were all invented in the 70s and 80s.&lt;/p&gt;

&lt;p&gt;With experience, you'll realize that a solid foundation is key, and the major difference between most web development programming languages is just the syntax only.&lt;/p&gt;

&lt;p&gt;You’ll need to have a very narrow set of problems that only a specific programming language can solve, in other cases it truly is just a matter of preference, community adoption and the available resources you have on hand.&lt;/p&gt;

&lt;p&gt;If you want to know more about good programming principles, check out my blog post on the &lt;a href="https://primalskill.blog/10-books-every-programmer-should-read"&gt;10 books every programmer should read&lt;/a&gt; where I cover books presenting these programming principles.&lt;/p&gt;

&lt;p&gt;The bottom line is you need to love web development, love programming, then learning will be easy, but if you're a &lt;em&gt;9 to 5&lt;/em&gt; programmer, not really interested in software, then you're going to have a hard time leveling up to be a better programmer.&lt;/p&gt;

&lt;p&gt;This doesn’t mean that you shouldn’t have a life outside work, on the contrary, work-life balance is really important.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You need to invest time and energy every week to learn something new.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Old is New Again
&lt;/h2&gt;

&lt;p&gt;There's no such thing as the wrong approach in web development, it's more like the wrong solution to that set of problems you're trying to solve, and showing off your new programming techniques is usually the wrong solution for the problem. 😃&lt;/p&gt;

&lt;p&gt;It's perfectly okay &lt;strong&gt;NOT&lt;/strong&gt; to use the latest and greatest packages, modules, or techniques in your codebase, changing it out every day because something newer and shinier was released is almost always the wrong approach.&lt;/p&gt;

&lt;p&gt;It's a much better strategy to use tried and battle-tested code instead, especially because of the dynamic nature of software development.&lt;/p&gt;

&lt;p&gt;It's also a fallacy that not using the newest programming language or the latest framework you'll be doing a disservice to your project. You can solve 99% of the problems with any programming language. &lt;/p&gt;

&lt;h2&gt;
  
  
  Cut out 90% of the news
&lt;/h2&gt;

&lt;p&gt;Get off social media, stop procrastinating, and cut out any distractions while you're working. Practice async, passive information gathering, meaning, not to jump on a new video, blog, or podcast instantly, instead save it for later and keep a schedule for learning new things.&lt;/p&gt;

&lt;p&gt;You can organize your streams and feed with a note-taking app, and keep a &lt;em&gt;log&lt;/em&gt; of what you've learned on a weekly basis.&lt;/p&gt;

&lt;p&gt;You can use apps like &lt;a href="https://feedly.com/"&gt;Feedly&lt;/a&gt;, created for this purpose, to filter the information overload you're being bombarded with daily. They even use an AI assistant that will learn from your habits and will filter out news for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start your own blog
&lt;/h2&gt;

&lt;p&gt;If you want to really get neck-deep in a subject you want to learn, I think, the best way to do it is to write about it. You'll be &lt;em&gt;forced&lt;/em&gt; to research the topic in-depth filling the gaps in your knowledge in the process.&lt;/p&gt;

&lt;p&gt;Starting a blog is not complicated anymore, with services like &lt;a href="https://hashnode.com/"&gt;Hashnode&lt;/a&gt; or &lt;a href="https://dev.to/"&gt;DEV&lt;/a&gt; it's 5 minutes to create your own blog and start writing.&lt;/p&gt;

&lt;p&gt;The benefit of creating a blog on such services is that you will also get a huge audience from the get-go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Tips
&lt;/h2&gt;

&lt;p&gt;*&lt;em&gt;Read source code: *&lt;/em&gt; most beginner developers I've met just don't read other developers source code at all. Why? Reading source code should be thought in schools 😁, it's one of the most fundamental things you should do if you're in software development.&lt;/p&gt;

&lt;p&gt;Ask yourself this: Do you know what's inside &lt;code&gt;node_modules&lt;/code&gt;? Do you know what code a module or package contains? &lt;/p&gt;

&lt;p&gt;You can learn awesome techniques, simply by, reading other developer's code, and more importantly, you can &lt;strong&gt;vet&lt;/strong&gt; that code for security exploits, maybe even fix it and create PRs, it's a win-win.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Share and discuss:&lt;/strong&gt; news, tutorials, and techniques with your friends in tech or your co-workers. It's very important to get feedback on your ideas, programming techniques, and the like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get active on forums:&lt;/strong&gt; it may be counterintuitive, and I personally, don't like to follow a bunch of people on social media, because it usually adds noise to my daily work, but by following a narrow set of topics on Reddit or Twitter can be okay.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get familiar with Github:&lt;/strong&gt; look at what's &lt;a href="https://github.com/trending"&gt;trending on the website&lt;/a&gt;, watch releases for repositories you're interested in, or popular repos, just to stay up to date on what direction the industry is pulling right now.&lt;/p&gt;

&lt;p&gt;You can also follow &lt;a href="https://github.com/topics"&gt;topics&lt;/a&gt; which gives you an overview of repository and user activities related to that topic, such as &lt;a href="https://github.com/topics/data-structures"&gt;data structures&lt;/a&gt; or &lt;a href="https://github.com/topics/docker"&gt;Docker&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;It's important to &lt;em&gt;learn how to learn&lt;/em&gt; new things, but also to find the &lt;em&gt;signal in the noise&lt;/em&gt;. Here are a couple of resources, that you could use to stay up-to-date with the new info.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blogs
&lt;/h3&gt;

&lt;p&gt;Find information hubs on the topics you're interested in. Blogs are a great resource for that, subscribe to influential authors' feed, remember RSS? Google tried to kill it, but it's coming back! 😊&lt;/p&gt;

&lt;p&gt;Follow tech information &lt;em&gt;hubs&lt;/em&gt;, but be vary, the content on these websites can be overwhelming and of lower quality unless it’s a curated feed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://hashnode.com/"&gt;Hashnode&lt;/a&gt; - is a good place to find articles organized by topics (e.g. tags), just follow a couple of tags that you're interested in.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/"&gt;Dev.to&lt;/a&gt; - same as Hashnode, subscribe to topics of interest and you'll get a timeline with posts from those topics.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://daily.dev/"&gt;Daily.dev&lt;/a&gt; - a website where you'll get daily curated programming news.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hackernoon.com/"&gt;Hackernoon&lt;/a&gt; - another curated news website including everything tech and software.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dzone.com/"&gt;DZone&lt;/a&gt; - a massive news website giving you the highlights and trends in tech.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/"&gt;LinkedIn&lt;/a&gt; - as surprising as it sounds, there is a lot of really good content on the website. You can join tech groups or follow hashtags. It evolved a lot in recent years.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Newsletters
&lt;/h3&gt;

&lt;p&gt;Newsletters are an awesome way to get tech-related content that's curated by other developers. Getting a weekly e-mail overview on web development is almost guaranteed that it keeps you in the loop.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://javascriptweekly.com/"&gt;JavaScript Weekly&lt;/a&gt; - a newsletter of JavaScript articles, news and cool projects.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.tldrnewsletter.com/"&gt;TLDR&lt;/a&gt; - byte sized news for busy techies.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ponyfoo.com/weekly"&gt;Pony Foo Weekly&lt;/a&gt; - really good, curated, weekly news on web development.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://frontendfoc.us/"&gt;Frontend Focus&lt;/a&gt; - a once-weekly roundup of the best front-end news, articles, and tutorials. HTML, CSS, WebGL, Canvas, browser tech, and more.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://react.statuscode.com/"&gt;React Status&lt;/a&gt; - a weekly roundup of the latest React and React Native links and tutorials.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://changelog.com/weekly"&gt;Changelog Weekly&lt;/a&gt; - an editorialized take on this week in open source and software development.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Podcasts
&lt;/h3&gt;

&lt;p&gt;Podcasts are a great resource where experts give their opinion on web development, it's great if you can listen to it in the background while you're working. If you like podcasts you can subscribe to these ones:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://syntax.fm/"&gt;Syntax FM&lt;/a&gt; - specifically created for web developers.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://stackoverflow.blog/podcast/"&gt;Stack Overflow Podcast&lt;/a&gt; - gives you the news in tech right now.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://changelog.com/podcasts"&gt;Changelog Podcasts&lt;/a&gt; - a collection of podcasts on various tech topics, such as JavaScript, Startups, AI, Go, Brain Science.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.codepen.io/radio/"&gt;Codepen Radio&lt;/a&gt; - did you knew Codepen has a podcast? 😊&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://fullstackradio.com/"&gt;Full Stack Radio&lt;/a&gt; - a podcast for web developers interested in creating great software.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://frontendhappyhour.com/"&gt;Front End Happy Hour&lt;/a&gt; - thoughtful discussions on front-end web development.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://shoptalkshow.com/"&gt;ShopTalk Show&lt;/a&gt; - web design and development-related discussions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://devmode.fm/"&gt;Devmode.fm&lt;/a&gt; - podcast dedicated to modern web development.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  YouTube
&lt;/h3&gt;

&lt;p&gt;If you want to watch videos instead of reading or listening to podcasts, check out these channels on YouTube. I like to subscribe to smaller upcoming channels, I find that they give more hands-on information than the bigger channels, can't relate to devs working at companies with thousands of co-workers, they have a very specific set of problems they're solving.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/channel/UCFbNIlppjAuEX4znoulh0Cw"&gt;Web Dev Simplified&lt;/a&gt; - quality videos on web development, mostly front-end JavaScript, React, and more.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/channel/UClb90NQQcskPUGDIXsQEz5Q"&gt;Dev Ed&lt;/a&gt; - fun videos on web development, design, tools, etc.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/user/jherr2006/featured"&gt;Jack Herrington&lt;/a&gt; - full-stack web development videos.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/channel/UCsBjURrPoezykLs9EqgamOA"&gt;Fireship&lt;/a&gt; - coding tutorials related to web development.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/user/TechGuyWeb"&gt;Traversy Media&lt;/a&gt; - programming tutorial videos.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/c/learncodeacademy/featured"&gt;LearnCode.academy&lt;/a&gt; - 100% free web development tutorials, web site design tutorials and more.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/c/RealToughCandy/featured"&gt;RealThoughCandy&lt;/a&gt; - Real-world, hands-on web development tutorials, tips &amp;amp; tricks.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/channel/UCDCHcqyeQgJ-jVSd6VJkbCw"&gt;codeSTACKr&lt;/a&gt; - web development tutorials in HTML, CSS, JavaScript, Python, and PHP.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/user/Computerphile/featured"&gt;Computerphile&lt;/a&gt; - videos on all things related to computers.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/channel/UC_x5XG1OV2P6uZZ5FSM9Ttw"&gt;Google Developers&lt;/a&gt; - up to date news on Chrome and software development at Google.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Educational Websites
&lt;/h3&gt;

&lt;p&gt;Educational websites are also a great way to level up on web development. You can look at the trending or &lt;em&gt;what's hot&lt;/em&gt; sections on these websites to get the best courses on the topics you're interested in.&lt;/p&gt;

&lt;p&gt;Even though these services are not free, it's worth the investment, because you'll get a reviewed, well-thought-out video course covering the topic from A to Z.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://udemy.com/"&gt;Udemy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.coursera.org/"&gt;Coursera&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.codecademy.com/"&gt;Codecademy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.khanacademy.org/"&gt;Khan Academy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skillshare.com/"&gt;SkillShare&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Books
&lt;/h3&gt;

&lt;p&gt;Books can offer great value if you want to either learn new web development techniques or just simply staying up to date with the industry.&lt;/p&gt;

&lt;p&gt;Look for best sellers on Amazon or Goodreads, and check out my blog post on the &lt;a href="https://primalskill.blog/10-books-every-programmer-should-read"&gt;10 books every programmer should read&lt;/a&gt;. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Best-Sellers-Books-Web-Development-Design/zgbs/books/3510/ref=zg_bs_nav_b_2_5"&gt;Amazon Best Sellers on Web Development &amp;amp; Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Best-Sellers-Books-Computers-Technology/zgbs/books/5/ref=zg_bs_nav_b_1_b"&gt;Amazon Best Sellers on Computer &amp;amp; Technology&lt;/a&gt; - root category for best sellers related to computer and technology in general.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.goodreads.com/shelf/show/web-development"&gt;Goodreads Web Development Books&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.goodreads.com/list/tag/web-development"&gt;Goodreads Web Development Lists&lt;/a&gt; - lists put together by other software engineers.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;Remember, fight the urge of &lt;a href="https://en.wikipedia.org/wiki/Fear_of_missing_out"&gt;FOMO&lt;/a&gt;!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Also, please &lt;strong&gt;comment and consider sharing this article&lt;/strong&gt;; and if you have any questions you can contact me here in the comments or on &lt;a href="https://twitter.com/feketegy"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>architecture</category>
      <category>development</category>
      <category>software</category>
    </item>
  </channel>
</rss>
