<?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: Mikael</title>
    <description>The latest articles on DEV Community by Mikael (@mikgross).</description>
    <link>https://dev.to/mikgross</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%2F235543%2Fd5f521ee-6d25-4933-bf81-1dd9e25587da.JPG</url>
      <title>DEV Community: Mikael</title>
      <link>https://dev.to/mikgross</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mikgross"/>
    <language>en</language>
    <item>
      <title>Clawdbot/Moltbot security issues.</title>
      <dc:creator>Mikael</dc:creator>
      <pubDate>Thu, 29 Jan 2026 00:13:45 +0000</pubDate>
      <link>https://dev.to/mikgross/clawdbotmoltbot-security-issues-2l9p</link>
      <guid>https://dev.to/mikgross/clawdbotmoltbot-security-issues-2l9p</guid>
      <description>&lt;p&gt;Hey Everyone, you might have heard of Moltbot, a project that has fantastic promises. Delivering agents locally to your machine and connecting it to a wealth of tools and chats for interractions. Today I decided to dig into their code, and surprise... project initiated in Nov 2025, already has 8000+ commits on main 🧐 700+ issues and close to 300 PRs. For a project that young it's an insane amount of code being shipped. This raised red alerts straight away. I started to read some of the code and let's say... best practices were not really implemented. One commit incremented a wait time for Telegram messages from 1500ms to 5000ms.. I mean, just a magic value lost in a script. Typical AI slop.&lt;/p&gt;

&lt;p&gt;Anyways, I was sure this project could present significant sec risks if used, so I ran a Gemini Pro report using deep search and sure enough, interesting things surfaced.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/document/d/1tCSH2pA6keE18x40QqeTi_QDTQ4F0wOz2tN4OSfcnYo/edit?usp=sharing" rel="noopener noreferrer"&gt;You can read it here&lt;/a&gt; for those interested enough. It's worth the read. One safer moltbot fork is proposed and I think it's completely necessary (&lt;a href="https://github.com/titanicprime/moltbot-safe" rel="noopener noreferrer"&gt;https://github.com/titanicprime/moltbot-safe&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Enjoy the ride, and stay safe!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
    </item>
    <item>
      <title>Easy Ledger CLI: a management tool for ledger-cli ledgers</title>
      <dc:creator>Mikael</dc:creator>
      <pubDate>Sat, 13 Dec 2025 21:39:29 +0000</pubDate>
      <link>https://dev.to/mikgross/easy-ledger-cli-a-management-tool-for-ledger-cli-ledgers-fd4</link>
      <guid>https://dev.to/mikgross/easy-ledger-cli-a-management-tool-for-ledger-cli-ledgers-fd4</guid>
      <description>&lt;p&gt;Hey all!&lt;/p&gt;

&lt;p&gt;I recently started using &lt;code&gt;ledger-cli&lt;/code&gt;, a Fat-free Accounting tool.&lt;br&gt;
In their own words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What it does offer is a double-entry accounting journal with all the flexibility and muscle of its modern day cousins, without any of the fat.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Check &lt;a href="https://github.com/ledger/ledger?tab=readme-ov-file" rel="noopener noreferrer"&gt;their github&lt;/a&gt; for more details. It's really a great concept and lovely to use for reporting and tracking your accounting.&lt;/p&gt;

&lt;p&gt;The only caveat for me is the commands you type to append transactions to your ledger can get quite long and tedious. One of the main "issues" from the command line interface is that you have to write your ledger file path every time you enter a transaction (yes, the DB is a simple text file 😊). The author of ledger did add a ledger-mode allowing you to use shortcuts and syntax highlighting in order to ease the management of the ledger file, but I do not want to work from a file and would much rather add my transactions via cli in an easy, clean and straight forward way. I also do not want to know about my actual ledger file, why should I manage it myself?&lt;/p&gt;

&lt;p&gt;In order to fix this, I wrote a very basic cli (for now) that allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;manage multiple ledgers (think one for your company, one for yourself)&lt;/li&gt;
&lt;li&gt;seamlessly switch between those&lt;/li&gt;
&lt;li&gt;add stocks and transactions in an interactive way&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the near future I plan to support all supported transaction types and details as well as adding a few basic reports and maybe the ability to pre-configure your own ledger commands.&lt;/p&gt;

&lt;p&gt;Give it a try, let me know what you think, contribute!&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/easy-ledger-cli" rel="noopener noreferrer"&gt;Link to the npm package&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cli</category>
      <category>npm</category>
      <category>accounting</category>
    </item>
    <item>
      <title>Day 1: Scary attempt at building in the open</title>
      <dc:creator>Mikael</dc:creator>
      <pubDate>Mon, 15 Jul 2024 18:31:14 +0000</pubDate>
      <link>https://dev.to/mikgross/day-1-scary-attempt-at-building-in-the-open-m5d</link>
      <guid>https://dev.to/mikgross/day-1-scary-attempt-at-building-in-the-open-m5d</guid>
      <description>&lt;h1&gt;
  
  
  Hey 👋
&lt;/h1&gt;

&lt;p&gt;Nice to have you here.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 What is this post anyway?
&lt;/h2&gt;

&lt;p&gt;This post serves as a starting point for my "building in the open" attempt. I have seen a few people doing so on LinkedIn and was inspired to start my own journey.&lt;/p&gt;

&lt;p&gt;As a small dev team, we are constantly juggling between internal and client work. Our internal work revolves mostly on developing tools and software that we might use internally or just complete as hobby projects. The vision, the dream, is of course to make it big with our products in order to break free from our client's chains. Building in the open might just be the way to go.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧑‍💻 What will you be building?
&lt;/h2&gt;

&lt;p&gt;I am not yet 100% convinced of what shape this project should or will take, however, I can reveal the main idea behind it:&lt;/p&gt;

&lt;h3&gt;
  
  
  Enable all LLM applications to use any service on the internet.
&lt;/h3&gt;

&lt;p&gt;This comes from the simple observation that LLMs and their applications are missing on the most important feature a user would want after passing the honeymoon phase: &lt;strong&gt;Do something useful&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  👈 What's next?
&lt;/h2&gt;

&lt;p&gt;I am not yet 100% convinced of what will come next, but I can assure you that I will continue posting on our journey to build this thing. You following me and sharing feedback in the comment section will help me and I will find it extremely encouraging!&lt;/p&gt;

&lt;p&gt;For now have a great day and see you soon for Day 2!&lt;/p&gt;

</description>
      <category>startup</category>
      <category>webdev</category>
      <category>api</category>
      <category>ai</category>
    </item>
    <item>
      <title>Meaningful Software Companies?</title>
      <dc:creator>Mikael</dc:creator>
      <pubDate>Wed, 04 Jan 2023 16:17:00 +0000</pubDate>
      <link>https://dev.to/mikgross/meaningful-software-companies-178a</link>
      <guid>https://dev.to/mikgross/meaningful-software-companies-178a</guid>
      <description>&lt;p&gt;I am slightly tired of working on meaningless software products that do not provide any real value to society and the world in general. Do you have any recommendation of great startups/scaleups in the ecosystem?&lt;/p&gt;

&lt;p&gt;Thanks! 🤍&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🤖 Automate your version management 🤖</title>
      <dc:creator>Mikael</dc:creator>
      <pubDate>Sat, 25 Jun 2022 18:57:48 +0000</pubDate>
      <link>https://dev.to/mikgross/automate-your-version-management-4ik5</link>
      <guid>https://dev.to/mikgross/automate-your-version-management-4ik5</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Version management, or the art of passing from 1.0.0 to 1.0.1, is a process, in our technical world, that is very important but sometimes vastly underestimated and somewhat disregarded by some of us (me included 😅).&lt;/p&gt;

&lt;p&gt;The benefits of good version management, to list a few, could be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Information - When the versioning is well done, it can provide very useful information to users and softwares (technical and non technical).&lt;/li&gt;
&lt;li&gt;Security - For us, technical people, we use versioning to make sure we run the latest, security threat free, packages.&lt;/li&gt;
&lt;li&gt;Compatibility - For a package manager such as NPM, it helps creating the perfect package mix and alert of breaking changes and security threats.&lt;/li&gt;
&lt;li&gt;More information - For end users, it helps understanding if they are up to date, or not!&lt;/li&gt;
&lt;li&gt;Activity - A great measure to understand if a project is still ongoing is the frequency at which it releases new versions to adapt to security threat and updates from other packages.&lt;/li&gt;
&lt;li&gt;more ... I don't know, let me know in the comments 😁&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essentially, a version is often written as 0.0.1. This versioning style is essentially composed of three components: the lead 0, the middle 0 and the 1. In most cases, they indicate the following:&lt;/p&gt;

&lt;p&gt;Lead 0 indicates the major version.&lt;br&gt;
Middle 0 indicates the minor version.&lt;br&gt;
The 1 indicates the patch version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MAJOR, MINOR, PATCH&lt;/strong&gt; versions. As simple as that.&lt;/p&gt;

&lt;p&gt;If you want to respect those rules, which are commonly accepted, the idea is that you update your version according to the following principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Major version changes are made when a breaking change is introduced or when the product changes profoundly&lt;/li&gt;
&lt;li&gt;Minor version changes are made when your team introduces a new feature&lt;/li&gt;
&lt;li&gt;Patch version changes are made when changes occur in the code base that do not introduce new features. Could be a security patch, some bug fixes, more stuff.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How we automate it
&lt;/h2&gt;

&lt;p&gt;In my world, in which most projects front and back are managed with a &lt;code&gt;package.json&lt;/code&gt;, version management is usually forgotten and updated from time to time in a not so much established process. Usually the impact is slim to none we run most of our development internally and with a very closed IT environment. However, we recently decided to kick our devOps a notch and one of our projects was to automate version management. We wanted it automated to 1. never think about it and 2. show the state of each platform we develop. Hopefully a 1.0.22 shows more work than a 0.0.2.&lt;/p&gt;

&lt;p&gt;In our efforts to automate the process of going from 0.0.1 to 0.0.2, we built a small (1 script), lightweight (17kb) and git ready package for reusability across all our projects.&lt;/p&gt;

&lt;p&gt;Enters &lt;em&gt;bumpme&lt;/em&gt;, a cli that helps you automate your package.json version management.&lt;/p&gt;

&lt;p&gt;Bumpme is a simple CLI that helps you automate your version management. You can run it like so &lt;code&gt;bumpme&lt;/code&gt; or with arguments like &lt;code&gt;-s&lt;/code&gt; or &lt;code&gt;-i&lt;/code&gt;. &lt;code&gt;-s&lt;/code&gt; represents severity (patch, minor, major) and &lt;code&gt;-i&lt;/code&gt; represents increment (by how much it should be changed).&lt;/p&gt;

&lt;p&gt;A cool feature of &lt;code&gt;bumpme&lt;/code&gt; is the automated integration with git. The idea from the get go was to integrate it with git in order to read the commit message and bump the version accordingly. &lt;code&gt;bumpme&lt;/code&gt; reads the git commit message and tries to find a specific command which can be something like [[patch:1]]. Such a command, as you guess, will pass the package.json from 0.0.1 to 0.0.2. Pretty cool!&lt;/p&gt;

&lt;h2&gt;
  
  
  Automate it
&lt;/h2&gt;

&lt;p&gt;It would be silly of us to keep the responsibility of versioning and running a specific &lt;code&gt;bumpme&lt;/code&gt; command for each commit to our main branch to a human! We decided to use Github workflows for that. If you do not know what a Github workflow is, I encourage you to learn about it. It is a very useful automation tool. For each commit merged into our main branch, for which one person is responsible to press the button, a github worklow will trigger. In this github workflow we simply insruct the machine to un &lt;code&gt;npx bumpme&lt;/code&gt; or &lt;code&gt;npm run bumpme&lt;/code&gt; (how you want to do it is really your problem). The &lt;code&gt;bumpme&lt;/code&gt; command simply reads the latest git commit message (which comes with the merging of branch) and bumps the version accordingly. Again, pretty cool!&lt;/p&gt;

&lt;p&gt;If you want to test or use it, here is the NPM link: &lt;a href="https://www.npmjs.com/package/@food7go/bumpme" rel="noopener noreferrer"&gt;@food7go/bumpme&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is an open source project, meaning that we welcome review, new ideas and obviously contribution.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>npm</category>
      <category>devops</category>
    </item>
    <item>
      <title>How it feels to look for new gigs right now</title>
      <dc:creator>Mikael</dc:creator>
      <pubDate>Mon, 13 Jul 2020 21:19:48 +0000</pubDate>
      <link>https://dev.to/mikgross/how-it-feels-to-look-for-new-gigs-right-now-2496</link>
      <guid>https://dev.to/mikgross/how-it-feels-to-look-for-new-gigs-right-now-2496</guid>
      <description>&lt;p&gt;&lt;a href="https://youtu.be/x1TsOHyJPpw" rel="noopener noreferrer"&gt;https://youtu.be/x1TsOHyJPpw&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>productivity</category>
      <category>freelance</category>
    </item>
    <item>
      <title>🔥 Firebase Auth Migration 🔥</title>
      <dc:creator>Mikael</dc:creator>
      <pubDate>Tue, 23 Jun 2020 09:58:34 +0000</pubDate>
      <link>https://dev.to/mikgross/firebase-auth-migration-2hm5</link>
      <guid>https://dev.to/mikgross/firebase-auth-migration-2hm5</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;This article is a short tutorial aimed at giving you a path to migrate users between two Firebase projects (or really any authentication service).&lt;/p&gt;

&lt;p&gt;As I passed a good amount of my morning trying to figure out how to do this, I thought spreading the word on the internet could potentially help more people locating it.&lt;/p&gt;

&lt;p&gt;The documentation on this matter is hoster by Google &lt;a href="https://firebase.google.com/docs/cli/auth#auth-import" rel="noopener noreferrer"&gt;here&lt;/a&gt;. So if you like to work with docs and do not want to read my little tuto, feel free :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Tutorial
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Firebase CLI
&lt;/h3&gt;

&lt;p&gt;In order to perform the import, you will need to use the Firebase command line interface. You can install it without issues on your machine by entering this command into your terminal (npm users)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g firebase-tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Continue with the login process and init your firebase repo. Once all is done, you are ready to import/export your auth users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Import users
&lt;/h3&gt;

&lt;p&gt;To import users, go into the Firebase repo you just have inited, and enter the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firebase auth:export accounts.json --format=JSON
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will download your current users into your local machine. Make sure the file location is secured, not committed to any git repo and offline. You don't want to leak your users' passwords.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Export users to new project
&lt;/h3&gt;

&lt;p&gt;First, switch projects using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firebase use new-project-name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then go to your Firebase dashboard and go to &lt;code&gt;Authentication &amp;gt; three dots on the top of user card &amp;gt; Hash parameters&lt;/code&gt;. You will need this information.&lt;/p&gt;

&lt;p&gt;Now to import the users enter (replace the  with your config from Firebase)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firebase auth:import accounts.json \
&amp;gt; --hash-algo=&amp;lt;hash_algo&amp;gt; \
&amp;gt; --hash-key=&amp;lt;hash_key&amp;gt; \
&amp;gt; --salt-separator=&amp;lt;sale_sep&amp;gt; \
&amp;gt; --rounds=&amp;lt;rounds&amp;gt; \
&amp;gt; --mem-cost=&amp;lt;mem_cost&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once successfully migrated, you should receive something like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Processing accounts.json (XXXX bytes)
Starting importing 15678 account(s).
✔  Imported successfully.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All done, you have successfully migrated your users.&lt;/p&gt;

&lt;p&gt;Now before you migrate please make sure you have disabled access to your old project for all users in order not to have different data from one project to the other. Also make sure that the apps are correctly updated to use your new project's config. If you respected that, the experience for your users should be seamless.&lt;/p&gt;

&lt;p&gt;Have a great day of code!&lt;br&gt;
Mike&lt;/p&gt;




&lt;h2&gt;
  
  
  About me
&lt;/h2&gt;

&lt;p&gt;I am a partner at &lt;a href="https://mmpg.xyz" rel="noopener noreferrer"&gt;MMPG Consulting&lt;/a&gt;, a firm active in the custom software development industry in the Spanish and Swiss markets.&lt;/p&gt;

&lt;p&gt;For more content, you can add me on &lt;a href="https://www.linkedin.com/in/mikaelgross/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or shoot me a DM if you want to discuss specific topics, your software or an idea you want to implement.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>database</category>
    </item>
    <item>
      <title>Ultimate Terminal Customization</title>
      <dc:creator>Mikael</dc:creator>
      <pubDate>Mon, 22 Jun 2020 22:55:11 +0000</pubDate>
      <link>https://dev.to/mikgross/ultimate-terminal-customization-51c7</link>
      <guid>https://dev.to/mikgross/ultimate-terminal-customization-51c7</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;If you are a Linux user, &lt;em&gt;you will&lt;/em&gt; use your terminal a lot. Terminal, once you know how to navigate your machine with it and work on a daily basis, will tremendously increase your productivity. For example, you can easily move files around or use CLIs from your favorite providers or apps to perform complicated tasks that would take way more time if done through a visual interface. In summary, it allows you to have a greater understanding of how your machine works and lets you be more productive, at the cost of you staring at a black screen with cryptic messages.&lt;/p&gt;

&lt;p&gt;Just type &lt;code&gt;cmatrix&lt;/code&gt; in it for fun.&lt;/p&gt;

&lt;p&gt;Anyway.. Since we are going to spend a lot of time in it doing various complex things and probably get frustrated over time, why not make it pretty and fun. For your own sanity of course.&lt;/p&gt;

&lt;p&gt;In this very short tutorial I will show you how to easily customize your terminal. I am myself using Linux Ubuntu 19.10. Users from Mac and Linux distros should have a pretty similar experience. Microsoft users, I can do nothing for you.&lt;/p&gt;

&lt;p&gt;Most Ubuntu users start with the terminal looking almost like this:&lt;br&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%2Fi%2Fkyxkyjq6c8jllxg6slsn.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%2Fi%2Fkyxkyjq6c8jllxg6slsn.png" alt="Alt Text" width="770" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A completely fine looking terminal if you ask me. But not fancy  enough for our special breed of dev. We want something personal so when our colleagues or friends look at our terminal, they understand that we know what we are doing.&lt;/p&gt;

&lt;p&gt;Let's change things a bit!&lt;/p&gt;
&lt;h2&gt;
  
  
  First Steps
&lt;/h2&gt;

&lt;p&gt;The configuration of our terminal is defined by the variable &lt;code&gt;PS1&lt;/code&gt;. To change what your terminal displays, you just need to type in it&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export PS1='I am so fancy 😄 $ '
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Magic! you now have a custom terminal. But oh misery, when you close and boot it up again, your terminal will be going back to boring old normal. Don't worry, I got you, there is a way of making things more durable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The secret lies in the &lt;code&gt;.bashrc&lt;/code&gt; file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Go ahead and type the following command into your terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd
vim .bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will open a file looking like this&lt;br&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%2Fi%2Fxrgm4nbnyw528v4v1hpa.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%2Fi%2Fxrgm4nbnyw528v4v1hpa.png" alt="Alt Text" width="770" height="739"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We know from before that the variable &lt;code&gt;PS1&lt;/code&gt; holds our prompt display. Go to the following line and uncomment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;force_color_prompt=yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then go to the line below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Huray! this is your traditional Ubuntu terminal prompt.&lt;/p&gt;

&lt;p&gt;Ok, great, we have it.. now what?&lt;/p&gt;

&lt;p&gt;Now comes the fun, it is time to customize things a bit. But first, let's understand this mess.&lt;/p&gt;

&lt;p&gt;Here is a short description of the different parts&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;${debian_chroot:+($debian_chroot)}&lt;/code&gt;: this part is explained &lt;a href="https://askubuntu.com/questions/372849/what-does-debian-chrootdebian-chroot-do-in-my-terminal-prompt" rel="noopener noreferrer"&gt;here&lt;/a&gt; in a very good way, I encourage you to read it&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\[\033[01;32m\]...\[\033[00m\]&lt;/code&gt;: Are the opening and closing tags of bash text styling&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\u&lt;/code&gt;, &lt;code&gt;\h&lt;/code&gt; and &lt;code&gt;\w&lt;/code&gt;: respectively user, machine name and current path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In order not to get too much content in, we will first just create a simple prompt that will look like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;😍😍 DEV MADE ME DO THIS 😍😍 $ 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(with more colors)&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's customize
&lt;/h2&gt;

&lt;p&gt;In your .bashrc go to&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will start by removing the unwanted boring content. We will remove the username and machine name but will let the path in. Always nice to know where you are. Your code should look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS1='${debian_chroot:+($debian_chroot)}:\[\033[01;34m\]\w\[\033[00m\]\$ '
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to apply the changes, save your current modification and type in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source .bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have to continue the work, enter again in your &lt;code&gt;.bashrc&lt;/code&gt; and change the code to the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS1='${debian_chroot:+($debian_chroot)}😍😍 DEV MADE ME DO IT 😍😍 \[\033[01;34m\]\w\[\033[00m\]\$ '
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fi%2F7a4pfznte1utx1tgj14o.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%2Fi%2F7a4pfznte1utx1tgj14o.png" alt="Alt Text" width="770" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is not so bad... right? But we miss something... I know! Colors!&lt;/p&gt;

&lt;p&gt;We need to try and make a rainbow. Basically how the styling work is as follows. As seen before, we have &lt;code&gt;\[\033[01;32m\]&lt;/code&gt; as opening tag and &lt;code&gt;\[\033[00m\]&lt;/code&gt; as closing tag.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding Colors in your Life
&lt;/h2&gt;

&lt;h3&gt;
  
  
  openning
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;\[\033[01;32m\]&lt;/code&gt; is the bash way of saying increased intensity with color green. In this string of characters, the 01 means increase intensity and the 32 means green. Try 02 instead of 01 and your text will be a bit transparent. Try 33 instead of 32 and your text will become brownish. &lt;strong&gt;&lt;em&gt;DON'T FORGET TO &lt;code&gt;SOURCE .BASHRC&lt;/code&gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  closing
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;\[\033[00m\]&lt;/code&gt; really just means no more styling. Yep, that's it.&lt;/p&gt;




&lt;p&gt;So! let's finish our beautiful rainbow of colors. We will use the following colors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;red: 91
yellow: 93
green: 92
light blue: 96
blue: 94
purple: 95
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which will give us:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS1='${debian_chroot:+($debian_chroot)}😍😍 \[\033[01;91m\]D\[\033[00m\]\[\033[01;93m\]E\[\033[00m\]\[\033[01;92m\]V\[\033[00m\] \[\033[01;96m\]M\[\033[00m\]\[\033[01;94m\]A\[\033[00m\]\[\033[01;95m\]D\[\033[00m\]\[\033[01;94m\]E\[\033[00m\] \[\033[01;96m\]M\[\033[00m\]\[\033[01;92m\]E\[\033[00m\] \[\033[01;93m\]D\[\033[00m\]\[\033[01;91m\]O\[\033[00m\] \[\033[01;93m\]I\[\033[00m\]\[\033[01;92m\]T\[\033[00m\] 😍😍 \[\033[01;34m\]\w\[\033[00m\]\$ '
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fi%2F7831upbjohlrpziyz31n.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%2Fi%2F7831upbjohlrpziyz31n.png" alt="Alt Text" width="800" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alright... This was of course just to showcase what you could do. I personally went for something more basic:&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%2Fi%2Fh1ot29koia6hn0lhsf22.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%2Fi%2Fh1ot29koia6hn0lhsf22.png" alt="Alt Text" width="800" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congrats! You are now a master of personalizing your command prompt. In order to learn more about how to visually customize your prompt, use the link right below to find more resources. You will be able to create crazy blinking animated terminal sessions with it, trust me it's fun:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/ANSI_escape_code" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/ANSI_escape_code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It would be nice to see what you guys built, so let us know in the comments!&lt;/p&gt;

&lt;p&gt;Til next time.&lt;br&gt;
Mike&lt;/p&gt;




&lt;h3&gt;
  
  
  About me
&lt;/h3&gt;

&lt;p&gt;I am a partner at MMPG Consulting, a firm active in the custom software development industry in the Spanish and Swiss markets.&lt;/p&gt;

&lt;p&gt;For more content, you can add me on &lt;a href="https://linkedin.com/in/mikaelgross" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or shoot me a DM if you want to discuss specific topics, your software or an idea you want to implement.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>tutorial</category>
      <category>terminal</category>
      <category>bash</category>
    </item>
    <item>
      <title>🔥 Firebase Firestore Migrations 🔥</title>
      <dc:creator>Mikael</dc:creator>
      <pubDate>Mon, 22 Jun 2020 18:06:32 +0000</pubDate>
      <link>https://dev.to/mikgross/firebase-firestore-migrations-olg</link>
      <guid>https://dev.to/mikgross/firebase-firestore-migrations-olg</guid>
      <description>&lt;p&gt;Firebase is one of the greatest serverless environment for developers to quickly get scalable products up and running, it lets you focus strictly on code and not care too much about what happens in the backend.&lt;/p&gt;

&lt;p&gt;Although serverless is great, developers often face use cases that the developers of those tools didn't think about or implement yet.&lt;/p&gt;

&lt;p&gt;I came across one of those problems recently and wanted to share to the greater community a nice workaround the community has built for us.&lt;/p&gt;

&lt;p&gt;My problem arose when I wanted to migrate the noSQL data I had in one Firebase project to another Firebase project. Google lets you use the &lt;code&gt;gcloud&lt;/code&gt; CLI for this purpose and has a very useful &lt;code&gt;gcloud firestore export&lt;/code&gt; and &lt;code&gt;gcloud firestore import&lt;/code&gt; that normally poses no issue. However, when you start to have nested collections, this tool will fail and only export the first level documents, which is not exactly what it should do...&lt;/p&gt;

&lt;p&gt;After searching the internet for a bit, I came across this awesome npm package: &lt;a href="https://www.npmjs.com/package/firestore-export-import" rel="noopener noreferrer"&gt;firestore-export-import&lt;/a&gt;. This package will let you use the command line to do exactly what it does best: export and import data from firestore in JSON format easily. It's really a child's game.&lt;/p&gt;

&lt;p&gt;1) install the package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i -g firestore-export-import
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) Export the credentials.json from your Firebase project&lt;br&gt;
&lt;code&gt;Firebase Dashboard &amp;gt; Settings &amp;gt; Service Accounts &amp;gt; New Private Key&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3) Export Data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firebase-export -a path/to/credentials.json -b path/to/savefile.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4) Import Data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firebase-import -a path/to/credentials.json -b path/to/savefile.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change the project credentials in between step 3 &amp;amp; 4 to switch the target project.&lt;/p&gt;

&lt;p&gt;and.. that's it!&lt;/p&gt;

&lt;p&gt;Amazing little package that lets you perform those tasks in a way easier way than the tools Google proposes you to use. Only caveat, make sure to secure your local private keys. If anybody finds them, you will compromise your entire Firebase project.&lt;/p&gt;

&lt;p&gt;Code safe!&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>database</category>
    </item>
    <item>
      <title>5 Things to Consider when Hiring a Software Dev</title>
      <dc:creator>Mikael</dc:creator>
      <pubDate>Thu, 18 Jun 2020 17:32:30 +0000</pubDate>
      <link>https://dev.to/mikgross/5-things-to-consider-when-hiring-a-software-dev-441d</link>
      <guid>https://dev.to/mikgross/5-things-to-consider-when-hiring-a-software-dev-441d</guid>
      <description>&lt;p&gt;For newcomers that want to outsource the development of their first app or website, the experience can be unforgiving and sometimes harsh both financially and mentally.&lt;/p&gt;

&lt;p&gt;I will never forget how one of my uncles, who happens to be an entrepreneur, once lost USD 60'000 hiring a software development company that was not a great fit for his needs resulting in him being disgusted by his project and entrepreneurship for a while..&lt;/p&gt;

&lt;p&gt;This should not happen to you, and with this quick guide I will propose you a list consisting of 5 things to consider when hiring a software dev. You can apply this list to your current vendors and see if yes, or no, they are the right fit for you. Let’s start!&lt;/p&gt;




&lt;h2&gt;
  
  
  Business Understanding
&lt;/h2&gt;

&lt;p&gt;This point is absolutely crucial and should be one of your top priorities. Your developer or developers need to have a crystal clear and deep understanding of what your business is about. If they understand your business vaguely, they will not understand how your app or software could be improved and as such, will probably lead you into traps that are either expensive to get out of, or simply put a project stopper. In summary: take your time, have at least two brainstorming session with your outsourced resources and define clearly requirements and needs. This will help them help you.&lt;br&gt;
At MMPG Consulting, we always set at least two sessions in order to understand your situation, where you are coming from and what. The first one is always free and is often the one during which we find pitfalls and the best way to help our clients.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Structuring
&lt;/h2&gt;

&lt;p&gt;You need to make sure that the project is well structured. This seems obvious, but is often a step disregarded by software devs and clients altogether. A well structured project contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. Deadlines: Define when the final delivery date is. Accept the ones set by your dev, it is worthless insisting on tighter deadlines as the will be missed, or worst, will be met at the detriment of quality&lt;/li&gt;
&lt;li&gt;2. Milestones: Define milestones to achieve along the way. It is important to break your final project and deadline into smaller milestones to reach along the way&lt;/li&gt;
&lt;li&gt;3. Cut-off points: Be ready to pull the plug on a dev team that is not performing according to the milestones and deadline set earlier. It might be scary at first because of the resources and time invested, but it will be necessary at some point&lt;/li&gt;
&lt;li&gt;4. Budget: Define a clear budget. The budget can be per hour with a bag of hours pre-bought or it can be established based on success. Usually part of this budget will be wired in advance at the start of the project and the rest will be paid at the end (usually the success of it)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Risk Understanding
&lt;/h2&gt;

&lt;p&gt;You absolutely need to understand the risk represented by hiring an external developer to build your project. First of all, the road will not be all pretty and cloudless. There will be plenty of misunderstanding and frustration, deadlines missed and bugs, and probably some shouts or heated emails. However, let’s be honest, this is part of most of most outsourced projects and if you understand the risks before starting such a project, you can actively and preemptively manage them. As such, be clear about the potential risks, actively manage them and communicate extensively with your team. Things should go smoothly after that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Budget Controlling
&lt;/h2&gt;

&lt;p&gt;It is important for your wallet and financial health to understand exactly how much you are paying at any point. Make sure that the team you hire let’s you know at all time the hours already consumed by the team, the estimated budget needed for completion and if it will fit in your initial estimates or discussions. Do those checks often as they can save you from a nasty bill at the end of the month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source Code Ownership
&lt;/h2&gt;

&lt;p&gt;This one should be common practice within the industry, but is really not. Many of my clients are disgruntled clients I gather from competitors and to my surprise, when they come to me, they have nothing, zero, nada in their hands. I mean, some work has already been done and paid to the outsourced team and they didn’t send any source code. As the owner of this project, make sure that in the contract you sign with your vendors, the source code ownership is included and that the source code is always sent at the end of the current sprint which should be weekly or biweekly.&lt;/p&gt;

&lt;p&gt;With this 5 points in mind, you should be able to have a better understanding of how your software development project should be steered and how to control the details of it, without losing your cash and sanity.&lt;/p&gt;

&lt;p&gt;Leading our customers into this complicated world of software development is what made my company &lt;a href="https://mmpg.xyz" rel="noopener noreferrer"&gt;MMPG Consulting&lt;/a&gt; successful. We value transparency, communication and client ownership. It is part of our DNA and core values to help rather than provide a service.&lt;/p&gt;

&lt;p&gt;If you want to know more about us, visit our &lt;a href="https://mmpg.xyz" rel="noopener noreferrer"&gt;website&lt;/a&gt; or send me an email at &lt;a href="mailto:mg@mmpg.xyz"&gt;mg@mmpg.xyz&lt;/a&gt;. I will be happy to help you develop your project and achieve your vision.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Software Architecture - What is architecture?</title>
      <dc:creator>Mikael</dc:creator>
      <pubDate>Tue, 12 May 2020 01:42:40 +0000</pubDate>
      <link>https://dev.to/mikgross/software-architecture-what-is-architecture-4h43</link>
      <guid>https://dev.to/mikgross/software-architecture-what-is-architecture-4h43</guid>
      <description>&lt;p&gt;I have not written for a long time on this series. Circumstances, lots of work for other projects and the unfortunate events that happened linked to Covid-19 have thrown me back. But I am back now and ready to talk more about Software Architecture, its concepts and best practices.&lt;/p&gt;

&lt;p&gt;To put us back in perspective, last post was dedicated to introducing the topic and this series. Today's post will be dedicated to define what is architecture and define its goal.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Introduction&lt;/td&gt;
&lt;td&gt;Introduction to the series&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/mikgross/software-architecture-complete-guide-2m8a"&gt;link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;em&gt;What is architecture?&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;em&gt;Introduction to the concepts of design and architecture in software and why they matter&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;em&gt;&lt;a href="https://dev.to/mikgross/software-architecture-what-is-architecture-4h43"&gt;link&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Starting from the bottom&lt;/td&gt;
&lt;td&gt;Coding paradigms and why they affect our architecture&lt;/td&gt;
&lt;td&gt;tbw&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Design principles&lt;/td&gt;
&lt;td&gt;5 architecture design principles to always have in mind when designing software&lt;/td&gt;
&lt;td&gt;tbw&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In software development we often distinguish two critical concepts that influence different levels in the software: architecture and design. In practice, we often refer to architecture as a high level principle such as using using microservices, authenticating using this kind of flow or another, or more on a high level organization (efficiencies, maintenance, cost, etc.). Those macro architecture principles would then provide guides for the design, referring mostly to the specific decisions made by developers while building/putting together the piece of software. Although for most of us this picture is clear in our mind, it is unfortunately our first conceptual mistake, and lesson :)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;To illustrate our point:&lt;/em&gt;&lt;br&gt;
Think about an architect planning a house: the architect will need to define the high level plan (walls, materials, etc.) but ultimately, his decisions will influence and define the position of power switches, lights, electrical cables and from which wall the water intake would be located. Macro architectural decisions affect and define lower level design decisions. &lt;/p&gt;

&lt;p&gt;Similarly to a house architect, a software architect will define the high level structure, taking decisions that will not only influence, but also strictly define several low level designs. We decide to take a microservices approach that will influence how we communicate between those, structure our code and name our variables &amp;amp; files. As such, we need to consider architecture and design as strictly similar concepts. Software Architect professionals should therefore not limit themselves to high level concepts, but also understand how their decisions will influence and directly define low level design decisions. Software Architecture and Design are the same.&lt;/p&gt;

&lt;p&gt;And all those decisions? What are they meant to achieve? What is the goal of a software architect? According to Robert C. Martin:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The goal of software architecture is minimizing the human resources necessary to create and maintain the required system&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What does it mean? It means that the quality of an architecture will be defined by the amount of work the related software's creation will require but also what maintenance will it require. I am sure you can already think about one of your project, in which bad architectural decisions lead to hours spent where they shouldn't have been spent therefore costing more to your company, your clients and ultimately your own sanity. Second lesson, software architecture quality can be measured by objective metrics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Short case study
&lt;/h2&gt;

&lt;p&gt;In order to make it clearer, let's exemplify it using a fictional case:&lt;br&gt;
Imagine a company that is currently completing a project with a team of 8 developers. &lt;/p&gt;

&lt;p&gt;Those 8 developers cost USD 800K a year and managed to deliver a product of 1,000K lines of code. We can define their monthly productivity as 1,000K lines of code / 8 devs / 12 months = 10.5K lines of code per months per dev at a cost of 80 cents per line of code. Not so bad in my opinion!&lt;/p&gt;

&lt;p&gt;Now let's imagine: Our devs integrated many third party libraries too quickly because they were pressured by deadlines and did not think well about some crucial part of their architecture. After a while, some crucial security issues arise from those libraries, and it's time to update them. Problem: The devs, pressured by deadlines, didn't take the time to integrate the library properly for example in a separated service clustering all the functions using this specific library. They simply called the library directly whenever required directly from many services spread across the software. We all know the complexity arising from this kind of tedious upgrades. In order to upgrade and maintain those integrations that are critical for their software, the dev team needs to grow by assigning a few devs to make sure any third party libraries integrated are maintained up-to-date and integrated properly.&lt;/p&gt;

&lt;p&gt;Let's go back to our numbers:&lt;br&gt;
We now have 10 developers for a cost of USD 1,000K a year.&lt;br&gt;
Two developers are assigned full time to make sure to maintain integration and do not produce new code, they only work on maintenance tasks (bug fixing, updates, etc.). Our devs monthly productivity at N+1 is therefore 1,000K lines of code / 10 devs / 12 months = 8.3K lines of code per dev per month at a cost of 1 USD per line of code. A little worse than before.&lt;/p&gt;

&lt;p&gt;As you can see, productivity per dev dropped 21% and cost per line of code rose by 25%. Not great. And this is just the first year. As we all know, those kind of behaviors and bad decisions are usually rooted in the company DNA. It will probably get a lot worse before anything will be done by the higher management that will start to witness immense increase in dev numbers, salary paid together with a decrease in productivity (new features, extensions, etc.).&lt;/p&gt;

&lt;p&gt;This is the definition of a bad software architecture. A great architecture would have limited the time and resources needed to perform maintenance, bug fixes, updates but also would have kept a smaller team more focused and overall would have delivered greater productivity (at least in theory).&lt;/p&gt;

&lt;h2&gt;
  
  
  Potential Causes
&lt;/h2&gt;

&lt;p&gt;Most of the time in software bad decisions leading to bad or not so great architecture happen when devs are:&lt;br&gt;
1) too confident about their decisions&lt;br&gt;
2) rushed under crazy deadlines&lt;/p&gt;

&lt;p&gt;It is essential that software developers and architects take their time, think their decisions through and make sure their current decisions (that will probably deliver the intended purpose in the short term), will not influence badly their project in the long term.&lt;/p&gt;

&lt;p&gt;We all lived situations in which we had to come back to our code, months down the road, in order to change this or this part because of our bad decisions (rushed through to respect deadlines or without consulting our peers). It is tiring, frustrating and difficult sometimes to get back the mindset and momentum we had at the moment of built.&lt;/p&gt;

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

&lt;p&gt;In order to tackle those issues, organizations and developers need to understand and recognize that their decisions might not be the best ones. We need as professionals to understand the implications and tradeoff we make every time we take a decision on software architecture.&lt;/p&gt;

&lt;p&gt;Is respecting this deadline more important than really thinking through how I structure my micro-service and maybe spend the next two days structuring it, testing it and making sure it is well integrated within our structure? &lt;/p&gt;

&lt;p&gt;Rather than creating monolithic components to go fast, I will rather take some time and separate functions in separated services.&lt;/p&gt;

&lt;p&gt;Should I really consult my colleagues when deciding upon going with this kind of data structure for this particular object? Going one way will be easy, the other way will signify building more code an ultimately delaying other things I would like to tackle for another months. Should you kill reusability for the sake of time?&lt;/p&gt;

&lt;p&gt;All of those moments/questions will ultimately take a few hours off my planned schedule, sure, but in the long term, a serious look at the quality of my software, the time needed for maintenance and the resources spent on it will give our clients and users satisfaction.&lt;/p&gt;

&lt;p&gt;Don't forget our two insights in today's article: &lt;br&gt;
1) The quality of our architecture is measurable objectively with the time and resources spent on building and maintaining it&lt;br&gt;
2) It is better to think &lt;strong&gt;a lot&lt;/strong&gt; on the quality of our software and go slower than the opposite&lt;/p&gt;

&lt;p&gt;That's it for today! Although the article was short, I believe it really reminds us all that, when it comes to Software Quality and Architecture, every decisions count both on Macro and Micro level and we need to be 100% aware that quality &lt;strong&gt;&lt;em&gt;now&lt;/em&gt;&lt;/strong&gt; will influence quality &lt;strong&gt;&lt;em&gt;in the future&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the following article, we will take the time to learn/situate the great coding paradigms that have a strong influence on how we practice software architecture.&lt;/p&gt;

&lt;p&gt;Make your software provide more smiles than tears!&lt;/p&gt;




&lt;h3&gt;
  
  
  About me
&lt;/h3&gt;

&lt;p&gt;I am a partner at MMPG Consulting, a firm active in the custom software development industry in the Spanish and Swiss markets.&lt;/p&gt;

&lt;p&gt;You can add me on &lt;a href="https://linkedin.com/in/mikaelgross" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or shoot me a DM if you want to discuss specific topics, your software or an idea you want to implement.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Disclaimer&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;I am writing this series while reading books about software dev, the ideas and principles exposed will be taken from those books. In those articles I will sum them up and discuss concrete examples. I am not introducing new ideas or principles about software architecture. Essentially because my thoughts on it do not, and will not, introduce a paradigm shift or introduce ground breaking architecture principles (...who knows!).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
    </item>
    <item>
      <title>Software Architecture - Complete Guide</title>
      <dc:creator>Mikael</dc:creator>
      <pubDate>Mon, 02 Mar 2020 06:50:09 +0000</pubDate>
      <link>https://dev.to/mikgross/software-architecture-complete-guide-2m8a</link>
      <guid>https://dev.to/mikgross/software-architecture-complete-guide-2m8a</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As a developer that has to undertake software architecture problems quite a lot in my recent projects, I educated myself on basic Architecture principles and techniques by reading books (and maybe a few blog posts). In my opinion, Books have higher quality content that is, most of the time, written to be resistant to time and as such can still serve you as a reader in your day to day fast changing environment. So if you want to learn about any specific topic in a deep manner, read a book, blog posts are often outdated, too focused, and not written by professionals or cross-read.&lt;/p&gt;

&lt;p&gt;Anyway, after many hours spent reading about Software Architecture, I decided to put together a blog post series based on my findings in order to share with fellow developers (and architects) clean architecture principles. This should be useful for you at all level, from Junior to Senior, in order to build software that is scalable, resistant to change and, the most important, maintainable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Series structure
&lt;/h2&gt;

&lt;p&gt;I will approach the series in the following way:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;em&gt;1&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;em&gt;Introduction&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;em&gt;Introduction to the series&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;em&gt;&lt;a href="https://dev.to/mikgross/software-architecture-complete-guide-2m8a"&gt;link&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;What is architecture?&lt;/td&gt;
&lt;td&gt;Introduction to the concepts of design and architecture in software and why they matter&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/mikgross/software-architecture-what-is-architecture-4h43"&gt;link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Starting from the bottom&lt;/td&gt;
&lt;td&gt;Coding paradigms and why they affect our architecture&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Design principles&lt;/td&gt;
&lt;td&gt;5 architecture design principles to always have in mind when designing software&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In each of the posts enumerated in the table above I will sum up key ideas taken from a book I am currently reading and completing the summary with a short collection of thoughts and real life example showing how relevant are those to us in modern days software development and architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why should I spend time reading those?
&lt;/h2&gt;

&lt;p&gt;If you are new to software development &amp;amp; architecture, reading about principles that structure your software in a way that will make it scalable, fast and easy to maintain is a must. You need to understand how not to grow a monster full of intricate dependencies and bugs that require your entire code base to change in order to get fixed. After all you don't want to just &lt;strong&gt;write&lt;/strong&gt; code, you want to be &lt;strong&gt;productive&lt;/strong&gt; while doing it. Each character you type needs to produce something that will make your software better, not just fixing legacy dependencies after a breaking change was introduced.&lt;/p&gt;

&lt;p&gt;If you are experienced in architecture and development, reading about all of those concepts you had to experience at a theoretical and practical level so many times will probably remember you funny and sad war stories about how your own software was poorly or amazingly designed. Sharing comments would be amazing for new devs, and funny discussion topics for experienced ones.&lt;/p&gt;

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

&lt;p&gt;Looking forward to write about this topic as it is often not the first thing we learn when developing code for the web or any other tech but is definitely the single most important thing we need to understand and work on constantly.&lt;/p&gt;

&lt;p&gt;See you on another post!&lt;br&gt;
Mikael&lt;/p&gt;




&lt;h3&gt;
  
  
  About me
&lt;/h3&gt;

&lt;p&gt;I am a partner at MMPG Consulting, a firm active in the custom software development industry in the Spanish and Swiss markets.&lt;/p&gt;

&lt;p&gt;You can add me on &lt;a href="https://linkedin.com/in/mikaelgross" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or shoot me a DM if you want to discuss specific topics, your software or an idea you want to implement.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;em&gt;Disclaimer&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;As mentioned above, I am writing this series while reading books about software dev, the ideas and principles exposed will be taken from those books. In those articles I will sum them up and discuss concrete examples. I am not introducing new ideas principles about software architecture essentially because my thoughts on it do not, and will not, introduce a paradigm shift or introduce ground breaking architecture principles (who knows!).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>tutorial</category>
      <category>cleancode</category>
    </item>
  </channel>
</rss>
