<?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: Sotiris Kourouklis</title>
    <description>The latest articles on DEV Community by Sotiris Kourouklis (@sotergreco).</description>
    <link>https://dev.to/sotergreco</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%2F476849%2Fad2bf454-49e6-46dc-b4ce-1d0cdde6f710.jpg</url>
      <title>DEV Community: Sotiris Kourouklis</title>
      <link>https://dev.to/sotergreco</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sotergreco"/>
    <language>en</language>
    <item>
      <title>JavaScript - A Blessing or a Curse?</title>
      <dc:creator>Sotiris Kourouklis</dc:creator>
      <pubDate>Sun, 27 Oct 2024 11:13:03 +0000</pubDate>
      <link>https://dev.to/sotergreco/javascript-a-blessing-or-a-curse-1meg</link>
      <guid>https://dev.to/sotergreco/javascript-a-blessing-or-a-curse-1meg</guid>
      <description>&lt;p&gt;Everyone at least once in their life coded in JavaScript. We have some people say that they like it and and some others that they don’t. This will be just a small “letter“ to people that have distant feelings about the JS ecosystem, either good or bad.&lt;/p&gt;

&lt;p&gt;Before we start we need to understand the history of Javascript. Javascript is not a language it is an ecosystem. Java or C is a language Javascript it is not, ECMAScript is the actual name of the language. When we blame Javascript we actually blame the ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  History of Javascript
&lt;/h2&gt;

&lt;p&gt;Programming is a lot of things, if we imagine programming as big sphere, web takes the largest portion.&lt;/p&gt;

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

&lt;p&gt;When we are talking programming, 80% of the things are web related technologies. That’s why in 1995 Javascript started purely as a web language supported by IE4 in 1997. So for our understanding we need to know that Javascript was never intended for use on the server. Netscape which actually was the first browser to support Javascript used Mocha as a Javascript engine but everything up until V8 wasn’t merely good enough.&lt;/p&gt;

&lt;p&gt;As needs grew larger the first attempts to make Javascript stronger and faster started, but Google team makes miracles and actually made Javascript fast enough not only for the client but with the introduction of V8 and Node.js by Ryan Dahl, Javascript started to be usable on the server as well.&lt;/p&gt;

&lt;p&gt;Other languages like C or Java they are intended to be on machine level and create lower level programs. To understand what a miracle Javascript on the server is, imagine trying to put Java on the client. The intent of the language is not to be used to interact with the DOM and Web API’s so a lot of trickery needs to happen.&lt;/p&gt;

&lt;p&gt;ECMAScript 1 was the language for web browser and intended to run only in them. If we then blame the language for its performance, we need to know that it is not the language but the engine behind the language&lt;/p&gt;

&lt;h3&gt;
  
  
  Javascript Started To Grow
&lt;/h3&gt;

&lt;p&gt;Almost a decade later in 2009 as ECMAScript grew in needs, finally ES5 came around. Here is where the big boom happened. The actually language ECMAScript was actually usable for more things than simple front-end applications. Just a few years later React and other frameworks started to appear in the horizon and not only for the frontend but for the backend as well with the introduction of express.js&lt;/p&gt;

&lt;p&gt;Javascript had to have freedom because frontend it not strict and tight like backend development, the artistic needs of the client-side boom of React and prior created a fairly loose ecosystem with not many rules and restrictions.&lt;/p&gt;

&lt;p&gt;Were other languages existed on the server for over a decade Javascript wants to make an entrance, it is easy to use the language due to its simple syntax nature and also it is convenient to have the same programming language for frontend and backend development.&lt;/p&gt;

&lt;h3&gt;
  
  
  One Codebase
&lt;/h3&gt;

&lt;p&gt;This is something I want to talk about. Prior to 2009 before Shopify officially launched its platform we didn’t have a lot of interactivity with backend services. The bad nature of Javascript was good enough for the web at that times and the few big web platform existed at that time, used PHP as a backend and Frontend like Facebook, if they had more needs they used Java as a backend. The interactivity with API’s was bad and something needed to change.&lt;/p&gt;

&lt;p&gt;Node.js helped developers do what they wanted, to make the web a seamless experience for development and not having to use different languages for the same set of features. Initially the performance of Nodejs was bad, scaling was difficult and something needed to happen.&lt;/p&gt;

&lt;p&gt;Javascript had a lot of problems to solve. The first it had to solve was performance and as nodejs improved performance as well.&lt;/p&gt;

&lt;p&gt;The one codebase for everything was possible but scalability was not there to meet industry standards. Type-safety was a must and lik Facebook created Hack, Microsoft introduced Typescript.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Modern Problems&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Javascript solved the performance problem, it might not be as fast as Go or Rust but it doesn’t have to. You don’t need crazy performance for web standards and if you do, just create one service in Go or Rust. Let me tell you that the internet as we know it, uses PHP and Ruby at it’s core. They are much slower than Javascript and much more resource intensive.&lt;/p&gt;

&lt;p&gt;Javascript solved the Type-safety problem, so it can be used in larger projects but one last problems hunts Javascript up until a few days ago that we had a big breakthrough.&lt;/p&gt;

&lt;p&gt;Because Javascript is not a language but an ecosystem new features and tools are not build in the language but around it. You end up having 20 config files just to run a small SPA application with 3 endpoints on the backend. The change that we needed is to bundle everything up inside a single thing.&lt;/p&gt;

&lt;p&gt;Put ECMAScript, Types, Linting, Security and formatting in a single bundle. Because right now not only you are lost in dependency hell but coding is difficult because there is not a single standard on how to do things. Other languages like Java, Ruby, Go, Rust or Perl have everything inside the language barriers.&lt;/p&gt;

&lt;h3&gt;
  
  
  The future of Javascript
&lt;/h3&gt;

&lt;p&gt;Ryan Dahl introduced Deno, what Deno is starting to do is bundling everything up. It is very promising.&lt;/p&gt;

&lt;p&gt;Typescript right now with it’s performance, amount of libraries, SDK’s that exist around the language and resources, including the promise that Deno is making, it is going to take over the whole Web Industry.&lt;/p&gt;

&lt;p&gt;Imagine a world where all of these files with their commands are bundled inside a single Javascript Engine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;eslintrc.json&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tsconfig.json&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vite.config.js&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;package.json&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;postcss.config.js&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;.prettierrc&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ecosystem.config.js&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;.husky&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From my poor understanding Javascript is very close, just 3-4 years out, of becoming a no-brainer choice when it comes to web. You want to build microservices, microfrontends, monoliths, scale to 5K requests/sec or just create a simple SPA Javascript will be the one and only solution.&lt;/p&gt;

&lt;p&gt;Give Javascript some time and alternatives for the web like PHP, Ruby or Go will move backwards. Because right now everybody have arguments against Javascript that are valid, yet the future is very promising.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;In conclusion, JavaScript has evolved significantly from its humble beginnings as a simple scripting language for web browsers to a robust ecosystem capable of handling both client-side and server-side applications. Its journey has been marked by continuous improvements in performance, scalability, and type safety, making it a versatile choice for modern web development.&lt;/p&gt;

&lt;p&gt;The introduction of tools like Node.js and frameworks such as React have expanded its capabilities, while innovations like Deno promise to streamline the development process further by integrating various tools and configurations into a cohesive environment.&lt;/p&gt;

&lt;p&gt;With ongoing advancements and a strong community, the future of JavaScript looks promising, offering developers a unified and efficient platform for building the web applications of tomorrow.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>I've Used Every Code Editor: What is the best</title>
      <dc:creator>Sotiris Kourouklis</dc:creator>
      <pubDate>Wed, 02 Oct 2024 05:29:39 +0000</pubDate>
      <link>https://dev.to/sotergreco/ive-used-every-code-editor-what-is-the-best-3nlh</link>
      <guid>https://dev.to/sotergreco/ive-used-every-code-editor-what-is-the-best-3nlh</guid>
      <description>&lt;p&gt;I’ve been a developer for a long time now. I have tried almost every editor out there. I started with Notepad++ when I coded for the first time in C, then moved to Visual Studio, Sublime Text, VSCode, Atom, JetBrains, and now to the latest Zed and Cursor. I’ve even tried Vim for some time. I have to be honest here and not write from excitement but from pure love for coding.&lt;/p&gt;

&lt;p&gt;I am going to give a detailed overview of what features an editor needs for me and what overall is the best. I say overall because in some niche areas, some other editors or IDEs might take the lead. But in general, I am going to give a score from 1 to 10 on each editor in these categories.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Efficiency&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cost&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Coding Speed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extensions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;LLM’s&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Developer Experience&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before we continue, let me explain in more detail what each of the categories means. Efficiency refers to both system resources and the overall performance of the editor, including how it behaves under large projects.&lt;/p&gt;

&lt;p&gt;Cost refers to the pricing of the editor, if any, as well as the pricing of LLMs and extensions.&lt;/p&gt;

&lt;p&gt;Coding Speed comes from both a good UX and the tools integrated into the code editor, along with the features it gives you out of the box.&lt;/p&gt;

&lt;p&gt;Extensions refer to the size of the community around the specific IDE plugins and extensions.&lt;/p&gt;

&lt;p&gt;LLMs refer to the overall usage of LLMs in the editor, what options exist, their cost, and how well they work.&lt;/p&gt;

&lt;p&gt;Developer experience is the overall feeling of the editor. It also considers if the IDE makes you a better developer and what tools it provides for that.&lt;/p&gt;

&lt;p&gt;Before we start I want to say that we are not going to discuss for every editor out there but for the top 5 right-now. VSCode, Cursor, JetBrains, Nvim/Vim, Zed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Efficiency
&lt;/h2&gt;

&lt;p&gt;Let’s start with the category of efficiency. Here, most editors score well. VSCode is doing good, and it shouldn’t, to be really honest. Yet, this shows how much more efficient and lightweight Electron and Typescript can be compared to Java and Kotlin. VSCode and its forks are built around these technologies, making them overall fast. They don’t use many resources, and even on large codebases with hundreds of thousands of files, they perform really well. For me, VSCode uses around 300-350MB of RAM in an idle state on my MacBook. Also, under debugging sessions, the performance stays the same.&lt;/p&gt;

&lt;p&gt;I am not even going to talk about Vim here because, by far, it is the best-performing option except for one of our competitors, which I am going to talk about later. But first, I need to talk about JetBrains and the fact that a piece of software can be that bad.&lt;/p&gt;

&lt;p&gt;Using 3GB of RAM and 28GB of cache storage is really obscure. For me, as much as I like JetBrains and have used its products for a long time, this is something they need to look at. Yes, you heard it right. JetBrains, for 5 projects in total, had 28GB of cache files. I found out randomly when CCleaner always reported 20-30GB to clear from JetBrains, but even when I did, the cache after a few days was full again.&lt;/p&gt;

&lt;p&gt;Their poor performance and efficiency is a big downside for me. To use their IDE properly, you need at least 32GB of RAM, and even then, if you are on battery, it will drain it like crazy compared to other editors.&lt;/p&gt;

&lt;p&gt;Now let’s talk about Zed my favorite editor of all, by the end of the article you will understand why. On idle state it uses around 80-120mb of RAM. But this is not only the case. In terms of performance is the day and night compared with other editors. It never lags, doesn’t use any cache and every pixel deserves it’s position on the screen. This is the power or Rust and a game engine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scores:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
JetBrains: 2/10&lt;br&gt;&lt;br&gt;
VSCode: 7/10&lt;br&gt;&lt;br&gt;
Cursor: 7/10&lt;br&gt;&lt;br&gt;
Zed: 10/10&lt;br&gt;&lt;br&gt;
Vim: 9/10&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost
&lt;/h2&gt;

&lt;p&gt;Cost is really important, and I want to focus on that because nowadays we end up paying $20 per month for everything we use. At first, it might not seem like a lot, but if you pay for 10 subscriptions per month, it adds up. The good old days of the web are gone; if something wasn't free, it costed $5.&lt;/p&gt;

&lt;p&gt;I want to start with Cursor. It is expensive. It costs $20 per month and gives you 500 fast requests. For me, after 15 days of coding, I didn't have any more requests. So I had to pay an extra $20 to get 500 more. If you think about it, 500 requests are not much, especially if you code and debug a lot.&lt;/p&gt;

&lt;p&gt;Besides that, I don't think they offer anything else. You pay the money just for the LLMs. I don't know how much it costs them, but they could easily try not to drain their customers and go to a more reasonable subscription model, like providing the API keys for the models as Zed does. Or they could close a special deal with Anthropic, cut the pricing in half, and use only Anthropic for their fast requests.&lt;/p&gt;

&lt;p&gt;I believe there are a lot of solutions, and if they wanted, they could be cheaper. JetBrains is around $30/month for all of their IDEs, but if you use their products for a long period of time, the pricing lowers significantly. For me, it was around $18/month after 2 years of usage.&lt;/p&gt;

&lt;p&gt;I want to mention here that on JetBrains most of the plugins are free, but on top of your subscription you have to use your own LLM so for me was $10 per month more for the Copilot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Score:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
JetBrains: 4/10&lt;br&gt;&lt;br&gt;
VSCode: 10/10&lt;br&gt;&lt;br&gt;
Cursor: 4/10&lt;br&gt;&lt;br&gt;
Zed: 10/10&lt;br&gt;&lt;br&gt;
Vim: 10/10&lt;/p&gt;

&lt;h2&gt;
  
  
  Coding Speed
&lt;/h2&gt;

&lt;p&gt;Now let’s talk about coding efficiency—how productive you are with each editor. I must say this depends on your experience level. Some editors, like JetBrains, might be better for less experienced developers because it gives them more tools and out-of-the-box features to work with. I am going to talk from the standpoint of an experienced developer, as I’ve been coding for more than 7 years now and have built a lot of large web projects.&lt;/p&gt;

&lt;p&gt;Vim is said to make you much more productive, yet I don’t believe that. I’ve spent a good amount of time learning to use nvim seamlessly, but let’s be honest here, you can just use VSCode with vim keybindings. Vim is a bit more for coding geeks and is fun to code on for your side projects. You might be slower, but it is worth it sometimes.&lt;/p&gt;

&lt;p&gt;The only developers I know who code fast on vim are those who have either used it for 10 years or are really, really good with computers in general.&lt;/p&gt;

&lt;p&gt;Now that we got that out of the way, the next in line is Cursor. Their auto-complete feature as a Copilot alternative is impressive. It works so well that on simple web projects, I don’t really write code; 90% of the time, I just hit tab. Your productivity with Cursor skyrockets, but this comes with some downsides, which I will discuss later.&lt;/p&gt;

&lt;p&gt;JetBrains is good here; it offers a solid set of tools to make you code faster, but nothing that VSCode doesn’t have. Their debugging is better, and so is its Git integration, but if you are an experienced dev, it doesn’t really make a difference.&lt;/p&gt;

&lt;p&gt;Zed, on the other hand, would be in the same position as VSCode and Cursor for me, but it lacks a debugger, so it loses a lot of points for that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Score:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
JetBrains: 8/10&lt;br&gt;&lt;br&gt;
VSCode: 7/10&lt;br&gt;&lt;br&gt;
Cursor: 10/10&lt;br&gt;&lt;br&gt;
Zed: 6/10&lt;br&gt;&lt;br&gt;
Vim: 3/10&lt;/p&gt;

&lt;h2&gt;
  
  
  Extensions
&lt;/h2&gt;

&lt;p&gt;Extensions are a crucial part of your coding speed. This is because IDEs can't support every language out-of-the-box. They need to support LSPs, plugins, etc. From my perspective, extension-based editors like VSCode are better than having everything bundled in, like JetBrains. This is because there are features you might not actually need, and they take resources from your system.&lt;/p&gt;

&lt;p&gt;As a marketplace for extensions, VSCode is the king, but JetBrains has a lot as well. The truth is that in both environments, you can basically find an extension for everything. Vim doesn't hold back either; it might seem at first that it is less extendable, but the truth is Vim has endless extensions to choose from.&lt;/p&gt;

&lt;p&gt;Also, in this section, I will include how customizable each editor is. For this, Vim might actually take the lead because not only does it have extensions to choose from, but also with Lua, you can customize it however you want, something that is not directly available to all the other IDE’s.&lt;/p&gt;

&lt;p&gt;Zed has a very immature marketplace, yet this is completely normal because it is not in version 1 yet. I believe in the next 2-3 years it will have as many plugins as VSCode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Score:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
JetBrains: 7/10&lt;br&gt;&lt;br&gt;
VSCode: 8/10&lt;br&gt;&lt;br&gt;
Cursor: 8/10&lt;br&gt;&lt;br&gt;
Zed: 5/10&lt;br&gt;&lt;br&gt;
Vim: 9/10&lt;/p&gt;

&lt;h2&gt;
  
  
  LLM’s
&lt;/h2&gt;

&lt;p&gt;Now let’s talk about something I have been eager to write about, but saved for the end because there is a lot to discuss. First, we need to talk about LLMs in general. LLMs just provide an API; how each IDE utilizes that API is what is important. This is what we are going to discuss: how well an IDE works with these models.&lt;/p&gt;

&lt;p&gt;But what is considered good utilization of LLMs? For me, it is not about how much code they produce. You might say Cursor is the king here, but this is not true. For me, Cursor is the worst of all. The reason is that it might have very good autocomplete from a performance and output standpoint, but compared to GitHub Copilot, it is much worse. Let me tell you why.&lt;/p&gt;

&lt;p&gt;Autocomplete on Cursor gives you a lot of code, so much that when I code on Cursor, I don’t really write code anymore. I won’t get too deep into this topic because I wrote an article about it, which you can find here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sotergreco.com/what-llms-for-coding-should-actually-look-like" rel="noopener noreferrer"&gt;https://sotergreco.com/what-llms-for-coding-should-actually-look-like&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But what I have to say is that not coding is really bad because you lose touch with the codebase and you don’t actually know what you are coding.&lt;/p&gt;

&lt;p&gt;What is more important, in my opinion, is the interface you have. Cursor has a simple chat window. It is like having ChatGPT chat open, but inside your text editor. You can also add files as context. What makes Cursor different from other IDEs is that you have context and can choose the model you want. But for me, Cursor should have been a VSCode extension and not a different editor. What Cursor does can be done easily with an extension.&lt;/p&gt;

&lt;p&gt;The best experience I had with an LLM interface for coding was with Zed. This is something you actually need to take a look at. It doesn’t treat the chat as a regular chat but as a separate editor window with many unique features. I could talk about this for much longer, but it’s better if you take a look at it yourself and try it.&lt;/p&gt;

&lt;p&gt;I believe there is much improvement to be made on this area, the first step towards a better solution has been made only by Zed so far, but I hope in the future to see even better implementations.&lt;/p&gt;

&lt;p&gt;With that said, let's give the scores. Vim also has extensions for this, so it isn't much different from the alternatives; it is just a little difficult to set up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Score:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
JetBrains: 4/10&lt;br&gt;&lt;br&gt;
VSCode: 4/10&lt;br&gt;&lt;br&gt;
Cursor: 5/10&lt;br&gt;&lt;br&gt;
Zed: 7/10&lt;br&gt;&lt;br&gt;
Vim: 4/10&lt;/p&gt;

&lt;h2&gt;
  
  
  Developer Experience
&lt;/h2&gt;

&lt;p&gt;Now for our final comparison, we will talk about the most important aspect: developer experience. This is about how easy, fun, and effective it is to code in each editor.&lt;/p&gt;

&lt;p&gt;Starting with JetBrains, for me, the developer experience, except for Java development, is really bad. Having 20 different editors is a really bad decision made by the company. It should have been one IDE from the beginning. Only for this, JetBrains loses the game for me.&lt;/p&gt;

&lt;p&gt;Continuing with Vim, I have to say, it is challenging and unique to work with. Yet, the ability to customize it as you want and make quick changes to any file from anywhere is amazing. Also, Vim is not boring at all and is fun. In terms of difficulty and learning curve, Vim loses a lot of points, but the overall score is not going to be bad.&lt;/p&gt;

&lt;p&gt;VSCode is the king of editors. This is no luck for me; VSCode was and will always be an overall winner. It is fast enough, extendable enough, and customizable enough. It has enough of everything. As a development experience, I can’t say it is bad; rather, I’d say it is great. Cursor also goes into the same bucket with VSCode, but it gets fewer points because it is expensive.&lt;/p&gt;

&lt;p&gt;Before I continue, an important thing for me is Open Source. This is part of the developer experience because not only can you see the future logs, be part of the community, and solve any problems you might have with a PR quickly, but it also shows respect to the programming world and the community in general. It shows developers that you are not there to exploit them and that you actually care about something.&lt;/p&gt;

&lt;p&gt;Zed takes extra points for that because it open-sourced the entire codebase. This is not a normal project. The people behind Zed actually made a breakthrough in IDEs; we had years to see something new. The only new thing was IntelliJ when it came out, which is actually bad software. Yet Zed made a game engine and approached coding as a game on a programming language of the future. Rust might be low-level and super fast, but it is also relatively easy to code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Score:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
JetBrains: 5/10&lt;br&gt;&lt;br&gt;
VSCode: 8/10&lt;br&gt;&lt;br&gt;
Cursor: 8/10&lt;br&gt;&lt;br&gt;
Zed: 8/10&lt;br&gt;&lt;br&gt;
Vim: 6/10&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s talk the look at the final results.
&lt;/h2&gt;

&lt;p&gt;The results might surprise you, and to be honest, they surprised me too. At first, I thought VSCode would be the winner, but with a better performance score and LLM usage, Zed took first place.&lt;/p&gt;

&lt;p&gt;I want to say that for some niche engineers, another solution might be better because they might have different needs. But for a Senior Engineer working on multiple projects and doing a bit of everything, I think the results are actually correct.&lt;/p&gt;

&lt;p&gt;For Java or Kotlin developers, JetBrains wins. For competitive coders with a 192 IQ, Vim wins. For frontend junkies who just want output performance, Cursor is the best.&lt;/p&gt;

&lt;p&gt;For beginners, VSCode is great. Yet for a Senior Engineer working on multiple projects with different languages and wanting a daily driver, Zed, despite being in the beta phase, is the overall best solution.&lt;/p&gt;

&lt;p&gt;Jetbrains: 30 -&amp;gt; 5/10&lt;br&gt;&lt;br&gt;
VScode: 44 -&amp;gt; 7.3/10&lt;br&gt;&lt;br&gt;
Cursor: 42 -&amp;gt; 7/10&lt;br&gt;&lt;br&gt;
Zed: 46 -&amp;gt; 7.6/10&lt;br&gt;&lt;br&gt;
Vim: 41 -&amp;gt; 6.8/10&lt;/p&gt;

&lt;p&gt;Thanks for reading, and I hope you found this article helpful. If you have any questions, feel free to email me at &lt;a href="//mailto:x@sotergreco.com"&gt;&lt;strong&gt;x@sotergreco.com&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;, and I will respond.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can also keep up with my latest updates by checking out my X here: &lt;a href="http://x.com/sotergreco" rel="noopener noreferrer"&gt;&lt;strong&gt;x.com/sotergreco&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vscode</category>
    </item>
    <item>
      <title>What 10,000 Hours of Coding Taught Me: Success in Software Development</title>
      <dc:creator>Sotiris Kourouklis</dc:creator>
      <pubDate>Sun, 29 Sep 2024 07:22:23 +0000</pubDate>
      <link>https://dev.to/sotergreco/what-10000-hours-of-coding-taught-me-success-in-software-development-nhi</link>
      <guid>https://dev.to/sotergreco/what-10000-hours-of-coding-taught-me-success-in-software-development-nhi</guid>
      <description>&lt;p&gt;Related to my previous article &lt;a href="https://sotergreco.com/what-10000-hours-of-coding-taught-me-dont-ship-fast" rel="noopener noreferrer"&gt;“What 10,000 Hours of Coding Taught Me: Don't Ship Fast“&lt;/a&gt;, I want to further expand on the subject of performance and efficiency, not of your application, but of you as an engineer.&lt;/p&gt;

&lt;p&gt;I mentioned that coding is not writing; it is architecture. A good architect is not distinguished by his ability to design a building that will withstand a tsunami or an earth-splitting earthquake, but by his ability to utilize the available space and budget of his customer in the best way possible.&lt;/p&gt;

&lt;p&gt;The same principles apply to engineers. Programming has always been about architecture, but now with LLMs, this is more evident. Knowledge of syntax no longer matters as much. So, the terms "coder" or "programmer" are becoming outdated. These terms will soon apply to LLMs. If you are a coder, you will be called a "Software Architect." The rest will mostly be replaced by LLMs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Past vs Today
&lt;/h2&gt;

&lt;p&gt;In the past, I knew engineers who actually remembered every little syntax quirk from a language or framework. They knew their tech stack so well that they were considered top-tier just by knowing how to utilize their tech stack in the best way possible. They didn’t use Google that much because they remembered almost everything. These kinds of people were really efficient. When we are new to a language or framework, we spend a lot of time googling and reading docs.&lt;/p&gt;

&lt;p&gt;Junior Engineers back-in the day, were told to stick to a language or ecosystem and don’t move around much. That way you would become efficient and output much more code. Because 50,000 lines of code 5 years ago, were actually written by people now out of 50,000 lines almost 40,000 are generated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The “Kings“ of software &amp;amp; Portability Problems&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Moving on to those who not only knew their framework well but also knew how to design and make software production-ready, these were the "Kings" of software. If you had experience with architecture and system design principles and knew your stack thoroughly, you paved your way to the top.&lt;/p&gt;

&lt;p&gt;Yet there was a huge gap between companies even for those people. Engineers no matter their experience or background they were not much portable. Even if you wrote software for years with Java you could not easily be moved to R or Python. You would lose at least 2-3 months to learn the syntax, quirks and features of that language and the frameworks it uses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The “Big“ Merge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Suddenly, LLMs appeared. In simple terms, what LLMs did was bring the entirety of Stack Overflow and Google to your fingertips with the “tab“ keystroke. As simple as it sounds, this is really important. It essentially removed the gap between languages and technologies, merging everything into one universal interpretation.&lt;/p&gt;

&lt;p&gt;It allowed senior engineers to transition from one language to another without needing to study the documentation extensively, reducing the three months typically needed to learn a new technology to almost zero.&lt;/p&gt;

&lt;p&gt;Under the hood, all languages and frameworks share the same philosophy. The syntax might change, or some patterns might differ, but system design patterns remain consistent across software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory doesn’t matter anymore&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, remembering things isn’t really important anymore. You don’t need to stick to a technology or framework anymore. So the equation for being in the top 1% went from &lt;em&gt;Output + System Design&lt;/em&gt; &lt;em&gt;Knowledge&lt;/em&gt; to just &lt;em&gt;System Design Knowledge&lt;/em&gt;. This did both Good and Bad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Good&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you didn’t know much about System Design and Architecture principles but were really good with memory and coded fast, you could hack your way into bigger companies or get accepted more easily. Your lack of actual knowledge was covered by your output and performance because you were addicted to Python, for example, and knew all the syntax for Python and every Python framework or tool really well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Bad&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As output doesn’t really matter anymore, it will get much harder for Junior or Mid Engineers to find jobs. Because an LLM equals 3 Juniors. So, projects that were built by 1 Senior and 3 Juniors are now built by a Senior, an LLM, and maybe a Mid to help around.&lt;/p&gt;

&lt;p&gt;This will cut the job positions maybe in half, but will open the way for actually good Engineers who were overshadowed by the performance of “code” junkies, as I call them. These are people with no actual programming skills but who coded for years in one language or framework and know it really well.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bubble Of Coding Jobs
&lt;/h2&gt;

&lt;p&gt;Around 7 years ago, maybe a bit more, the job market for developers exploded. People with little to no experience started getting paid huge amounts of money because there were simply not enough coding hands to keep up with the demand of the job market.&lt;/p&gt;

&lt;p&gt;Kids that were 17, 18 years old, or even younger were hired by companies, getting paid 20-30K per year just by having “React” on their LinkedIn profile. Their skill was actually 0. But nature has to keep its balance in some form or another. Things have to return to their natural state eventually.&lt;/p&gt;

&lt;p&gt;Companies with over 7,000 employees, like Twitter, fired almost 5,000 of them. Then more companies followed.&lt;/p&gt;

&lt;p&gt;Things are just getting started. From my poor understanding, I see that in the next 5 years, 80% of the coding jobs market will be gone. Only Seniors will exist. This is the start of the end for all the Junior and most Mid developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  In a nutshell
&lt;/h2&gt;

&lt;p&gt;We have to conclude that LLMs are a revolution, starting to filter out engineers so, only the best will survive. But I don't want Juniors to be disappointed because the barrier to entry for programming has become even smaller. It will just be a bit harder to find a job.&lt;/p&gt;

&lt;p&gt;However, you can always build your own projects, which is why Indie Hacking has also exploded. People who might not be great developers in a company can now make a living by creating their own software and monetizing it.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and I hope you found this article helpful. If you have any questions, feel free to email me at &lt;a href="//mailto:x@sotergreco.com"&gt;&lt;strong&gt;x@sotergreco.com&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;, and I will respond.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can also keep up with my latest updates by checking out my X here: &lt;a href="http://x.com/sotergreco" rel="noopener noreferrer"&gt;&lt;strong&gt;x.com/sotergreco&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>What 10,000 Hours of Coding Taught Me: Don't Ship Fast</title>
      <dc:creator>Sotiris Kourouklis</dc:creator>
      <pubDate>Sat, 21 Sep 2024 15:03:08 +0000</pubDate>
      <link>https://dev.to/sotergreco/what-10000-hours-of-coding-taught-me-dont-ship-fast-1ocb</link>
      <guid>https://dev.to/sotergreco/what-10000-hours-of-coding-taught-me-dont-ship-fast-1ocb</guid>
      <description>&lt;p&gt;I’ve been an engineer for over 7 years now. I have worked on countless projects in backend, frontend, and DevOps. I don’t consider myself a great engineer; there are people out there who are not only smarter but also more experienced. Over the years, I have learned some tricks to help me climb the programming ladder, allowing me to build software that is reliable and easy to work with.&lt;/p&gt;

&lt;p&gt;Being slow has made me code faster, ship more, and be more productive in general. This didn’t come only from years of coding but also from life lessons and my religion. As an Orthodox Christian, you have to always be slow and not rush your moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The #1 Problem with Software
&lt;/h2&gt;

&lt;p&gt;Most people, when they start to code, think that great engineers are magicians who build applications in a unique way that no one can understand. That is very far from the truth. If you actually take a look at great engineers' code, you will find it very simple and easy to navigate and understand.&lt;/p&gt;

&lt;p&gt;Your application doesn’t need to be fast, fancy, or use cutting-edge technology for you to be considered a good programmer. Managers also make that mistake. They hire people based on things that are far from the truth.&lt;/p&gt;

&lt;p&gt;Giving coding tests where you have to build an application from scratch is a terrible way to judge someone's skills. Whiteboard interviews are actually better than coding challenges that give you 3 days to complete because at least they take a look at your IQ and your way of thinking.&lt;/p&gt;

&lt;p&gt;Now, let's talk about the #1 problem that everyone should focus on but often overlooks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer Experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the most important thing in the entire project 99% of the time. Because everybody wants to ship fast to make money, but they end-up building 90% of the application in 1 month and the last 10% takes them 3 months to finish.&lt;/p&gt;

&lt;p&gt;Developers are also hyped up for new projects so they try to take the quick dopamine to just have something to showcase as fast as possible and make there managers happy as well.&lt;/p&gt;

&lt;p&gt;They end-up making there managers happy, yet in the long-run everybody is panicking and they are considering refactoring or even building the application from scratch after 4-5 years.&lt;/p&gt;

&lt;p&gt;That’s why actually creating features becomes really hard and even harder to push them to production. This creates a snowball effect.  &lt;/p&gt;

&lt;p&gt;Let’s take a look at 2 code examples. We have 2 controllers that get the trending users from our database and attach emojis to them. This is from one of my open-source projects &lt;a href="http://eporanger.xyz" rel="noopener noreferrer"&gt;reporanger.xyz&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is the controller that is being called from the routes. In there we have all the functionality as well as a try-catch block to check for any errors as well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// users.controller.ts&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getTrendingUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;_next&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextFunction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;events&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;GithubEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;event_date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;MoreThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;event_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DESC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;take&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="p"&gt;});&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Username&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;In&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username_id&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;topUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getTopUsers&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trendingUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;emoji&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;emojiService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getEmoji&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;topUsers&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;})),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Trending users fetched successfully&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;trendingUsers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error fetching trending users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;success&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="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;Here is the same controller but we’ve used one simple principle: &lt;strong&gt;Unique Responsibility&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We spitted our code in 4 smaller re-usable files:&lt;br&gt;&lt;br&gt;
&lt;code&gt;user.controller.ts&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;user.service.ts&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;async.util.ts&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;response.util.ts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This help’s us in many more ways than we can understand.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;We can re-use the &lt;code&gt;user.service.ts&lt;/code&gt; everywhere in our application we want. For example on a cron-job we can do &lt;code&gt;usernameService.getTrendingUsers();&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We removed every try-catch block to make the code cleaner. We also log every error (&lt;code&gt;logger('error', error);&lt;/code&gt;). This way, we can easily create an error service later that stores all errors in the database for future use-cases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We have unified responses for all of our controller with the &lt;code&gt;resFn&lt;/code&gt; &lt;strong&gt;,&lt;/strong&gt; this is really important because we make sure that all of the request will return that same response by just using a simple generic as you can see below.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Developing a new controller is now 10X easier, because our coding architecture is seamless across our entire application. Even if another developer wrote code it wouldn’t make a difference on the coding style.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// user.controller.ts&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getTrendingUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;asyncFn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;_next&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextFunction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trendingUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;usernameService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTrendingUsers&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;resFn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Trending users fetched successfully&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;trendingUsers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// user.service.ts&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getTrendingUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;events&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;GithubEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;event_date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;MoreThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;event_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DESC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;take&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="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Username&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;In&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username_id&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;topUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getTopUsers&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usersWithEmoji&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;emoji&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;emojiService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getEmoji&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;topUsers&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;})),&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;usersWithEmoji&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// async.util.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;asyncFn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;asyncPropsFunction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextFunction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// response.util.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resFn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;success&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;IResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;suc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;success&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;success&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;suc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// response.interface.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&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;Now imagine if we didn’t implement a good architecture from the beginning and wanted to change something small across the application in the future. Even if we just wanted to log our errors, we would have to go to all of our controllers and add &lt;code&gt;logger('error', error);&lt;/code&gt;. Or if we wanted to add a sixth field to our response, for example, &lt;code&gt;metadata&lt;/code&gt;. It would be a nightmare.&lt;/p&gt;
&lt;h2&gt;
  
  
  Do the Refactoring First
&lt;/h2&gt;

&lt;p&gt;Refactoring should be done before you write your code. What I mean by this is that eventually, every application needs refactoring. Refactoring a relatively big software, for example, with over 70,000 lines of code, can take 30-40 hours and also create a lot of errors and bugs in the process.&lt;/p&gt;

&lt;p&gt;You might end up breaking the application or spending 20 more hours testing it. Also, when you reach a size this large, the refactoring won’t be as good as if you did it in the beginning.&lt;/p&gt;

&lt;p&gt;What I propose is to spend your first 40-50 hours planning and refactoring. Just create a few controllers, brainstorm how that would scale in the future, refactor, and then continue.&lt;/p&gt;

&lt;p&gt;Yes, your manager might scream in the beginning because you spent 50 hours coding and have almost nothing to showcase except a good architecture that will scale that no-one understand. But if you have the option to do it, then do it. It will save a ton of headaches for not only you but future developers as well.&lt;/p&gt;

&lt;p&gt;Unit testing is also really important. Don’t be crazy with it just have at least 60% coverage and you are good to go. It will save you tones of bugs in the future.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pre-commit Checks
&lt;/h2&gt;

&lt;p&gt;This is very important. For JavaScript/TypeScript projects, we have Husky, but there are many alternatives for every language or framework out there. Husky is a tool that runs some commands before you commit your code. If got throw an error, the commit won't pass. Here is an example &lt;code&gt;.husky&lt;/code&gt; configuration from &lt;a href="http://reporanger.xyz" rel="noopener noreferrer"&gt;reporanger.xyz&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Lint Check&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run Tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prettify&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This 3 simple steps will make your codebase. 10X better.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
npx eslint &lt;span class="nt"&gt;--max-warnings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 src api/src &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"ESLint check failed. Commit aborted."&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; ./api &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npx jest &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Tests failed. Commit aborted."&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; .. &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npx prettier &lt;span class="nt"&gt;--write&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
git update-index &lt;span class="nt"&gt;--again&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  In a nutshell
&lt;/h2&gt;

&lt;p&gt;There are many things you could do to improve your code. But the things that I mentioned are not even hard to implement. Especially now with LLM’s the problem is that you are bored to do them not that you can’t.&lt;/p&gt;

&lt;p&gt;Throw boredom out of the window and you will get many blessings. Start coding with love and not for money. If you do that, you will make more money, make your co-workers happy and your managers will thank you.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Because Coding is not writing, it is Αrchitecture.&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Thanks for reading, and I hope you found this article helpful. If you have any questions, feel free to email me at &lt;a href="//mailto:x@sotergreco.com"&gt;&lt;strong&gt;x@sotergreco.com&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;, and I will respond.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can also keep up with my latest updates by checking out my X here: &lt;a href="http://x.com/sotergreco" rel="noopener noreferrer"&gt;&lt;strong&gt;x.com/sotergreco&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>programming</category>
    </item>
    <item>
      <title>Profit Takes Priority Over Quality Today</title>
      <dc:creator>Sotiris Kourouklis</dc:creator>
      <pubDate>Fri, 20 Sep 2024 10:57:59 +0000</pubDate>
      <link>https://dev.to/sotergreco/profit-takes-priority-over-quality-today-5cap</link>
      <guid>https://dev.to/sotergreco/profit-takes-priority-over-quality-today-5cap</guid>
      <description>&lt;p&gt;With the launch of the new iPhone and iOS 18 we conclude that it terms of hardware we don’t have any improvements. Technology is starting to become more and more feature based and not hardware based.&lt;/p&gt;

&lt;p&gt;More RAM or a better CPU doesn’t really matter anymore because we reached to a point that there are not any major improvements in terms of speed, even if we have a better CPU.&lt;/p&gt;

&lt;p&gt;But for the last few years with the raise of LLMs as well, new features are easier to implement than ever. Also you can’t really compete anymore in terms of features because there are thousands of startups launching every day that for sure out compete you in terms of features.&lt;/p&gt;

&lt;p&gt;4-5 years ago it was harder for a startup to launch and it took much time to build the product. Now on Product Hunt we have over 100 launches per week. Most of the products are actually good.&lt;/p&gt;

&lt;h2&gt;
  
  
  More features more problems.
&lt;/h2&gt;

&lt;p&gt;Companies are starting to launch more stupid, useless features to justify higher prices and make investors happy. They are don’t really needed. This happens because people think that speed is the key, but you can always run as fast. Speed has a limit, efficiency and quality doesn’t.&lt;/p&gt;

&lt;p&gt;Profit is now the new God for these companies. As we know from history having money as God is not the best thing to do. They have to make more money. Doesn’t really matter if the make millions or billions they just have to make more money.&lt;/p&gt;

&lt;p&gt;This is why I love more value or efficiency driven companies like X, TinyGrad or Comma.ai. Yes they care about money, but it is not their primary goal.&lt;/p&gt;

&lt;p&gt;Competing in terms speed, will always make your product more expensive not necessarily better. Let’s take for example OpenAI. They released their faster model in terms of speed last. First they hyped up to sell more on their powerful models that are too expensive to use anyway. Just for the shake of profit.&lt;/p&gt;

&lt;p&gt;They don’t really about people, people are just numbers for them. They want money and they will do anything about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is quality?
&lt;/h2&gt;

&lt;p&gt;Being efficient means not having millions in the bank doing nothing. Startups making over $50k per month with just one employee are often overpriced and making more money than needed.&lt;/p&gt;

&lt;p&gt;Monetization and speed are the main goals of most SaaS businesses because they want more profit. The money they make isn't always put to good use. Don't get me wrong, there's nothing wrong with profit, but software is becoming expensive because we've stopped coding with passion.&lt;/p&gt;

&lt;p&gt;UX suffers as platforms like YouTube put ads everywhere, making it hard to watch videos. Most social media platforms allow ads on almost any topic, focusing on money rather than user experience.&lt;/p&gt;

&lt;p&gt;Companies like roadmap.sh or Telegram actually care about their users and the value they provide. They don't make as much money, but you get a product that's free or has minimal monetization, making a fair amount of money while offering a beneficial tool or app.&lt;/p&gt;

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

&lt;p&gt;Stop caring about the money and starting to work with love is going to make not only the community better but also the world. Because we may not understand it but as engineers our job can actually make the world a better place.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and I hope you found this article helpful. If you have any questions, feel free to email me at &lt;a href="//mailto:x@sotergreco.com"&gt;&lt;strong&gt;x@sotergreco.com&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;, and I will respond.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can also keep up with my latest updates by checking out my X here: &lt;a href="http://x.com/sotergreco" rel="noopener noreferrer"&gt;&lt;strong&gt;x.com/sotergreco&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>The Decline of the OpenSource Community: What Happened?</title>
      <dc:creator>Sotiris Kourouklis</dc:creator>
      <pubDate>Mon, 16 Sep 2024 07:21:03 +0000</pubDate>
      <link>https://dev.to/sotergreco/the-decline-of-the-opensource-community-what-happened-2jpg</link>
      <guid>https://dev.to/sotergreco/the-decline-of-the-opensource-community-what-happened-2jpg</guid>
      <description>&lt;p&gt;Hello, my fellow software engineers. We need to address the decline of free and open-source software urgently. The rise of internet money gurus is starting to undermine our values as developers and engineers.&lt;/p&gt;

&lt;p&gt;Everyone admires levelsio, Marc Lu or any other Indie Hacker, but I believe they contribute to the decline of the free and open-source community. Now, I spend at least $100 on subscriptions because everything is profit-driven, not value-driven.&lt;/p&gt;

&lt;p&gt;Although I respect these individuals and do not wish to criticize them, I want to discuss and offer a different perspective on the reasons behind this decline, as many developers have shifted their focus from value to revenue.&lt;/p&gt;

&lt;h3&gt;
  
  
  Profits, profits ,profits
&lt;/h3&gt;

&lt;p&gt;Everyone is becoming a developer nowadays, with the rise of LLM’s creating simple web apps that you can monitize has become easier than ever. Milking your followers is the new trend and they congratulate you as well for showing your profits online.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2fngrr7x0sit0q93p9u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2fngrr7x0sit0q93p9u.png" alt="Image description" width="396" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While most of the software that is being created is actually useful and these people provide value in some form, this capitalist point of view is slowly digging our grave. As a Christian myself I don’t want to allow money be my God. This is what has happened to a lot of people. It is tempting in the beginning because you see your dream life in-front of you but we have stopped caring about what actually matters in this life helping and loving our neighbor.&lt;/p&gt;

&lt;p&gt;This is what the free and open source community did, actually helped people and made money on the side as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Greed &amp;amp; money over humility and value
&lt;/h3&gt;

&lt;p&gt;We have become soulless creatures driven by numbers on a screen. Engineering has always been a high-paying job. Most real engineers never struggle financially. Many of you work 4-5 hours per day and earn between $30-100K per year on average.&lt;/p&gt;

&lt;p&gt;So, why do you want to make an extra $100K on the side? Yes, it would be great to earn an extra 100K on top of your salary, but why not make $30K and also help and provide some value to the world?&lt;/p&gt;

&lt;p&gt;I am not saying to lower your prices or offer truly free plans, and not fake free tiers just for the sake of being free. I am saying to make part of your code or even your entire code open-source. Even doing the correct thing for the bad reasons can actually help the community. Zuck the CEO of Meta is open-sourcing everything for the wrong reasons but he has provided endless value to the world.&lt;/p&gt;

&lt;p&gt;We have forgotten fun and we have added stress to our lives.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;I would like to see the current Indie-Hackers and big Tech to open-source their work, share code from what they do and lower and prices of their products. Yes you will make less money but what role money plays when you lose your soul?&lt;/p&gt;

&lt;p&gt;These people don’t care about the world, they care about money and they have made money their Gods. They don’t have fun and they don’t love what they do, profit is their God and only goal.&lt;/p&gt;

&lt;p&gt;So I started by creating an open-source software to get things going and make the first move with &lt;a href="https://reporanger.xyz" rel="noopener noreferrer"&gt;reporanger.xyz&lt;/a&gt; an AI-powered Github leaderboard. You can find the code on &lt;a href="https://github.com/vanguardvirtual/repo-ranger" rel="noopener noreferrer"&gt;Github&lt;/a&gt; and contribute to it as well.&lt;/p&gt;

&lt;p&gt;Let’s remember the old days were we coding with love and not greed. Let’s start building again and not milking our followers.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and I hope you found this article helpful. If you have any questions, feel free to email me at &lt;a href="//mailto:x@sotergreco.com"&gt;&lt;strong&gt;x@sotergreco.com&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;, and I will respond.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can also keep up with my latest updates by checking out my X here: &lt;a href="http://x.com/sotergreco" rel="noopener noreferrer"&gt;&lt;strong&gt;x.com/sotergreco&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AI-powered Github leaderboard.</title>
      <dc:creator>Sotiris Kourouklis</dc:creator>
      <pubDate>Sat, 14 Sep 2024 11:26:43 +0000</pubDate>
      <link>https://dev.to/sotergreco/ai-powered-github-leaderboard-5gba</link>
      <guid>https://dev.to/sotergreco/ai-powered-github-leaderboard-5gba</guid>
      <description>&lt;p&gt;I've built an AI-powered Github leaderboard It analyzes your Github activity and based on your score (💯) you win a clap (👏) or a poo(💩). Top 10 will get 🌟.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reporanger.xyz/" rel="noopener noreferrer"&gt;Repo-Ranger&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find the code here: &lt;a href="https://github.com/vanguardvirtual/repo-ranger" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let me know what you think, I am going to launch it on PH on Sept 29th.&lt;/p&gt;

&lt;p&gt;What is your score?&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>How I Went from a Broke 15-Year-Old Employee to Launching My First SaaS Product</title>
      <dc:creator>Sotiris Kourouklis</dc:creator>
      <pubDate>Mon, 24 Jun 2024 15:14:01 +0000</pubDate>
      <link>https://dev.to/sotergreco/how-i-went-from-a-broke-15-year-old-employee-to-launching-my-first-saas-product-3a0o</link>
      <guid>https://dev.to/sotergreco/how-i-went-from-a-broke-15-year-old-employee-to-launching-my-first-saas-product-3a0o</guid>
      <description>&lt;p&gt;Two months ago, I started developing a free &lt;a href="https://linkinbio.cc/"&gt;Link-In-Bio&lt;/a&gt; tool that pays users for each click. It's not finished yet, but it's getting there.&lt;/p&gt;

&lt;p&gt;I don't usually do interviews, but a friend suggested I share my story. So here I am, talking about how I went from a broke 15-year-old employee to starting my first SaaS business &lt;a href="https://linkinbio.cc/"&gt;Linkinbio&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This idea can help many creators and businesses, and I’d love your opinion on how to move forward and what do you think about the app. My story may inspire some of you to keep going despite setbacks.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here's a quick overview of the article:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Broke and lost at 15 years old.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Waking up at 4 AM to work before school.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finding my first job, being taken advantage of, and not getting paid.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Starting my first business and failing after losing $60K.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How I started Linkinbio.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without further ado...&lt;/p&gt;

&lt;h2&gt;
  
  
  Hello Sotiris, Who are you and what is your background?
&lt;/h2&gt;

&lt;p&gt;Hello Michael, I am a 22-year-old software engineer from Greece with an interest in Indie Hacking and entrepreneurship. But it wasn't always this way. As a kid, I was lost and faced many setbacks before I could develop my first business idea.&lt;/p&gt;

&lt;p&gt;Like many kids, I dreamed of becoming a professional athlete. I played basketball, but things didn't turn out as I hoped. Injuries were a big part of it, and there wasn't much money to be made from it.&lt;/p&gt;

&lt;p&gt;I didn't think about money as a kid, but when the economic crisis of 2008 hit Greece, my family struggled. A few years later, I wanted to earn my own money to cover my basic expenses, like school lunch, upcoming university costs, and basketball practices, as my parents couldn't afford everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what did you do to face these challenges?
&lt;/h2&gt;

&lt;p&gt;My father told me that I could go to university and then find my first job. But due to the economic situation back then, I wanted money immediately and couldn't wait 10 years to finish school and university to start making money. I needed something now.&lt;/p&gt;

&lt;p&gt;Call it fate, but that year a new student joined our school. He was a nerdy-looking kid that almost no one talked to. Despite the economic situation, my father taught me valuable lessons like "never judge someone by their cover." So after a couple of months, I finally talked to him.&lt;/p&gt;

&lt;p&gt;That young kid, at 15 years old, told me he made $1,000 from creating websites. What? $1,000? This was so much money for me back then; I could literally cover my expenses for the entire year.&lt;/p&gt;

&lt;p&gt;From that day, I decided to start learning programming. Without ever having touched a computer in my life, I was determined for the first time. So I learned and I found my first job.&lt;/p&gt;

&lt;h2&gt;
  
  
  How long did it take you to learn programming, was it hard? Talk to me about it.
&lt;/h2&gt;

&lt;p&gt;Hard? That's an understatement. I didn't sleep for six months. I remember that day vividly. It was the 1st of March, and I told myself that by the end of summer, I had to find a job.&lt;/p&gt;

&lt;p&gt;The first few weeks were really challenging for me. I thought this was something I couldn't do. I studied after school for a couple of hours, maybe 1-2 hours daily, but I saw no progress.&lt;/p&gt;

&lt;p&gt;In the meantime, I kept talking with my friend, and he told me, "You need to work hard. I've been studying since I was 12 years old to be in the position I am today."&lt;/p&gt;

&lt;p&gt;That day, something clicked for me. I set an alarm clock for 4:30 AM, giving me 3 hours to study before school. I don't know how, but I was certain I could do it. I studied 3 hours before school, 3 hours after school, and read coding books for 1 hour at night.&lt;/p&gt;

&lt;p&gt;Finally, after 2 months, I saw progress. I created my first HTML website. It was simple, but it worked.&lt;/p&gt;

&lt;p&gt;Time passed and mid-July I started looking for jobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Did you find any? Talk to me through the process of finding a job.
&lt;/h2&gt;

&lt;p&gt;I decided with that friend of mine to create a website where we would offer website creation services. So that's what we did.&lt;/p&gt;

&lt;p&gt;But nothing happened. August came and we had no clients. Then one day, I got a call from an unknown number. It was a guy who wanted a real estate website. He told me he found us through Google Search.&lt;/p&gt;

&lt;p&gt;We closed a deal with him for &lt;strong&gt;$2000&lt;/strong&gt;. That amount of money was unimaginable for me back then. After a month, another guy messaged me on LinkedIn and said he wanted to hire us. So, for the first time ever, my friend and I closed another deal for &lt;strong&gt;$800&lt;/strong&gt; per month to work 4 hours a day. For a 15-year-old in Greece, that was a lot of money.&lt;/p&gt;

&lt;p&gt;I don't want to be unfair to him, but I learned a lot on that job and created websites and applications from scratch that I couldn't believe I could make before.&lt;/p&gt;

&lt;p&gt;Then, one month, he decided not to pay us.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not pay you anything? What do you mean?
&lt;/h2&gt;

&lt;p&gt;Yes, you heard right. One month, after a year of working for him, he did not pay us—neither me nor my friend. At first, I thought it was okay. He told us not to worry and assured us that everything would be fine. He promised to pay us double next month because they were making some internal changes to the company.&lt;/p&gt;

&lt;p&gt;The next month passed, but we received no money. We then heard that he had stopped paying four other employees at the company. So, one day, we decided to leave. And that's what we did four software engineers left the company, with him owing us $1600 plus a bonus he had promised after one year of work.&lt;/p&gt;

&lt;p&gt;But as kids do, we spent all the money we made. Just kidding, I saved all of it. So when I left the job, I had some money to invest. But what investments can a 16-year-old software engineer make?&lt;/p&gt;

&lt;p&gt;I created an underwear store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wait what ? Why did you do that ?
&lt;/h2&gt;

&lt;p&gt;Well, I had an uncle who had some money. He wasn't rich, but he was doing well. He always wanted to open an underwear store, not just an e-commerce store but a physical one as well. Don't ask me why, but older uncles from Greece who know little about business either open a coffee shop or a clothing store.&lt;/p&gt;

&lt;p&gt;The thing with my uncle was that he lived on a deserted island in the middle of nowhere. So, he had the brilliant idea to give $50,000 to a 16-year-old to open a store.&lt;/p&gt;

&lt;p&gt;That's what he did. I put in $10,000, and he put in $50,000. He told me,&lt;br&gt;&lt;br&gt;
- "Now you are a man, go sort things out."&lt;/p&gt;

&lt;p&gt;I found a physical location, went to the IRS to handle all the paperwork, hired a designer to design the store's interior, found wholesale suppliers to order underwear, and created the e-commerce website. I basically did everything by myself. I was working 10 hours a day in that store at a very young age.&lt;/p&gt;

&lt;p&gt;I must confess that everything went well for the first few months. But then the pandemic hit. It literally obliterated the physical store, and I didn't know what marketing was back then. I spent $0 on marketing. So, long story short, I left that business, and we lost all of our money.&lt;/p&gt;

&lt;p&gt;For the next couple of years, I continued to work as a software engineer. Today, I have quit my job to pursue something new in my life and create my first SaaS product.&lt;/p&gt;

&lt;h2&gt;
  
  
  So tell me more about &lt;a href="https://linkinbio.cc/"&gt;Linkinbio&lt;/a&gt;, your product. Where did you get the idea?
&lt;/h2&gt;

&lt;p&gt;I spent a lot of time on social media as a kid. I noticed many creators using link-in-bio apps that lacked themes and customization options and had their branding, making them look unprofessional.&lt;/p&gt;

&lt;p&gt;Most social media accounts use these apps without realizing it. They only showcase a few links and charge a monthly fee for it.&lt;/p&gt;

&lt;p&gt;Then I thought, why not create a free tool without branding that also supports an internal economy where creators help each other and make money?&lt;/p&gt;

&lt;p&gt;So, two months ago, I started developing &lt;a href="https://linkinbio.cc/"&gt;linkinbio.cc&lt;/a&gt;, a link-in-bio tool with unlimited customization options. You can promote your links and buttons to other profiles, and 90% of the money you pay goes back to the creators. If someone promotes a button, you get paid for the clicks on your page.&lt;/p&gt;

&lt;p&gt;The product is now in the early bird phase. I want the community to give feedback so I can make changes before the final launch in mid-July.&lt;/p&gt;

&lt;p&gt;Check it out and leave comments about anything you don't like or any features you want to see. I'm open to criticism and want to know what the community wants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;If you want you can register and claim your handle on&lt;/em&gt;&lt;/strong&gt; &lt;a href="https://linkinbio.cc/"&gt;&lt;strong&gt;&lt;em&gt;linkinbio.cc&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;&lt;em&gt;either for free or pay $3 for the early-bird premium package.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading, and I hope you found this article helpful. If you have any questions, feel free to email me at &lt;a href="//mailto:x@sotergreco.com"&gt;&lt;strong&gt;x@sotergreco.com&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;, and I will respond.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can also keep up with my latest updates by checking out my X here: &lt;a href="http://x.com/sotergreco"&gt;&lt;strong&gt;x.com/sotergreco&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>saas</category>
      <category>startup</category>
      <category>story</category>
    </item>
    <item>
      <title>Maximizing ROI: From Google Analytics To Custom Analytics</title>
      <dc:creator>Sotiris Kourouklis</dc:creator>
      <pubDate>Thu, 06 Jun 2024 09:52:56 +0000</pubDate>
      <link>https://dev.to/sotergreco/maximizing-roi-from-google-analytics-to-custom-analytics-5915</link>
      <guid>https://dev.to/sotergreco/maximizing-roi-from-google-analytics-to-custom-analytics-5915</guid>
      <description>&lt;p&gt;Everyone is using Google Analytics; it is literally the first script everyone installs on their website. If you run a SaaS business or an E-commerce store, you basically want to know everything about your audience.&lt;/p&gt;

&lt;p&gt;Google Analytics plays a crucial role in understanding user behavior and your target audience. A study by &lt;a href="https://surfshark.com/global-ad-blocking"&gt;Surfshark&lt;/a&gt;, one of the biggest VPN providers across the globe, showed that over 37% of people use ad blockers.&lt;/p&gt;

&lt;p&gt;This means that 37% of your visitors are not being tracked. We are going to analyze how I use custom analytics to achieve a 99% tracking rate while also maintaining privacy for my clients.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr5r2vbo8566dpu61d1eh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr5r2vbo8566dpu61d1eh.png" alt="Image description" width="800" height="91"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://surfshark.com/global-ad-blocking"&gt;https://surfshark.com/global-ad-blocking&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Analytics Alternatives
&lt;/h2&gt;

&lt;p&gt;Big Google Analytics competitors don't really do their job either. Large adblocker developer literally block all the competitors of google because there are the most common after Google.&lt;/p&gt;

&lt;p&gt;Just by searching Google Analytics Competitors on Google you can find all the analytics providers that are most likely blocked by ad blockers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HYLwW0No--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1717658404637/238e8fe8-3e91-484f-ba5b-ad66da043600.png%2520align%3D" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HYLwW0No--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1717658404637/238e8fe8-3e91-484f-ba5b-ad66da043600.png%2520align%3D" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Smaller Providers
&lt;/h2&gt;

&lt;p&gt;On my website, as you can see, I have installed both gtag, which is Google Analytics, and Vercel Analytics. Vercel Analytics is probably less known to the public but is still blocked by my AdBlocker.&lt;/p&gt;

&lt;p&gt;Even in that case, we have a solution that we are going to talk about and how to get the most out of your analytics.&lt;/p&gt;

&lt;p&gt;So don't believe that by choosing a smaller provider you are going to be safe. The likelihood of not tracking will be smaller but not zero.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5agfb5zzqsbyceybf090.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5agfb5zzqsbyceybf090.png" alt="Image description" width="800" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Risk displacement
&lt;/h2&gt;

&lt;p&gt;The first thing you need to do is discuss with your developer about putting multiple analytics on your website. Risk displacement is a business term that can be applied anywhere in life.&lt;/p&gt;

&lt;p&gt;Just like you don't keep all of your money in one bank account, you should do the same with your data.&lt;/p&gt;

&lt;p&gt;I am using three different analytics. One of them provides specific user events. Google doesn't really do anything; I might delete it after finishing this article because it literally doesn't track half of the traffic.&lt;/p&gt;

&lt;p&gt;Below are the same analytics for the past 30 days. As you can see, Google Analytics doesn't track almost anything. Even the Average Engagement Time is wrong.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphn64gh2fwej5mejtn8i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphn64gh2fwej5mejtn8i.png" alt="Image description" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvxif8m77z1izg56bvzw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvxif8m77z1izg56bvzw.png" alt="Image description" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Github Opensource
&lt;/h2&gt;

&lt;p&gt;I am not going to discuss exactly which analytics I am using because I don't want them to start getting blocked as well. But you can ask your developer to search on GitHub for open-source analytics solutions. The one I am using can be found easily, and if &lt;a href="https://chromewebstore.google.com/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm?hl=en&amp;amp;pli=1"&gt;UBlock Origin&lt;/a&gt; doesn't catch it, it means that no other ad blocker will.&lt;/p&gt;

&lt;p&gt;Always use &lt;a href="https://chromewebstore.google.com/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm?hl=en&amp;amp;pli=1"&gt;UBlock Origin&lt;/a&gt; on your website to check if it block the analytics or not. Basically UBlock Origin is one of the best Ad Blockers in the market right now.&lt;/p&gt;

&lt;p&gt;Just click on the logger and check what scripts it highlights with red. Even if you don't are a developer you can check it very easily.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2u4zh0rar44jo5y90qn9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2u4zh0rar44jo5y90qn9.png" alt="Image description" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Domain Masking
&lt;/h2&gt;

&lt;p&gt;Domain masking is covering the domain of the tracking script with a reverse proxy server. This is quite complex, and if you are not a developer, you might have to hire someone to do it for you.&lt;/p&gt;

&lt;p&gt;You need to keep in mind that domain masking is not always possible and might not work for some scripts.&lt;/p&gt;

&lt;p&gt;Also, I want to quickly mention Shopify because the analytics of the platform are both server-side and client-side. Ad blockers do not work, and Shopify tracks everything. So, congrats to the Shopify team for that.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Privacy&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Privacy is not something Google cares about. The alternatives I found were not only accurate but also privacy-friendly. The data didn't link to any other social profiles and was stored in my database.&lt;/p&gt;

&lt;p&gt;You can get to know your audience in secure ways. If you care about them, you want the best for them. The open-source alternatives you can find not only don't store the data on Google Server but you store the data and you don't link them to any other social profiles.&lt;/p&gt;

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

&lt;p&gt;In conclusion, while Google Analytics is a popular tool for tracking website metrics, it falls short in capturing data from users who employ ad blockers.&lt;/p&gt;

&lt;p&gt;By exploring custom analytics solutions, businesses can achieve higher tracking accuracy and maintain user privacy. Employing multiple analytics providers, leveraging open-source solutions, and using techniques like domain masking can significantly enhance tracking effectiveness.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and I hope you found this article helpful. If you have any questions, feel free to email me at &lt;a href="//mailto:x@sotergreco.com"&gt;&lt;strong&gt;x@sotergreco.com&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;, and I will respond.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can also keep up with my latest updates by checking out my X here: &lt;a href="http://x.com/sotergreco"&gt;&lt;strong&gt;x.com/sotergreco&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Beyond the Code: Essential Skills Every Developer Needs to Have</title>
      <dc:creator>Sotiris Kourouklis</dc:creator>
      <pubDate>Thu, 30 May 2024 15:33:26 +0000</pubDate>
      <link>https://dev.to/sotergreco/beyond-the-code-essential-skills-every-developer-needs-to-have-9c0</link>
      <guid>https://dev.to/sotergreco/beyond-the-code-essential-skills-every-developer-needs-to-have-9c0</guid>
      <description>&lt;p&gt;Learning to code is one of the most useful skills someone can learn. But let's say you were searching for a pirate's hidden treasure and you had a map that didn't show the exact location, but you knew it was somewhere around the Caribbean.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F309n0fui3i2zpi1a657f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F309n0fui3i2zpi1a657f.png" alt="Image description" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Searching there could be your first thought, but not knowing exactly where it is, searching the entire Caribbean can take years. That's why you should start looking where the pirate lived to collect clues. For example, &lt;a href="https://en.wikipedia.org/wiki/Hayreddin_Barbarossa"&gt;&lt;strong&gt;Barbarossa&lt;/strong&gt;&lt;/a&gt; was Turkish, so maybe you should visit Turkey to gather clues.&lt;/p&gt;

&lt;p&gt;The same is with programming. Only practicing your coding skills will get you nowhere; you will just become a good employee, and that's all. You should start looking to other places where people haven't searched that will implicitly improve your coding skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mental Toughness
&lt;/h2&gt;

&lt;p&gt;As much as "mental toughness" might seem obscure, keep reading to better understand my point. Developers often talk about &lt;a href="https://sotergreco.com/why-impostor-syndrome-isnt-real"&gt;impostor syndrome&lt;/a&gt; or burnout, and if you are a developer yourself, you might have experienced it.&lt;/p&gt;

&lt;p&gt;Even if you have not experienced it yet, your brain will stop working after a few hours of coding. Imagine now that you never had any problems and you could code nonstop and have infinite inspiration. This is what happened to me when I started training my mental toughness.&lt;/p&gt;

&lt;p&gt;Training it can come from other things. Stop playing video games and read books instead; this will give you discipline. Not wasting time consuming content on social media and instead creating content will strengthen your mind. Stop masturbating every time you see an OF girl on Reddit or Instagram; this will toughen your mind to a point where things like impostor syndrome and burnout will cease to exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;I know sun exposure can be difficult in some countries. But even in UK where sun is barely seen getting out each morning for 30-40 reading a book in the daylight can give you inspiration and motivation.&lt;/p&gt;

&lt;p&gt;Inspiration is really important when it comes to coding, it we get it by doing things that have no connection with the thing we are working on. The most inspiration you will get by trips to other places or countries.&lt;/p&gt;

&lt;p&gt;Half my time of coding, I spent it outside in the summer. Even now I am writing this article outside.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp3gza5vqy580oi87wupf.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp3gza5vqy580oi87wupf.jpeg" alt="Image description" width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Body Strength
&lt;/h2&gt;

&lt;p&gt;"&lt;a href="https://en.wikipedia.org/wiki/Mens_sana_in_corpore_sano"&gt;&lt;em&gt;Mens sana in corpore sano&lt;/em&gt;&lt;/a&gt;" - A healthy mind is in a healthy body. But this works vice versa as well. Of course, as developers, we work on our minds all the time, but most developers have weak bodies.&lt;/p&gt;

&lt;p&gt;Exercising and going to the gym can give you the mental energy you need to solve complex problems and think outside the box. Exercising doesn't mean going to the gym for 3 hours every day. But 30-40 minutes of working out daily and 2-3 hours of cardio each week can do the job.&lt;/p&gt;

&lt;p&gt;Now that I am in a place where the nearest gym is 10 miles away, I do pushups all day. Daily 200-300 and running once every few days. That said, you don't even need a gym to work out; just do pushups.&lt;/p&gt;

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

&lt;p&gt;In conclusion, while coding is an essential skill for developers, it's not the only one that matters.&lt;/p&gt;

&lt;p&gt;Mental toughness, inspiration, and physical fitness all play crucial roles in enhancing a developer's overall productivity and creativity.&lt;/p&gt;

&lt;p&gt;By focusing on these areas, developers can not only improve their coding skills but also lead a more balanced and fulfilling life.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and I hope you found this article helpful. If you have any questions, feel free to email me at &lt;a href="//mailto:kourouklis@pm.me"&gt;&lt;strong&gt;kourouklis@pm.me&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;, and I will respond.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can also keep up with my latest updates by checking out my X here: &lt;a href="http://x.com/sotergreco"&gt;&lt;strong&gt;x.com/sotergreco&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>coding</category>
      <category>skills</category>
    </item>
    <item>
      <title>How To Make Money On The Side As A Developer</title>
      <dc:creator>Sotiris Kourouklis</dc:creator>
      <pubDate>Thu, 30 May 2024 11:50:10 +0000</pubDate>
      <link>https://dev.to/sotergreco/how-to-make-money-on-the-side-as-a-developer-260h</link>
      <guid>https://dev.to/sotergreco/how-to-make-money-on-the-side-as-a-developer-260h</guid>
      <description>&lt;p&gt;Side-hustles are something you have definitely thought of before. Of course, you might not be the next Mark Zuckerberg, but making a few extra bucks on the side can benefit you a lot.&lt;/p&gt;

&lt;p&gt;I am not going to talk about Upwork or other platforms because they didn't work for me, but I am going to share how you can gradually, and not overnight, make a few bucks here and there and overall improve your income.&lt;/p&gt;

&lt;p&gt;This is not a get-rich-quick scheme but advice to build a higher income in the long run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Upwork Scam
&lt;/h2&gt;

&lt;p&gt;I want to get Upwork out of the way before we start. This is because it's not that it is impossible to make money from Upwork, but you need to first do 4-5 jobs for free to build a reputation and then make some money.&lt;/p&gt;

&lt;p&gt;On upwork reviews matter more than your portfolio, so even if you have a ton of projects built already if you don't have review you are not going anywhere.&lt;/p&gt;

&lt;p&gt;This can take a long time, sometimes more than 4-5 months, depending on your location and how lucky you are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attention Based Economy
&lt;/h2&gt;

&lt;p&gt;We are living in an attention-based economy, which means skill is no longer the only requirement. Of course, you need to know what you are doing, but being an expert is not necessary anymore.&lt;/p&gt;

&lt;p&gt;We see OnlyFans creators making millions while you are stuck with your $50,000 job and don't know how to make more money. The first thing you should do is pick a platform, share your knowledge, and engage with others.&lt;/p&gt;

&lt;p&gt;Whether you choose X or Reddit is irrelevant. Just don't choose Instagram or Facebook because most tech people are on X and Reddit. By posting daily and engaging 8-10 times per day, you will start building an audience.&lt;/p&gt;

&lt;p&gt;This will give you a head start in finding new clients.&lt;/p&gt;

&lt;h2&gt;
  
  
  DM People
&lt;/h2&gt;

&lt;p&gt;After you start building an audience, you have to start DMing people. I have found clients in the past just by asking them. Don't be afraid of sending a DM to someone.&lt;/p&gt;

&lt;p&gt;Don't let that DM be fake, put effort into it and send it only to people you can genuinely help and to whom you think you can bring value.&lt;/p&gt;

&lt;p&gt;Cold DMs are no longer working because everybody is doing it, but by putting effort into messaging people you have already interacted with on social media is a whole different game because you have built rapport with them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connections
&lt;/h2&gt;

&lt;p&gt;From the things we have already discussed the main thing we are doing is that we build connection and connections are really important when it comes to money, because most of the money you will make will be from your connections.&lt;/p&gt;

&lt;p&gt;You need to keep in mind that you have to show the professional side of yourself. You social media profiles should look professional by uploading useful content that is helping people.&lt;/p&gt;

&lt;h2&gt;
  
  
  Upsell
&lt;/h2&gt;

&lt;p&gt;If you have any customers already, you should always ask them for more. I had clients on the side making $400-500, and by offering them more options and selling them more ideas, I managed to get $3000 and more from them.&lt;/p&gt;

&lt;p&gt;For example, if they have a blog, offer to create a newsletter for them or build an e-commerce website to sell services.&lt;/p&gt;

&lt;p&gt;This is a proven method and will make your more money on the connections you have.&lt;/p&gt;

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

&lt;p&gt;In conclusion, making money on the side as a developer requires strategy, persistence, and leveraging your connections.&lt;/p&gt;

&lt;p&gt;Avoid the pitfalls of platforms like Upwork and focus on building an audience on social media, engaging meaningfully with potential clients, and upselling your services.&lt;/p&gt;

&lt;p&gt;By consistently putting in the effort and showcasing your professional side, you can gradually increase your income and achieve financial growth.&lt;/p&gt;

&lt;p&gt;Remember this is not an overnight success scheme. You need to put effort to be patient and gradually build your audience.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and I hope you found this article helpful. If you have any questions, feel free to email me at &lt;a href="//mailto:kourouklis@pm.me"&gt;&lt;strong&gt;kourouklis@pm.me&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;, and I will respond.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can also keep up with my latest updates by checking out my X here: &lt;a href="http://x.com/sotergreco"&gt;&lt;strong&gt;x.com/sotergreco&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Is The Future Of Development Working As A Freelancer ?</title>
      <dc:creator>Sotiris Kourouklis</dc:creator>
      <pubDate>Wed, 29 May 2024 06:58:54 +0000</pubDate>
      <link>https://dev.to/sotergreco/is-the-future-of-development-working-as-a-freelancer--37ae</link>
      <guid>https://dev.to/sotergreco/is-the-future-of-development-working-as-a-freelancer--37ae</guid>
      <description>&lt;p&gt;The median salary for a software engineer in Europe is around €70,000, while in the US it is $130,000. Although these numbers might seem high at first glance, they are not as high as they might seem.&lt;/p&gt;

&lt;p&gt;Due to rising economic inflation, this amount of money is not only insufficient for investment but is just enough to raise a family. It is true that for an individual, it might be more than enough, but family is something a lot of engineers have in mind.&lt;/p&gt;

&lt;p&gt;I am not going to discuss US numbers because I am not from there, but I am going to analyze Europe and see why it is worth it to work on your personal brand rather than working a 9-5.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solo Ventures
&lt;/h2&gt;

&lt;p&gt;With AI in place, one-man companies are now a reality, which is why Indie Hacking suddenly appeared this year. Now, a Senior Engineer can have five times the output compared to just a few years ago.&lt;/p&gt;

&lt;p&gt;Although in the past creating a SaaS by yourself was challenging, now with tools like Co-pilot and Chat-GPT, you can literally speed run the creation of a platform. Even if you're not familiar with the syntax, Co-pilot can assist you, and Chat-GPT briefs you with insights for your code or solves tasks that are not easy enough to remember and you have to Google.&lt;/p&gt;

&lt;h2&gt;
  
  
  Growth
&lt;/h2&gt;

&lt;p&gt;Growth is one of the first things you ask about during an interview. Growth is a very important factor when selecting a company, but in 99% of cases, growth is an illusion that is misinterpreted by developers.&lt;/p&gt;

&lt;p&gt;Usually, getting a raise means going from €70,000 to €74,000. You are not guaranteed the raise, and it always comes with more responsibilities that usually don't reflect the money.&lt;/p&gt;

&lt;p&gt;In comparison with freelancers, we see a lot of Indie Hackers or Service Providers where a raise means going from €50,000 to €100,000 the next year. If you are active, especially on X, this trend is quite common. Another fact is that even if you get a raise, getting laid off is another thing.&lt;/p&gt;

&lt;p&gt;To go over the growth part, growth only matters if you chase a higher position for more than 200K and become a tech lead or software architect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Long-term
&lt;/h2&gt;

&lt;p&gt;In the long term, traditional 9-5 employees might not have as many opportunities. I mean, in the old days before 2020, this was different because a 5% salary increase meant a lot, and the cost of living was relatively low compared to today.&lt;/p&gt;

&lt;p&gt;Freelancers might not have a guaranteed income each month, but the potential is there. If one month you want more money, you can always work more to get more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Work-Life Balance
&lt;/h2&gt;

&lt;p&gt;Another significant advantage of freelancing is the ability to achieve a better work-life balance. Traditional 9-5 jobs often come with rigid schedules and limited flexibility, which can make it challenging to manage personal commitments and family time.&lt;/p&gt;

&lt;p&gt;Freelancers, on the other hand, have the autonomy to set their own hours and work from anywhere, allowing them to tailor their schedules to fit their personal lives. This flexibility can lead to increased job satisfaction and overall well-being, making freelancing an attractive option for those seeking a more balanced lifestyle.&lt;/p&gt;

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

&lt;p&gt;In conclusion, while traditional 9-5 jobs offer stability and predictable growth, the evolving landscape of technology and the rise of AI tools have significantly empowered freelancers and Indie Hackers.&lt;/p&gt;

&lt;p&gt;By focusing on personal branding and leveraging these tools, developers can achieve greater financial potential and flexibility within a year or two.&lt;/p&gt;

&lt;p&gt;As economic conditions and job security continue to fluctuate, the future of development increasingly appears to lie in the hands of those willing to take entrepreneurial risks and embrace the freedom of freelancing.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and I hope you found this article helpful. If you have any questions, feel free to email me at &lt;a href="//mailto:kourouklis@pm.me"&gt;&lt;strong&gt;kourouklis@pm.me&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;, and I will respond.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can also keep up with my latest updates by checking out my X here: &lt;a href="http://x.com/sotergreco"&gt;&lt;strong&gt;x.com/sotergreco&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>freelance</category>
    </item>
  </channel>
</rss>
