<?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: Mohammed Ismail Ansari</title>
    <description>The latest articles on DEV Community by Mohammed Ismail Ansari (@myterminal).</description>
    <link>https://dev.to/myterminal</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%2F36209%2Fa343f792-987a-423c-9b5b-4410adba37c2.jpg</url>
      <title>DEV Community: Mohammed Ismail Ansari</title>
      <link>https://dev.to/myterminal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/myterminal"/>
    <language>en</language>
    <item>
      <title>What I Learned Writing My First Book</title>
      <dc:creator>Mohammed Ismail Ansari</dc:creator>
      <pubDate>Tue, 03 Aug 2021 05:31:22 +0000</pubDate>
      <link>https://dev.to/myterminal/what-i-learned-writing-my-first-book-c8e</link>
      <guid>https://dev.to/myterminal/what-i-learned-writing-my-first-book-c8e</guid>
      <description>&lt;p&gt;Recently, I tried my hand at writing a book. It's a super-short one based on To-Dos and personal planning, but I explored a lot of elements around how I can write and self-publish a book of their own.&lt;/p&gt;

&lt;p&gt;&lt;a href="//books2read.com/how-to-stay-sane-with-your-tasks"&gt;The book&lt;/a&gt; is available for free on &lt;a href="https://play.google.com/store/books/details?id=hOU3EAAAQBAJ" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt; only (due to technical reasons), but I've also made a video about the entire process and also my learning from the exciting exercise.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/jZ__rihvcMQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spoilers:&lt;/strong&gt; The book was written entirely using free and open-source software, so the video does include a lot of technical details about the process as well.&lt;/p&gt;

&lt;p&gt;As usual, you may either watch &lt;a href="https://youtu.be/jZ__rihvcMQ" rel="noopener noreferrer"&gt;the video itself&lt;/a&gt; or read the entire thing as an article over &lt;a href="https://myterminal.me/diary/20210801/(VIDEO)-What-I-Learned-Writing-My-First-Book" rel="noopener noreferrer"&gt;my website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Regardless, do provide me your valuable feedback, be it positive or even negative.&lt;/p&gt;

</description>
      <category>writing</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Installing a Minimal Debian system the Arch Way</title>
      <dc:creator>Mohammed Ismail Ansari</dc:creator>
      <pubDate>Tue, 03 Aug 2021 05:14:59 +0000</pubDate>
      <link>https://dev.to/myterminal/installing-a-minimal-debian-system-the-arch-way-432j</link>
      <guid>https://dev.to/myterminal/installing-a-minimal-debian-system-the-arch-way-432j</guid>
      <description>&lt;p&gt;If you've read my previous post about me migrating my ThinkPad from Arch to Debian, you must also be knowing that it wasn't a conventional install. I chose a tool called &lt;code&gt;debootstrap&lt;/code&gt; (much like Arch's &lt;code&gt;pacstrap&lt;/code&gt;).&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/myterminal" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F36209%2Fa343f792-987a-423c-9b5b-4410adba37c2.jpg" alt="myterminal"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/myterminal/why-and-how-i-migrated-my-thinkpad-from-arch-to-debian-27cm" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Why and How I migrated my ThinkPad from Arch to Debian&lt;/h2&gt;
      &lt;h3&gt;Mohammed Ismail Ansari ・ Jun 20 '21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#thinkpad&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#linux&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#archlinux&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#debian&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;I also created a mini tutorial/demo about how one can install Debian using debootstrap. As usual, you can either watch &lt;a href="https://www.youtube.com/watch?v=G1GaDEiAeiU" rel="noopener noreferrer"&gt;the video&lt;/a&gt;, or read the transcript of the video from &lt;a href="https://myterminal.me/diary/20210724/(VIDEO)-Installing-a-Minimal-Debian-system-the-Arch-way" rel="noopener noreferrer"&gt;my website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/G1GaDEiAeiU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>linux</category>
      <category>debian</category>
      <category>arch</category>
    </item>
    <item>
      <title>Why and How I migrated my ThinkPad from Arch to Debian</title>
      <dc:creator>Mohammed Ismail Ansari</dc:creator>
      <pubDate>Sun, 20 Jun 2021 20:59:09 +0000</pubDate>
      <link>https://dev.to/myterminal/why-and-how-i-migrated-my-thinkpad-from-arch-to-debian-27cm</link>
      <guid>https://dev.to/myterminal/why-and-how-i-migrated-my-thinkpad-from-arch-to-debian-27cm</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article outlines my migration from Arch Linux to Debian. The details about the migration are spanned across a few videos, but below is a reasonably short summary.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  This is basically a continuation
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/myterminal" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F36209%2Fa343f792-987a-423c-9b5b-4410adba37c2.jpg" alt="myterminal"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/myterminal/how-i-moved-back-from-macos-to-linux-19f5" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I moved back from macOS to Linux and I'm loving it!&lt;/h2&gt;
      &lt;h3&gt;Mohammed Ismail Ansari ・ Mar 18 '21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#linux&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#macos&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#setup&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Arch gave me a fresh new direction to explore and experience Linux the way I never did before. I created a couple of reusable artifacts and it in a way became a base for &lt;a href="https://www.youtube.com/channel/UCbfg3_hFrOxuEtYMRGsp1ig" rel="noopener noreferrer"&gt;my second YouTube channel&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arch was great, but...
&lt;/h2&gt;

&lt;p&gt;Things kept breaking, and I found myself spending more time on fixing things than I expected, even with my prior experience with Linux before I spent four years on macOS.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Vjue3qFEFrg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;So I started looking out for alternatives and found the exact thing I was looking for.&lt;/p&gt;

&lt;h2&gt;
  
  
  And then I installed Debian in an uncommon way
&lt;/h2&gt;

&lt;p&gt;I couldn't lose the control I had over my Linux setup back with Arch by delegating it to a graphical installer. So I installed Debian in the way we usually do install Arch.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/unhRffAGE7w"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;All this learning had to be documented somewhere so I created another video talking about the process in a little bit of detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  This moved everything, so the gaps "shifted"
&lt;/h2&gt;

&lt;p&gt;Moving to Debian meant re-setting up the entire machine, even deeper than what I had to do back when I moved the factory-installed Windows to a smaller partition to make space for my primary Linux partition.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/2vlGNDqYdb8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The new setup took away a few issues I never got fixed, and in exchange, brought with it a few other ones. I talked about the similarities, differences, negatives, and most importantly, the positives of the migration in a separate video, adding another episode to my series &lt;a href="https://www.youtube.com/playlist?list=PLe6BbPAW-Wxgz5Jly855Aw3qWRiWqTXHO" rel="noopener noreferrer"&gt;Back to Linux&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further
&lt;/h2&gt;

&lt;p&gt;As I did last time, I'll keep my eyes open for ways to improve my setup and workflow, and will keep documenting my learning to be able to share them with the rest of the community.&lt;/p&gt;

&lt;p&gt;Needless to say, I'm loving the alternate universe with Debian. Do throw in your ideas and thoughts in the comments and hopefully, we can learn something from each other.&lt;/p&gt;

</description>
      <category>thinkpad</category>
      <category>linux</category>
      <category>archlinux</category>
      <category>debian</category>
    </item>
    <item>
      <title>I split my Emacs configuration and made it adaptive</title>
      <dc:creator>Mohammed Ismail Ansari</dc:creator>
      <pubDate>Thu, 18 Mar 2021 22:13:28 +0000</pubDate>
      <link>https://dev.to/myterminal/i-split-my-emacs-configuration-and-made-it-adaptive-1123</link>
      <guid>https://dev.to/myterminal/i-split-my-emacs-configuration-and-made-it-adaptive-1123</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is a transcript of a video that you can watch by clicking the below thumbnail. Hence, certain statements may not make sense in this text form, and watching the video instead is recommended.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/a4QPtWCGFJ8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick recap
&lt;/h2&gt;

&lt;p&gt;I've been maintaining my &lt;a href="https://github.com/myterminal/.emacs.d" rel="noopener noreferrer"&gt;Emacs configuration&lt;/a&gt; on GitHub for seven years now. It was my second project on GitHub (after &lt;a href="https://github.com/myterminal/project-euler-solutions-legacy" rel="noopener noreferrer"&gt;project-euler-solutions&lt;/a&gt;) and was initially named &lt;a href="https://github.com/myTerminal/dotfiles/tree/4ecec332d0df3caba2dc1aa114713a7d90bdfcc3" rel="noopener noreferrer"&gt;EmacsConfiguration&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As I switched from &lt;a href="https://www.microsoft.com/en-us/windows" rel="noopener noreferrer"&gt;Windows&lt;/a&gt; to &lt;a href="https://www.linux.org" rel="noopener noreferrer"&gt;Linux&lt;/a&gt;, I repurposed the project to contain my &lt;a href="https://github.com/myTerminal/dotfiles" rel="noopener noreferrer"&gt;dotfiles&lt;/a&gt; and Emacs wasn't the only focus anymore. A few years later, recently, I extracted my configuration into a separate project so that my Emacs configuration could once again get all the attention it deserves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evolution of my &lt;code&gt;.emacs.d&lt;/code&gt; over the years
&lt;/h2&gt;

&lt;p&gt;Since &lt;a href="https://github.com/myTerminal/dotfiles/commit/b3ba16ec258b0f18f8aa05167f5081dc5b2f5d6b" rel="noopener noreferrer"&gt;the first commit in March 2014&lt;/a&gt;, the project has undergone several major changes.&lt;/p&gt;

&lt;p&gt;Back when it started, it used to contain the source files of even the packages that I installed. This looked ideal and simplistic at first, but I soon realized a major problem. Every single package update (which depends on how often I update and how many packages the configuration holds) led to tens of updated files being pushed into the project, and especially the files that (a) I don't have control over (b) already reside in a home project of its own.&lt;/p&gt;

&lt;p&gt;Thanks to some heavy inspiration from &lt;a href="https://ryandsouza.in/about" rel="noopener noreferrer"&gt;a friend&lt;/a&gt; (who also got me into Emacs in the first place), I solved this issue by shrinking everything down to a single &lt;a href="https://www.emacswiki.org/emacs/EmacsLisp" rel="noopener noreferrer"&gt;Elisp&lt;/a&gt; script file such that the project only contained names of the required packages and not the packages themselves.&lt;/p&gt;

&lt;p&gt;Moving a little further along with Emacs, I came across a few heavier packages like &lt;a href="https://github.com/emacs-helm/helm" rel="noopener noreferrer"&gt;helm&lt;/a&gt; and had to implement a "light" mode such that not everything was loaded every time Emacs was started. This was even more important as I did not use &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html" rel="noopener noreferrer"&gt;Emacs Server&lt;/a&gt; and every Emacs launch was a totally new instance. Fun fact: I still don't use Emacs Server and instead use it as a regular application.&lt;/p&gt;

&lt;p&gt;Several months later, I found lighter alternatives to those heavy packages (ex: &lt;a href="https://oremacs.com/swiper" rel="noopener noreferrer"&gt;ivy&lt;/a&gt; for helm) and simplified the configuration once more to avoid migraines while making changes to my own configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Issue with the current state
&lt;/h2&gt;

&lt;p&gt;The project, in its current state, was being used on at least four computers running three major platforms: Linux, &lt;a href="https://www.apple.com/macos" rel="noopener noreferrer"&gt;macOS&lt;/a&gt;, and Windows (at work) but then I recently realized (a little too late) that my configuration was too focused on running Emacs as a graphical application and almost no time was spent making sure that it ran well inside a terminal as too.&lt;/p&gt;

&lt;p&gt;This was OK until recently I had to work on my computers over the &lt;a href="https://en.wikipedia.org/wiki/Command-line_interface" rel="noopener noreferrer"&gt;command line&lt;/a&gt; and could not run a &lt;a href="https://en.wikipedia.org/wiki/Graphical_user_interface" rel="noopener noreferrer"&gt;graphical environment&lt;/a&gt;. Needless to say, my Emacs configuration was pretty unusable and I found myself using &lt;a href="https://www.vim.org" rel="noopener noreferrer"&gt;Vim&lt;/a&gt; instead. I also had this experience on my cloud servers where I host &lt;a href="https://myterminal.me" rel="noopener noreferrer"&gt;my portfolio&lt;/a&gt; and a few other web applications, so Vim was my only help.&lt;/p&gt;

&lt;p&gt;Part of this was good as I finally became friends with Vim, such that I was able to do more than just enter "edit" mode and quit with or without saving the opened file. However, I decided that it was time to redesign my Emacs configuration from the ground-up such that I could use it even in the absence of a graphical environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plan
&lt;/h2&gt;

&lt;p&gt;The plan was to have two separate configurations, not the way I had it earlier when I shifted relatively heavier packages into a separate "full" mode, but this time with a totally different focus. As per the plan, the default mode was supposed to be command-line focused. There would be a condition, which when true, would load the other (and smaller) half of the configuration designed for graphical mode.&lt;/p&gt;

&lt;p&gt;As it goes without saying, the configs for command-line mode would definitely run in a graphical environment but it wouldn't be possible the other way, which was in fact the reason for the entire activity.&lt;/p&gt;

&lt;p&gt;The switch was imagined to be a variable state or a function call that would help me determine whether the current interface was a graphical one or an old-school command line.&lt;/p&gt;

&lt;p&gt;Just as it sounds, the activity was a fun one. I parsed through each line in every single script file, re-arranged things in the way it was planned, and in some cases, threw away what I didn't need.&lt;/p&gt;

&lt;h2&gt;
  
  
  New state
&lt;/h2&gt;

&lt;p&gt;As you can see, my &lt;code&gt;init.el&lt;/code&gt; file now has two separate functions to start those two identical configurations, residing in their own respective directories. The &lt;strong&gt;basic&lt;/strong&gt; configuration is first loaded and then a decision is made whether the second &lt;strong&gt;standard&lt;/strong&gt; configuration is needed and if it is, it's loaded as well.&lt;/p&gt;

&lt;p&gt;The next two steps are common to both, like loading Mass Effect quotes for my own custom screensaver for Emacs and then printing a welcome to my own self. I still have to think about how I can make this simpler, maybe that would be simply throwing them into the &lt;strong&gt;basic&lt;/strong&gt; configuration? Not sure, but that's not that important for now.&lt;/p&gt;

&lt;h2&gt;
  
  
  A mini-demo
&lt;/h2&gt;

&lt;p&gt;A video without a demo would be quite a theory lesson, so let's have a look at a super-quick demo.&lt;/p&gt;

&lt;p&gt;When I start Emacs as I usually do, either from my application launcher or even from the terminal, it starts exactly as it used to before this activity of splitting the configuration. But the problem was never in this mode.&lt;/p&gt;

&lt;p&gt;Let's now start Emacs ignoring the window-system, that is by running it like &lt;code&gt;emacs -nw&lt;/code&gt; in a terminal, you can see how it's almost exactly the same configuration, just without color themes, variable fonts, and a few other visual preferences that one would only care about while using Emacs in a graphical environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;As you saw, this change was one of the most significant changes that I've made in my Emacs configuration since the start of the project. By splitting the scripts into two, I can now use Emacs in the presence and even in absence of a window system, with almost no loss in functionality.&lt;/p&gt;

&lt;p&gt;I plan to adopt a very similar arrangement in both my starter packs: &lt;a href="https://github.com/myTerminal/ample-emacs" rel="noopener noreferrer"&gt;ample-emacs&lt;/a&gt; and &lt;a href="https://github.com/myTerminal/super-emacs" rel="noopener noreferrer"&gt;super-emacs&lt;/a&gt; soon.&lt;/p&gt;

</description>
      <category>emacs</category>
    </item>
    <item>
      <title>Setting up GUI on Linux with twiner</title>
      <dc:creator>Mohammed Ismail Ansari</dc:creator>
      <pubDate>Thu, 18 Mar 2021 22:09:15 +0000</pubDate>
      <link>https://dev.to/myterminal/setting-up-gui-on-linux-with-twiner-51p7</link>
      <guid>https://dev.to/myterminal/setting-up-gui-on-linux-with-twiner-51p7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is a transcript of a video that you can watch by clicking the below thumbnail. Hence, certain statements may not make sense in this text form, and watching the video instead is recommended.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/lHI4pBB2tI4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Thoughts on setting up a custom GUI
&lt;/h2&gt;

&lt;p&gt;When you're a new Linux user, it's very easy to get into the impression that &lt;a href="https://ubuntu.com" rel="noopener noreferrer"&gt;Ubuntu&lt;/a&gt; looks a certain way, &lt;a href="https://lubuntu.net" rel="noopener noreferrer"&gt;Lubuntu&lt;/a&gt; looks some other way, and likewise. Linux isn't like that, it's about choices so that you can install virtually any Linux distribution and set it up to run virtually any graphical environment with only a few commands. There are obvious exceptions like not being able to run &lt;a href="https://en.wikipedia.org/wiki/Elementary_OS" rel="noopener noreferrer"&gt;Pantheon&lt;/a&gt; on an Arch-based distro, something that I've tried and failed multiple times.&lt;/p&gt;

&lt;p&gt;I remember the enlightening moment when my brother showed me that one can install a different graphical environment on a distro that came with a different one. But when I learned that you can also change the graphical login screen (which is the &lt;a href="https://en.wikipedia.org/wiki/X_display_manager" rel="noopener noreferrer"&gt;display manager&lt;/a&gt;) on a Linux installation, that was a total game-changer, such that I didn't have to be limited with &lt;a href="https://en.wikipedia.org/wiki/LightDM" rel="noopener noreferrer"&gt;LightDM&lt;/a&gt; on &lt;a href="https://lxqt-project.org" rel="noopener noreferrer"&gt;LXQT&lt;/a&gt; and other such light-weight distros.&lt;/p&gt;

&lt;p&gt;One of the major parts of &lt;em&gt;twiner&lt;/em&gt; is about choosing the graphical environment of your liking, and that's exactly what we'll look at in this video.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting &lt;em&gt;twiner&lt;/em&gt; as a program
&lt;/h2&gt;

&lt;p&gt;Once you have &lt;em&gt;twiner&lt;/em&gt; cloned on your local workspace, you can start it by running &lt;code&gt;start&lt;/code&gt; at the root of the project. &lt;em&gt;twiner&lt;/em&gt; starts with a menu of tasks to choose from. Once a selection is made, appropriate scripts are run, and then you're returned to the menu where you started from.&lt;/p&gt;

&lt;p&gt;You can run &lt;em&gt;twiner&lt;/em&gt; in three modes. Running &lt;code&gt;start&lt;/code&gt; with no parameters will run it in regular mode. Passing in &lt;code&gt;debug&lt;/code&gt; and running it like &lt;code&gt;start debug&lt;/code&gt; will run &lt;em&gt;twiner&lt;/em&gt; in debug mode, where it will also echo the commands it runs as a part of its steps. The last mode is &lt;code&gt;simulate&lt;/code&gt;, which as the name suggests is a mere simulation, so running it as &lt;code&gt;start simulate&lt;/code&gt; and will not make any changes to the system but only echo the commands that would have otherwise run.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick look at the options
&lt;/h2&gt;

&lt;p&gt;Out of the eight tasks that have been implemented in &lt;em&gt;twiner&lt;/em&gt; at the point of this video, we've already seen most of them in action in the video about setting up my workstation. The ones towards the top of the list are pretty basic and also, for the scope of this video, we'll only look at the tasks related to setting up a GUI.&lt;/p&gt;

&lt;p&gt;Also, like I said a few tasks being pretty basic, even the task that mentions adding additional software sources is nothing much really. On &lt;a href="https://archlinux.org" rel="noopener noreferrer"&gt;Arch&lt;/a&gt;, it almost only installs an &lt;a href="https://aur.archlinux.org" rel="noopener noreferrer"&gt;AUR&lt;/a&gt; helper, on &lt;a href="https://getfedora.org" rel="noopener noreferrer"&gt;Fedora&lt;/a&gt; it installs &lt;a href="https://rpmfusion.org" rel="noopener noreferrer"&gt;Fusion repositories&lt;/a&gt;, and on &lt;a href="https://ubuntu.com" rel="noopener noreferrer"&gt;Ubuntu&lt;/a&gt;, it simply updates the system. In the future, we can have it set up &lt;a href="https://snapcraft.io" rel="noopener noreferrer"&gt;snap&lt;/a&gt;, &lt;a href="https://flatpak.org" rel="noopener noreferrer"&gt;flatpak&lt;/a&gt; and &lt;a href="https://appimage.org" rel="noopener noreferrer"&gt;AppImage&lt;/a&gt; as a few additional ways of adding software to a computer.&lt;/p&gt;

&lt;p&gt;Finally, you can also see two tasks marked as suggested as &lt;em&gt;twiner&lt;/em&gt; can detect that these steps have not been performed on this system yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Task: Setting up GUI
&lt;/h2&gt;

&lt;p&gt;The task for setting up GUI in turn depends on the next two tasks in the list. It by itself takes care of installing a &lt;a href="https://en.wikipedia.org/wiki/Display_server" rel="noopener noreferrer"&gt;display server&lt;/a&gt; and a &lt;a href="https://en.wikipedia.org/wiki/Intel_Graphics_Technology" rel="noopener noreferrer"&gt;graphics driver&lt;/a&gt; and then internally executes the next two tasks for installing a &lt;a href="https://wiki.archlinux.org/index.php/Display_manager" rel="noopener noreferrer"&gt;display manager&lt;/a&gt; and a graphical environment where you can choose from a list of &lt;a href="https://en.wikipedia.org/wiki/Desktop_environment" rel="noopener noreferrer"&gt;desktop environments&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Window_manager" rel="noopener noreferrer"&gt;window managers&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: Setting up Gnome with GDM
&lt;/h2&gt;

&lt;p&gt;One possible quickest demo for setting up a GUI could be starting from a bare-bones setup like the one we used in the last video. So if we run this task on a minimal &lt;a href="https://arcolinux.info" rel="noopener noreferrer"&gt;ArcoLinux&lt;/a&gt; installation, we're taken through a couple of prompts. A lot of parts of this video will be fast-forwarded to save time, but don't worry as we won't miss any important action.&lt;/p&gt;

&lt;p&gt;Hitting 'G' first installs &lt;a href="https://www.x.org" rel="noopener noreferrer"&gt;Xorg&lt;/a&gt; and then soon asks us to choose a graphics driver to use. Let me choose &lt;a href="https://en.wikipedia.org/wiki/Intel" rel="noopener noreferrer"&gt;Intel&lt;/a&gt; for this video.&lt;/p&gt;

&lt;p&gt;After Intel driver is installed, it's time to install a display manager. At this point, &lt;em&gt;twiner&lt;/em&gt; only provides a choice of two options. Let us choose &lt;a href="https://en.wikipedia.org/wiki/GNOME_Display_Manager" rel="noopener noreferrer"&gt;GDM&lt;/a&gt; for this demo.&lt;/p&gt;

&lt;p&gt;Next and the final step is to install a graphical environment. I've placed a bunch of desktop environments and window managers in the list and you can mix and match almost any of these with any of the display managers you installed in the last step. Let us choose &lt;a href="https://github.com/GNOME/gnome-shell" rel="noopener noreferrer"&gt;Gnome shell&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After the process is complete, you're brought back to the menu as mentioned before. Let us quit &lt;em&gt;twiner&lt;/em&gt; and restart the system. You can see a graphical login screen and also login into the Gnome shell.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: Switching the display manager to SDDM
&lt;/h2&gt;

&lt;p&gt;Let us see how you can change the display manager to a different one. As currently there are only two options in there, and we have GDM already installed, the only other option is &lt;a href="https://wiki.archlinux.org/index.php/SDDM" rel="noopener noreferrer"&gt;SDDM&lt;/a&gt;. Hitting 'L' shows us the two options and then pressing 'S' does two things: it installs SDDM and then activates it for the next startup.&lt;/p&gt;

&lt;p&gt;On the next restart, you can see that the login screen that we see is in fact SDDM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: Installing LXDE
&lt;/h2&gt;

&lt;p&gt;Let us now also see how you can install a new desktop environment. Getting back to the menu and hitting 'D' gets me the same list of options we saw earlier. Hitting 'L' installs &lt;a href="https://www.lxde.org" rel="noopener noreferrer"&gt;LXDE&lt;/a&gt;, and on the next log out, you can see LXDE in the list of available options to login into.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few observations on the current setup
&lt;/h2&gt;

&lt;p&gt;You might have noticed that though &lt;em&gt;twiner&lt;/em&gt; helps you install stuff, it doesn't yet help you uninstall any of it. Though this can be easily added, I haven't spent time thinking about this use-case yet.&lt;/p&gt;

&lt;p&gt;You might also have noticed that the choices that &lt;em&gt;twiner&lt;/em&gt; presents to you are limited. It starts with the assumption that you're looking to set up your graphical desktop with &lt;a href="https://www.x.org/wiki" rel="noopener noreferrer"&gt;Xorg&lt;/a&gt; and doesn't even mention &lt;a href="https://wayland.freedesktop.org" rel="noopener noreferrer"&gt;Wayland&lt;/a&gt;. Part of this can be justified that if you're the person who's looking for Wayland on your computer, there's a high probability that you won't even be needing &lt;em&gt;twiner&lt;/em&gt; to help you. Also, the choices for graphical environments and especially display servers can be increased, but I've almost only included the ones that I could test install myself and didn't want to include half-broken choices.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>bash</category>
      <category>gui</category>
    </item>
    <item>
      <title>How I automated my workstation setup</title>
      <dc:creator>Mohammed Ismail Ansari</dc:creator>
      <pubDate>Thu, 18 Mar 2021 22:01:27 +0000</pubDate>
      <link>https://dev.to/myterminal/how-i-automated-my-workstation-setup-2c8p</link>
      <guid>https://dev.to/myterminal/how-i-automated-my-workstation-setup-2c8p</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is a transcript of a video that you can watch by clicking the below thumbnail. Hence, certain statements may not make sense in this text form, and watching the video instead is recommended.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/fa0zt2ouFIQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Previously...
&lt;/h2&gt;

&lt;p&gt;In the previous video, we talked about how I got tired of re-configuring my computers manually, got lazy, and wrote some scripts to perform most of it in an automated way. If you haven't watched the previous video, I highly recommend watching it first, as if you don't have the context, you most probably may not be able to appreciate the demo we're about to see in a moment.&lt;/p&gt;

&lt;p&gt;If you already have the context, which was quite a lot of theory, let's finally see some action.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Linux Distribution we'll use
&lt;/h2&gt;

&lt;p&gt;My primary Linux distribution for quite a long time has been &lt;a href="https://archlinux.org" rel="noopener noreferrer"&gt;Arch&lt;/a&gt;, and that is the one we'll install during the demo today.&lt;/p&gt;

&lt;p&gt;The base (or vanilla) Arch does not come with the regular graphical installer that most of us are familiar with. Instead, the entire installation happens within a command-line terminal and involves typing a lot of commands manually. &lt;a href="https://wiki.archlinux.org" rel="noopener noreferrer"&gt;Arch documentation&lt;/a&gt; is enormous for almost everything and hence they have a pretty detailed page dedicated for installation as well, which you can find &lt;a href="https://wiki.archlinux.org/index.php/Installation_guide" rel="noopener noreferrer"&gt;here&lt;/a&gt;. After I successfully installed Arch for the first time on my &lt;a href="https://www.ebay.com/itm/Dell-Precision-T3600-8-Core-2-60GHz-E5-2670-Wholesale-Custom-To-Order-No-OS/382071287250" rel="noopener noreferrer"&gt;Dell desktop&lt;/a&gt;, I created a couple of personal notes as &lt;a href="https://gist.github.com/discover" rel="noopener noreferrer"&gt;Gists on GitHub&lt;/a&gt; for my own reference. You can find them &lt;a href="https://gist.github.com/myTerminal/cdeb61cbc7f4b4e4a5cf6a60ab7021a2" rel="noopener noreferrer"&gt;here&lt;/a&gt; and &lt;a href="https://gist.github.com/myTerminal/f8723f30661296c1b6f9d04bb201a4c4" rel="noopener noreferrer"&gt;here&lt;/a&gt;, each of them being for a very specific computer. Obviously, both of these links are mentioned in the description. They're mostly based around the steps mentioned in Arch's official setup guide, and though you should rather refer to the official material, it can serve as an example for quick reference, just in case.&lt;/p&gt;

&lt;p&gt;One other thing about this basic Arch setup is that you need to install and configure many more things according to your preferences, all by yourself. Though I like to do it this way so that I have the most control over how I set up my Linux, not everyone would want to go through this lengthy and arguably difficult process. So, if instead of a basic system, you're looking for a ready-to-use out-of-the-box system that is still Arch, you can install one of the Linux distributions based on Arch, and there are plenty of them, just like there are so many of them based on &lt;a href="https://www.debian.org" rel="noopener noreferrer"&gt;Debian&lt;/a&gt; and &lt;a href="https://ubuntu.com" rel="noopener noreferrer"&gt;Ubuntu&lt;/a&gt;. When speaking of Arch-based distributions, you cannot miss mentioning &lt;a href="https://manjaro.org" rel="noopener noreferrer"&gt;Manjaro&lt;/a&gt; as it's one of the best Arch-based Linux distributions out there and it comes with a range of official and community editions for you to choose from. Installing one of these Arch-based distributions is way easier as they come with the familiar graphical installer, which is often the &lt;a href="https://calamares.io" rel="noopener noreferrer"&gt;Calamares&lt;/a&gt; installer.&lt;/p&gt;

&lt;p&gt;Now, these two options are at the two opposite ends of the spectrum, and just in case if you need something in between, which is as close as possible to vanilla Arch and also comes with a graphical installer, you can use something like &lt;a href="https://arcolinux.info" rel="noopener noreferrer"&gt;ArcoLinux&lt;/a&gt;, my favorite Arch-based distribution, which was in fact my entry point to the Arch ecosystem. We'll use ArcoLinux for the demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  The virtualization tool
&lt;/h2&gt;

&lt;p&gt;For obvious reasons, I won't re-install the operating system on my machine for the demo, and it's not feasible to record the screen while doing so either, so we'll do it in a virtual machine, which is probably the best-suited way to run such experiments. First of all, you don't have to make changes to your computer and you can still get a feel of the new operating system in a sandbox totally separate from the host computer. The best part is that any mistake that might happen during the process doesn't cost you hours (or days) to get back to where you started from.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.virtualbox.org" rel="noopener noreferrer"&gt;VirtualBox&lt;/a&gt; is a pretty popular virtualization solution and has been the one that I've been using on my computers for several years as well. However, we'll use a new tool for this demo, it's called &lt;a href="https://help.gnome.org/users/gnome-boxes/stable" rel="noopener noreferrer"&gt;Gnome Boxes&lt;/a&gt;. Gnome Boxes is an easy and modern way of running virtual machines without much configuration. Back when I tried it for the first time, I felt strongly obligated to give it a shout-out on Mastodon and another user replied to my Toot saying &lt;a href="https://linuxrocks.online/@myTerminal/105019377701406047" rel="noopener noreferrer"&gt;Boxes creates a VM as easy as a picture viewer opens a picture&lt;/a&gt;. That tells you how easy it is to use. I also didn't know one can right-click on an ISO file and create a virtual machine: that's cute!&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: A quick Arco install
&lt;/h2&gt;

&lt;p&gt;The first step for almost all operating system installations is &lt;a href="https://arcolinux.info/download" rel="noopener noreferrer"&gt;downloading an ISO&lt;/a&gt;, mostly from the official website for that Linux distribution and that's exactly where we'll start the process. We'll download ArcoLinuxD, which is the only one among the three that can help us achieve a minimal install that we can work on. Though Gnome Boxes allows you to choose a distribution and it automatically downloads it for you from the web, I like to do it the old-school way such that I supply the ISO for my virtual machine.&lt;/p&gt;

&lt;p&gt;So I choose to create a new virtual machine, provide it with the ISO to use, specify the template as "Arch Linux" and proceed with the suggested default. Just like I said, it was so easy to create a virtual machine with minimal prompts and questions.&lt;/p&gt;

&lt;p&gt;For this video, I'll rush through a minimal installation of ArcoLinux where I unselect every possible checkbox, choose automatic partitioning which I never do on my main machine, and create a root user. This makes sure we have the cleanest possible installation that still works as we'll be installing all that we need in the upcoming steps. Let me fast-forward this so that we can save some time. Once the installation is complete, we reboot into our fresh system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: What we have on the first startup
&lt;/h2&gt;

&lt;p&gt;On the first login, as expected, we find a minimal installation of ArcoLinux (basically Arch) that'll start on the command prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: Next steps at a glance
&lt;/h2&gt;

&lt;p&gt;Now that we have a running Linux system, we can bring in my custom setup scripts and set up the rest of the system with a little help from &lt;a href="https://github.com/myterminal/twiner" rel="noopener noreferrer"&gt;twiner&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All that we need for this step resides under &lt;a href="https://github.com/myTerminal/dotfiles/tree/master/.setup" rel="noopener noreferrer"&gt;here&lt;/a&gt; and fortunately, with all the scripts arranged as an independent Bash program, we'll only be running a single command and the scripts will take care of the rest for us.&lt;/p&gt;

&lt;p&gt;After the process is complete, we'll have a system that will very closely resemble my primary Linux installation, in fact, the system I've recorded this video on, with very little left to do manually, most of which would be mundane things like logging into my &lt;a href="https://www.mozilla.org/en-US/firefox" rel="noopener noreferrer"&gt;Firefox&lt;/a&gt; to sync my account and settings, and a few things here and there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: Starting my automated setup
&lt;/h2&gt;

&lt;p&gt;Back when I first implemented &lt;a href="https://github.com/myTerminal/dotfiles/blob/20049c76ee6832dcd6635d0b1b36a632d853bb9a/.scripts/setup.sh" rel="noopener noreferrer"&gt;a setup script&lt;/a&gt; in my dotfiles, getting it onto my new computer involved multiple steps. Not that the steps were very complicated in any way, but they had to be all typed manually.&lt;/p&gt;

&lt;p&gt;So I created &lt;a href="https://github.com/myTerminal/dotfiles/blob/master/.setup/bootstrap" rel="noopener noreferrer"&gt;a single script&lt;/a&gt; with all those commands that just manages to take care of everything: cloning my dotfiles as a local workspace on the target computer, and then starting the setup. The scripts are in no way perfect, but at least they work every single time.&lt;/p&gt;

&lt;p&gt;Once the script is in place, I now just have to start it all with only &lt;a href="https://github.com/myTerminal/dotfiles#note-for-my-future-self" rel="noopener noreferrer"&gt;a single command&lt;/a&gt;. Though this command is still not short enough, I think one command is still better than seven. So I start the process by typing it in the terminal and hitting 'Enter'.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: Detection of the current operating system
&lt;/h2&gt;

&lt;p&gt;Apart from fetching &lt;em&gt;twiner&lt;/em&gt; and loading it as a dependency, the first step in my scripts is to detect the running operating system. As I've mentioned earlier, the setup at present only supports Arch and &lt;a href="https://www.apple.com/macos/big-sur" rel="noopener noreferrer"&gt;macOS&lt;/a&gt;, when either of them is found, scripts for the appropriate one are loaded and run.&lt;/p&gt;

&lt;p&gt;For this video, we'll only look at the sequence of steps for setting up my workstation on Arch. The steps for macOS are pretty much the same with a few minor differences here and there, but that could probably be for another video.&lt;/p&gt;

&lt;p&gt;If the operating system is found to be outside the two this thing has been programmed for, the setup quits with a message right as you expect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: Initial steps for Linux
&lt;/h2&gt;

&lt;p&gt;The first step for Arch is setting up the machine &lt;a href="https://en.wikipedia.org/wiki/Hostname" rel="noopener noreferrer"&gt;hostname&lt;/a&gt; so if I choose to do it, I can enter a hostname to use.&lt;/p&gt;

&lt;p&gt;The only next step before we start installing the required packages is creating users. As we've already created a user for me during the actual ArcoLinux installation, we can safely skip this step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: Installing packages
&lt;/h2&gt;

&lt;p&gt;The steps for installing the packages that constitute my daily workflow in Arch start with first installing &lt;a href="https://github.com/Jguer/yay" rel="noopener noreferrer"&gt;yay&lt;/a&gt;, which is one of the best helper tools out there to ease up the installation of packages from the &lt;a href="https://aur.archlinux.org" rel="noopener noreferrer"&gt;AUR&lt;/a&gt;. Once &lt;code&gt;yay&lt;/code&gt; is installed, the setup first installs packages from the official archives through &lt;code&gt;pacman&lt;/code&gt; and then installs the rest from the AUR through &lt;code&gt;yay&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This step is the one where we'll have to wait for the most, so I'll fast-forward it as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: A few more steps for Linux
&lt;/h2&gt;

&lt;p&gt;We take care of a few more steps before we start setting up the GUI. One of them is switching the default user shell to &lt;a href="https://fishshell.com" rel="noopener noreferrer"&gt;fish-shell&lt;/a&gt;. This step is still not totally automated, and I have to do some typing here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: Setting up the GUI
&lt;/h2&gt;

&lt;p&gt;The step where we configure our graphical environment is pretty lengthy on its own self. For this very reason, I've planned a separate video to cover this in detail. To be as concise as I can be, this step installs &lt;a href="https://www.x.org/wiki/XServer" rel="noopener noreferrer"&gt;XServer&lt;/a&gt; as a &lt;a href="https://en.wikipedia.org/wiki/Display_server" rel="noopener noreferrer"&gt;display server&lt;/a&gt;, prompts for installation of graphic drivers from a small list of options, installs a &lt;a href="https://wiki.archlinux.org/index.php/Display_manager" rel="noopener noreferrer"&gt;display manager&lt;/a&gt; (also through a prompt) and then finally prompts for installation of a graphical environment from a reasonably long list of &lt;a href="https://en.wikipedia.org/wiki/Desktop_environment" rel="noopener noreferrer"&gt;desktop environments&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Window_manager" rel="noopener noreferrer"&gt;window managers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let me fast-forward the video for this step as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: Installing peripheral drivers
&lt;/h2&gt;

&lt;p&gt;Next, we install drivers for my peripheral devices, which at this point is only one: my &lt;a href="https://www.razer.com/gaming-keyboards/razer-ornata-chroma/RZ03-02040100-R3M1" rel="noopener noreferrer"&gt;Razer Ornata Chroma&lt;/a&gt; keyboard that I never use outside of my desktop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: Setting up startup services
&lt;/h2&gt;

&lt;p&gt;Then I set up startup services, the first one of them is &lt;a href="https://syncthing.net" rel="noopener noreferrer"&gt;Syncthing&lt;/a&gt; (my local cloud) and then there's &lt;a href="https://wiki.archlinux.org/index.php/NetworkManager" rel="noopener noreferrer"&gt;network-manager&lt;/a&gt; service so that I can connect to wireless networks on Arch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: A few platform-independent steps
&lt;/h2&gt;

&lt;p&gt;After the completion of the platform-specific steps, there are a few more platform-independent steps. I'll skip all of these for the video.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We can generate an &lt;a href="https://wiki.archlinux.org/index.php/SSH_keys" rel="noopener noreferrer"&gt;SSH key&lt;/a&gt; for the device&lt;/li&gt;
&lt;li&gt;Then we can install all global &lt;a href="https://www.npmjs.com" rel="noopener noreferrer"&gt;NPM&lt;/a&gt; packages for my daily use&lt;/li&gt;
&lt;li&gt;Then comes one of the most important pieces of my setup: &lt;a href="https://github.com/myTerminal?tab=repositories&amp;amp;q=&amp;amp;type=source" rel="noopener noreferrer"&gt;my public projects on GitHub&lt;/a&gt;. We can use the previously installed NPM package &lt;a href="https://www.npmjs.com/package/git-getter" rel="noopener noreferrer"&gt;git-getter&lt;/a&gt; to clone all of my projects utilizing the SSH key we generated in the previous step. This is currently broken unless the previously generated SSH key is already added to my GitHub account and that's pretty much impossible before I could start a web-browser on this computer and add the key.&lt;/li&gt;
&lt;li&gt;Finally, I take care of a few more minor steps around my &lt;a href="https://www.gnu.org/software/emacs" rel="noopener noreferrer"&gt;Emacs&lt;/a&gt; configuration which includes creating a fallback Emacs directory in case &lt;a href="https://wiki.archlinux.org/index.php/XDG_user_directories" rel="noopener noreferrer"&gt;XDG config directory&lt;/a&gt; is not supported on the installed Emacs, and then linking my configs as a default config to my dotfiles. Don't worry if you don't really get what these last steps mean, you can safely ignore them thinking that they're too specific to my personal setup.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Demo: Reboot on done
&lt;/h2&gt;

&lt;p&gt;This concludes the setup with a simple reboot.&lt;/p&gt;

&lt;p&gt;And there we have a Gnome shell login where I choose my preferred environment and log in. So we made it!&lt;/p&gt;

&lt;h2&gt;
  
  
  More computer-specific scripts
&lt;/h2&gt;

&lt;p&gt;If I run this setup on a generic computer, I can consider the setup complete at this point. However, there could be a few more steps to make sure my setup can utilize the hardware I'm running it on. Speaking of specific hardware, a great example can be my new &lt;a href="https://www.lenovo.com/us/en/laptops/thinkpad/thinkpad-x1/ThinkPad-X1-Extreme-Gen-3/p/20TKCTO1WWENUS0" rel="noopener noreferrer"&gt;Lenovo ThinkPad X1 Extreme (Gen 3)&lt;/a&gt;. I have &lt;a href="https://github.com/myTerminal/dotfiles/blob/master/.scripts/linux/mt-excelsior-setup" rel="noopener noreferrer"&gt;a reasonably lengthy script&lt;/a&gt; dedicated for the particular device, specific to an Arch install that takes care of the gaps for that particular hardware. As I've already mentioned in my video about how I configured my ThinkPad for Arch, it takes care of a lot of things like setting up the right DPI for the 4K screen, sets up hybrid graphics with &lt;a href="https://wiki.archlinux.org/index.php/NVIDIA_Optimus" rel="noopener noreferrer"&gt;Nvidia Optimus&lt;/a&gt;, fixes audio issues, enables some basic power-saving, etc. This is another of those things that are still under development, but at this point, it already makes the computer much more usable than it would be otherwise without these additional steps.&lt;/p&gt;

&lt;p&gt;This script resides with &lt;a href="https://github.com/myTerminal/dotfiles/tree/master/.scripts" rel="noopener noreferrer"&gt;a bunch of other scripts I keep in my dotfiles&lt;/a&gt; for a few other purposes and is also added to my &lt;code&gt;$PATH&lt;/code&gt; so that I can invoke it without referring to its physical location. Not that it adds any value, but why not?&lt;/p&gt;

&lt;h2&gt;
  
  
  Thoughts
&lt;/h2&gt;

&lt;p&gt;So as we saw, setting up a new workstation doesn't take a lot of manual effort anymore. Most of these steps are also made optional through prompts so testing a particular part of the setup on a temporary system is also pretty simple as I can perform only what I want and skip the rest. One other thing to note is that these scripts keep improving over time and what I demoed today is just a representation of its state at the time of this video.&lt;/p&gt;

&lt;p&gt;One challenge to maintaining all this code is to watch for the things that keep breaking with the changing nature of the underlying dependencies including Linux. One way to make sure there's nothing broken is to run the entire script end-to-end every few weeks, finding out what all is broken, and fixing it. What I demoed today might look close to perfect, but the more I improve it, the more it feels lacking. I guess that's a good thing as there's no limit on how much one can learn and hence, implement new stuff as well.&lt;/p&gt;

&lt;p&gt;There's still so much to improve and as &lt;a href="https://en.wikipedia.org/wiki/Hal_Abelson" rel="noopener noreferrer"&gt;Professor Harold Abelson&lt;/a&gt; once rightly said, "...the constraints imposed in building large software systems are the limitations of our own minds". Though my scripts aren't nearly as big as what &lt;a href="https://www.youtube.com/watch?v=-J_xL4IGhJA" rel="noopener noreferrer"&gt;he referred to back in 1986&lt;/a&gt;, you get the point.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>setup</category>
    </item>
    <item>
      <title>What my workstation setup is to me</title>
      <dc:creator>Mohammed Ismail Ansari</dc:creator>
      <pubDate>Thu, 18 Mar 2021 21:55:58 +0000</pubDate>
      <link>https://dev.to/myterminal/what-my-workstation-setup-is-to-me-263o</link>
      <guid>https://dev.to/myterminal/what-my-workstation-setup-is-to-me-263o</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is a transcript of a video that you can watch by clicking the below thumbnail. Hence, certain statements may not make sense in this text form, and watching the video instead is recommended.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/HToKwQZF71k"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Setting up a computer (at least to me) is a very cumbersome activity, and even more so when it's a daily driver. In this short series of videos, I'll show you how my workstation setup is almost automated so the process is pretty quick and yet convenient so that I don't have to lose my mind every time I re-configure my daily driver.&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;By daily-drivers, I'm not referring to work laptops owned by your employer, which is a topic for another day, but take for example my personal computer on which I spend more time than I do even on my cellphone, there's so much to take care of. Also, if you're a Linux user like me, the setup is not as straightforward as it usually is for Windows, full of quirks here and there, and a lot of additional steps added to the process.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a setup feels like to me
&lt;/h2&gt;

&lt;p&gt;For a few reasons, I find a computer setup even more tedious:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Activities like this tend to quickly make me feel overwhelmed. Part of this is because I plan a little too much, noting down every trivial step as if it would make the final result any better.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I expect things to be exactly the way I want them to be and tolerate almost zero deviation in my plan. So the plan that's (usually) already so detailed, becomes even more stressful, and then there's the fear of failure and a potential loss of the most valuable entity in this human life: time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If at all the process spans across multiple sessions, the urge to drag it to the end doesn't let me sleep with peace; and focus on my other tasks gets affected as well.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These factors (along with a few more) drove me to create a system in place such that I don't lose my mind every time I configure a computer from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two kinds of setups
&lt;/h2&gt;

&lt;p&gt;During all these years, I've performed at least two different kinds of setups:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Full setup&lt;/strong&gt;, which could either be on a new machine or hard-drive or it could be an old machine undergoing some low-level changes in the setup like the partition table such that there's total data loss. This is the one I'm usually scared of, as there are more steps and hence more number of things to go wrong.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Partial setup&lt;/strong&gt;, which is a re-setup utilizing a decent part of a previous setup such that I don't lose everything, and can continue from somewhere in between by refilling the gaps on the existing setup. This is the easier of the two kinds.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  My setup as a code
&lt;/h2&gt;

&lt;p&gt;Since I moved out of Windows, one of the many things I loved about these UNIX-like operating systems (Linux and macOS) is that everything that can be done through a graphical interface as the normies do can also be done through the command-line. To me, the most obvious advantage of being able to do things over the command line is that one can create an automated script which when executed, can perform the same steps as many times as required, with virtually zero error.&lt;/p&gt;

&lt;p&gt;I used this possibility of automation to convert my workstation setup notes (actually spreadsheets) into &lt;a href="https://github.com/myTerminal/dotfiles/blob/20049c76ee6832dcd6635d0b1b36a632d853bb9a/.scripts/setup.sh" rel="noopener noreferrer"&gt;a single Bash script&lt;/a&gt;, which later-on evolved into &lt;a href="https://github.com/myTerminal/dotfiles/tree/master/.setup" rel="noopener noreferrer"&gt;a fully-fledged arrangement of scripts&lt;/a&gt; that can be considered as an independent program which as of today, constitutes a significant part of my &lt;a href="https://github.com/myterminal/dotfiles" rel="noopener noreferrer"&gt;dotfiles on GitHub&lt;/a&gt;. We'll have a detailed look at it in just a moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principles of my setup
&lt;/h2&gt;

&lt;p&gt;Time for some theory now! I promise to keep it as less boring as I can.&lt;/p&gt;

&lt;p&gt;There's no such official standard I follow in my setup scripts, but now that I think about it, I see at least four principles being followed very closely:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lean&lt;/strong&gt;: This means that not only the scripts are as &lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself" rel="noopener noreferrer"&gt;DRY&lt;/a&gt; as possible, but I've also tried to make sure that &lt;a href="https://github.com/myTerminal/dotfiles#software-selection" rel="noopener noreferrer"&gt;my software selection&lt;/a&gt; is such that it only includes a single software for a particular job. If at all I find a software that can replace two or more of the others already on the list, especially if it improves the results, I shorten the list by replacing the old candidates with a single new candidate. It also implies that I don't have a single software in the list that has no purpose in the system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducible&lt;/strong&gt;: This was in fact the primary purpose to create this entire thing, so that I can re-create my software-setup with minimal effort or confusion, as many times as I need. This also means that every single persistent configuration change that I make on my computer needs to be done in a way that I can automate it. I shouldn't need to remember anything, the scripts should be capable of re-creating it for me. A simple example could be changing the default user shell.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documented&lt;/strong&gt;: This comes from the fact that I've placed plenty of comments for my own future reference, and also a lot of times the way the scripts have been arranged, that documents much of it. All this keeps evolving just like any other computer code does, but it always represents my most current computer setup for all the primary operating systems I use on all my personal computers, which at times could be two or three, each running a different operating system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portable&lt;/strong&gt;: It goes without saying that as all this is hosted on GitHub, my dotfiles are completely portable and the setup can be executed on any computer with internet access. So not only do I carry my installation scripts, but I also have access to the same configuration files on each of my computers. An update is as close and simple as a &lt;code&gt;git pull&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How it started
&lt;/h2&gt;

&lt;p&gt;As I mentioned in my earlier videos that I used to be a Windows user for 14 years until I switched to Linux in 2013. I started documenting my workstation setup on my first laptop computer, the &lt;a href="https://www.dell.com/us/dfh/p/studio-15/pd" rel="noopener noreferrer"&gt;2010 Dell Studio 1558&lt;/a&gt;. It used to be a reasonably detailed spreadsheet file, briefly mentioning the items my setup comprised of. Out of all the file versions I ever created, only one file was for Windows, but as I moved to Linux, a new file got created for every Linux distribution I hopped through, and the number was obviously not small.&lt;/p&gt;

&lt;p&gt;I slowly started to introduce "category" as a column to group those applications (and games) and I learned that you could quickly aggregate a column of cells into an installation command that could install all of the applications at once. This definitely came from my younger brother, who was way ahead of me in the way he used Linux back then.&lt;/p&gt;

&lt;p&gt;At one point, I eventually started maintaining &lt;a href="https://github.com/myTerminal/dotfiles/blob/20049c76ee6832dcd6635d0b1b36a632d853bb9a/.scripts/setup.sh" rel="noopener noreferrer"&gt;a single bash file in my GitHub dotfiles&lt;/a&gt; with the command and so there was no need to maintain spreadsheets anymore. This arrangement also allowed me to document the commands required to configure additional package sources and remained as a single file for quite a long time until one day it all of a sudden exploded into multiple smaller files each for its own purpose.&lt;/p&gt;

&lt;p&gt;There were at least two major overhauls to this project in the following years. The first one was when &lt;a href="https://github.com/myTerminal/dotfiles/commits/master?after=686317c09d4970832cc1c0f8d243f9e8436e8f53+509&amp;amp;branch=master" rel="noopener noreferrer"&gt;I switched to macOS&lt;/a&gt; and wanted to make it work on two different operating systems at once. Then it mostly stayed that way with minor updates until my turning back to Linux that happened in late 2019, where at one point there were &lt;a href="https://github.com/myTerminal/dotfiles/tree/f464c58c106e979fe9e79a28a12cd171fccd8933/.setup" rel="noopener noreferrer"&gt;four different operating systems supported at once&lt;/a&gt;. For obvious reasons, the only two to remain there today are &lt;a href="https://archlinux.org" rel="noopener noreferrer"&gt;Arch&lt;/a&gt; (my primary) and &lt;a href="https://www.apple.com/macos/big-sur" rel="noopener noreferrer"&gt;macOS&lt;/a&gt; (just in case).&lt;/p&gt;

&lt;h2&gt;
  
  
  Then came twiner
&lt;/h2&gt;

&lt;p&gt;I keep mentioning &lt;a href="https://www.linux4everyone.com" rel="noopener noreferrer"&gt;Linux for Everyone&lt;/a&gt; repeatedly and also the latter half of 2019 which was the start of my return to Linux for the second time, and that was actually the time I got to learn more about Linux than I ever thought I would. I looked at Bash from a completely fresh perspective and started applying my learning to various projects of mine, including &lt;a href="https://github.com/myTerminal/project-euler-solutions" rel="noopener noreferrer"&gt;project-euler-solutions&lt;/a&gt;. What this project actually is, it's way outside the scope of this video, but you can find the link in the description and check it out yourself if you're interested to know anyway.&lt;/p&gt;

&lt;p&gt;I never had a proper introduction to shell scripting before and as far as I remember, my first shell script was indeed the simple packages installation script for my Linux setup. Needless to say, I started improving my setup scripts and soon realized that most of the scripts that I was writing could be re-used. Around the same time, due to my failure of being able to run a regular Linux distribution on my &lt;a href="https://www.ebay.com/itm/Dell-Precision-T3600-8-Core-2-60GHz-E5-2670-Wholesale-Custom-To-Order-No-OS/382071287250" rel="noopener noreferrer"&gt;Dell Precision T3600 desktop&lt;/a&gt; due to the incompatibility of the super-old hardware with the latest &lt;a href="https://www.x.org/wiki/XServer" rel="noopener noreferrer"&gt;Xserver&lt;/a&gt; packages, I literally had to learn setting up a command-line Linux for graphical use. More configuration meant adding more code to my setup scripts, and all this extra code was a perfect candidate for my library of functions for Linux setup and this led me to create &lt;a href="https://github.com/myterminal/twiner" rel="noopener noreferrer"&gt;twiner&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Twiner&lt;/em&gt; (as I call it) is a collection of Bash scripts for configuring Linux. It can either be used as a standalone program or otherwise as a library to build your own. Currently, only three major flavors of Linux are supported: &lt;a href="https://www.debian.org" rel="noopener noreferrer"&gt;Debian&lt;/a&gt;/&lt;a href="https://ubuntu.com" rel="noopener noreferrer"&gt;Ubuntu&lt;/a&gt;, &lt;a href="https://getfedora.org" rel="noopener noreferrer"&gt;Fedora&lt;/a&gt;, and &lt;a href="https://archlinux.org" rel="noopener noreferrer"&gt;Arch&lt;/a&gt; of course. These along with the derivative distributions of these major distributions cover the greater part of the Linux community, at least for the non-veterans of Linux.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>setup</category>
    </item>
    <item>
      <title>I moved back from macOS to Linux and I'm loving it!</title>
      <dc:creator>Mohammed Ismail Ansari</dc:creator>
      <pubDate>Thu, 18 Mar 2021 21:33:50 +0000</pubDate>
      <link>https://dev.to/myterminal/how-i-moved-back-from-macos-to-linux-19f5</link>
      <guid>https://dev.to/myterminal/how-i-moved-back-from-macos-to-linux-19f5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article outlines my transition back from macOS to Linux with the help of references to the videos in the series I created last year. You can find &lt;a href="https://www.youtube.com/playlist?list=PLe6BbPAW-Wxgz5Jly855Aw3qWRiWqTXHO" rel="noopener noreferrer"&gt;the complete playlist here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A recap of my computing experience
&lt;/h2&gt;

&lt;p&gt;In the first video, I talked about my computing experience that started from Windows back in 1999, traveling through several Linux distros in the next few years, finally settling on macOS. After the brief history, I talk about the reasons for my return to Linux and also list down a few pros and cons of the move in relation to my new machine.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ix_Ji-lS_no"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  My return to Windows for a very short while
&lt;/h2&gt;

&lt;p&gt;In the second video, I describe my experience with Windows after several years for how it feels especially on the new device, and then I also briefly talk about my experience re-setting it up to make space for my primary Linux installation.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/c5bhNC4mVBs"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up my new machine with Linux
&lt;/h2&gt;

&lt;p&gt;In the third video, I dive deeper into the details on how I configured my new machine with Linux with a backup Windows partition and also talk about the challenges that I faced and the steps that I took in a little detail.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/u4ivXywSekY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up Nvidia hybrid graphics
&lt;/h2&gt;

&lt;p&gt;In the fourth video, I talk about how I configured Nvidia hybrid drivers for my device and also the challenges that I faced, the limitations of the setup and, my custom tweaks to the arrangement.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/vRl2DTlH1Js"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Gaps and Issues
&lt;/h2&gt;

&lt;p&gt;In the (then) final video I talk about the gaps and issues in my setup that I wanted to fill in after successful migration from the macOS ecosystem to Arch Linux.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/HDmJSgtJqmw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Further
&lt;/h2&gt;

&lt;p&gt;After I posted the fifth video in the series, I've taken care of most of the gaps and issues in my setup and will be making another video to talk about the fixes soon.&lt;/p&gt;

&lt;p&gt;I'm totally loving my new setup. Do throw in your thoughts in the comments and hopefully, I can learn about something I might have missed.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>macos</category>
      <category>setup</category>
    </item>
    <item>
      <title>5+ ways how Rust makes you a better programmer: An initial review of my new favorite programming language</title>
      <dc:creator>Mohammed Ismail Ansari</dc:creator>
      <pubDate>Mon, 09 Mar 2020 21:54:23 +0000</pubDate>
      <link>https://dev.to/myterminal/5-ways-how-rust-makes-you-a-better-programmer-an-initial-review-of-my-new-favorite-programming-language-43i2</link>
      <guid>https://dev.to/myterminal/5-ways-how-rust-makes-you-a-better-programmer-an-initial-review-of-my-new-favorite-programming-language-43i2</guid>
      <description>&lt;p&gt;&lt;em&gt;[This story was originally posted on &lt;a href="http://ismail.teamfluxion.com/diary/20200309/5_plus_ways_how_Rust_makes_you_a_better_programmer" rel="noopener noreferrer"&gt;my personal blog&lt;/a&gt;]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With my recent dive into Rust as a low-level programming language and brief experience in its eco-system, it managed to impress the programmer in me.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Through balancing powerful technical capacity and a great developer experience, Rust gives you the option to control low-level details (such as memory usage) without all the hassle traditionally associated with such control. - &lt;a href="https://doc.rust-lang.org/1.30.0/book/2018-edition/ch00-00-introduction.html" rel="noopener noreferrer"&gt;RustLang Book&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It feels like it tries to protect me from the remotest potential trouble I might run into unless it feels that the code that I write is 100% safe.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In Rust, the compiler plays a gatekeeper role by refusing to compile code with these elusive bugs, including concurrency bugs. - &lt;a href="https://doc.rust-lang.org/1.30.0/book/2018-edition/ch00-00-introduction.html" rel="noopener noreferrer"&gt;RustLang Book&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Upon reading the initial few sections of &lt;a href="https://doc.rust-lang.org/1.30.0/book/2018-edition/ch00-00-introduction.html" rel="noopener noreferrer"&gt;the Rust Lang documentation&lt;/a&gt; (and this would probably be the first time I'm reading the documentation for a programming language with such great detail), it didn't take me long to come up with the below-mentioned reasons for how Rust tries to make me a better programmer.&lt;/p&gt;

&lt;h2&gt;
  
  
  A mutation is only allowed when explicitly declared in advance
&lt;/h2&gt;

&lt;p&gt;All variables in Rust are immutable by default. Once set, the value of a variable cannot be changed unless the variable was explicitly declared as mutable back when it was first declared.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let my_name = "John";
my_name = "James";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The above would fail to compile as the variable &lt;code&gt;my_name&lt;/code&gt; is immutable. However, if you would have declared it to be 'mutable', it can very well be changed later on.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let mut my_name = "John";
my_name = "James";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This might appear to be very limiting at first but it helps eliminate potential bugs occurring when a part of your program assumes that it is the only one making changes to the value of a variable but it has been changed from elsewhere as well. It also automatically makes your programs concurrency ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  You can use the same name for multiple variables
&lt;/h2&gt;

&lt;p&gt;In many programming languages, a variable can be shadowed when an inner-scope uses a variable of the same as the one outside. For example, in the below arguably useless JavaScript snippet, the variable &lt;code&gt;i&lt;/code&gt; is shadowed:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const i = 0;

if (someResult) {
    const i = 1;
    someFunction(i);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Even though a variable &lt;code&gt;i&lt;/code&gt; exists in the outer scope with a value &lt;code&gt;0&lt;/code&gt;, the value passed to the function &lt;code&gt;someFunction&lt;/code&gt; will be from the one in the inner scope and will be &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In Rust, you can shadow a variable in the same scope. It can help you condition or polish a value and store it in a variable of the same name rather than having multiple variations of a variable.&lt;/p&gt;

&lt;p&gt;So, instead of&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let spaces = "   ";
let spaces_len = spaces.len();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;you can write&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let spaces = "   ";
let spaces = spaces.len();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;and then refer to the count of spaces using the variable &lt;code&gt;spaces&lt;/code&gt;, rather than having to maintain two separate variables, one containing the actual spaces as a &lt;code&gt;String&lt;/code&gt; and another one to hold the count as an &lt;code&gt;int&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  It encourages you to handle potential failures explicitly
&lt;/h2&gt;

&lt;p&gt;Many operations in Rust return you a value of type &lt;code&gt;io::Result&lt;/code&gt;, which is an enumeration of possible outcomes of an operation, &lt;code&gt;Ok&lt;/code&gt; and &lt;code&gt;Err&lt;/code&gt;, the first indicating that the operation was successful while the other indicating that something went wrong.&lt;/p&gt;

&lt;p&gt;The below line would read user input from the terminal and store the result in the specified variable &lt;code&gt;user_input&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;std::io::stdin().read_line(&amp;amp;mut user_input)
    .expect("Failed to read line");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Though the call &lt;code&gt;read_line&lt;/code&gt; would work on its own, calling &lt;code&gt;expect&lt;/code&gt; on the result of the operation prevents Rust from complaining that a potential failure was not handled. Please note that this is not the best way to handle failures, but a practical solution would be way outside the scope of this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  There is no way you can use multiple &lt;code&gt;return&lt;/code&gt;s in a function
&lt;/h2&gt;

&lt;p&gt;There is no &lt;code&gt;return&lt;/code&gt; keyword in Rust. I relate it to the &lt;a href="https://en.wikipedia.org/wiki/Lisp_(programming_language)" rel="noopener noreferrer"&gt;Lisp&lt;/a&gt; family of languages where everything is a list. Even a function is a list of expressions and the return value is the last item in the list.&lt;/p&gt;

&lt;p&gt;Consider the below code in Lisp:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(defun add (a b)
    (message (concat "You passed "
                     (number-to-string a)
                     " and "
                     (number-to-string b)))
    (+ a b))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You would've noticed that the above function definition doesn't contain a &lt;code&gt;return&lt;/code&gt; keyword and yet returns the sum of the two input arguments. This does not only save you a few key-strokes while typing the code but also makes you a better programmer by forcing you to design your functions such that they only have a single return path and hence are easier to be interpreted.&lt;/p&gt;

&lt;p&gt;An equivalent code in Rust would look like below:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fn add(a: i32, b: i32) -&amp;gt; i32 {
    println!("You passed {} and {}", a, b);
    a + b
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Notice the absence of a &lt;code&gt;;&lt;/code&gt; at the end of the last line of the function &lt;code&gt;add&lt;/code&gt;, which makes it a return value. As Rust is an expression-based language, any line ending with a &lt;code&gt;;&lt;/code&gt; is considered as a statement (which almost always performs a side-effect) while a line that doesn't end with a &lt;code&gt;;&lt;/code&gt; becomes an expression, which can very well be used as the last line of a function to return a value.&lt;/p&gt;

&lt;p&gt;This also introduces us to a whole new world of programming where even an &lt;code&gt;if&lt;/code&gt; block can return a value!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;UPDATE: This was a misinterpretation being an "early" review and me jumping to conclusions very quickly without referring to complete documentation. Thanks to &lt;a href="https://dev.to/jimskapt"&gt;@jimskapt&lt;/a&gt; for pointing it out, Rust does have a &lt;code&gt;return&lt;/code&gt; keyword, just that I found that using an expression as a way to return values from a function is encouraged.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  It is very strict with variable references
&lt;/h2&gt;

&lt;p&gt;Rust does let you work with references but it protects you from potential failures arising out of mishandling references by complaining a little too much so that you're careful with the code that you write while handling unsafe memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ownership
&lt;/h3&gt;

&lt;p&gt;Only a single variable can hold a value. This means, copying a value from one variable to another is technically not allowed unless... it is cloned.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let my_age = 15;
let your_age = my_age;

println!("your_age: {}", your_age);
println!("my_age: {}", my_age);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The above code is not supposed to work, if you go by the previously mentioned rule, but it does and it's only because the value &lt;code&gt;15&lt;/code&gt; is a scalar value that can be easily implicitly cloned by the Rust compiler without much trouble.&lt;/p&gt;

&lt;p&gt;However, if the value would have been of a compound type (like a &lt;code&gt;String&lt;/code&gt; or more), the result of the assignment to &lt;code&gt;your_age&lt;/code&gt; would have been different. The first variable would have lost access to the value with the value's ownership being transferred to the second variable.&lt;/p&gt;

&lt;p&gt;Any code trying to access the value of the first variable at a later point in the program would then fail. Consider the example below:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let my_name = String::from("Shepard");
let your_name = my_name;

println!("your_name: {}", your_name);
println!("my_name: {}", my_name);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Because the first variable does not hold a value that is easily 'cloneable', the moment the re-assignment is performed, the value gets 'moved' to the second variable and hence accessing the first variable is not allowed anymore. It can be said that the first variable loses ownership of the value it used to possess before the re-assignment.&lt;/p&gt;

&lt;p&gt;There could be a very easy way to make the above code work though: by explicitly performing a 'clone' operation.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    let your_name = my_name.clone();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Apart from moving ownership between variables, there are many other ways a variable can lose ownership to a value, one of which is when a variable is passed into a function. It is said that the variable goes out of scope. Once that happens, the value can only be accessed from the variable if either of the below is true:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;When the value is returned from the function being called:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Consider a function &lt;code&gt;introduce&lt;/code&gt; that only prints a provided name:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fn introduce(name: String) {
    println!("I'm {}", name);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When a name is passed to the function,&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let my_name = String::from("Shepard");

introduce(my_name);

println!("Like I said earlier, I'm {}", my_name);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above code fails as the variable &lt;code&gt;my_name&lt;/code&gt; loses ownership to the value as soon as the function &lt;code&gt;introduce&lt;/code&gt; is called.&lt;/p&gt;

&lt;p&gt;One cheap (but probably not the right) way to fix this is to return the value to the outside scope from within the function. The &lt;code&gt;introduce&lt;/code&gt; function would then become:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fn introduce(name: String) -&amp;gt; String {
    println!("I'm {}", name);
    name
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and then we would also capture the returned value in a variable (probably with the same name?)&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let my_name = String::from("Shepard");

let my_name = introduce(my_name);

println!("Like I said earlier, I'm {}", my_name);
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A reference of the variable was passed in the first place:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is called 'borrowing' a value, instead of 'moving'. Consider an &lt;code&gt;introduce&lt;/code&gt; function that accepts a reference instead of a value:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fn introduce(name: &amp;amp;String) {
    println!("I'm {}", name);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then we pass in a reference to the name instead of the value itself:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let my_name = String::from("Shepard");

introduce(&amp;amp;my_name);

println!("Like I said earlier, I'm {}", my_name);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But then there are other limitations with passing around references and this needs to be done carefully as well.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Only one mutable reference to a variable is allowed in a scope
&lt;/h3&gt;

&lt;p&gt;A reference like the one we saw in the previous example cannot be used to change the value of the variable. For such cases, a 'mutable' reference needs to be passed around.&lt;/p&gt;

&lt;p&gt;However, Rust imposes restrictions on that as well: you can only have one mutable reference to a variable per scope, just for safety.&lt;/p&gt;

&lt;p&gt;The below would fail to compile:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let my_name = String::from("Shepard");

let ref1 = &amp;amp;mut my_name;
let ref2 = &amp;amp;mut my_name;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;And obviously, that's because Rust doesn't want you to get into trouble when the changes to the value pointed by the two references are performed from two different parties, thus potentially resulting in unexpected results.&lt;/p&gt;

&lt;h3&gt;
  
  
  You cannot pass around a reference to something may not exist
&lt;/h3&gt;

&lt;p&gt;Consider the below function that returns a reference to a variable that will soon be no longer existing&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function get_my_name() =&amp;gt; &amp;amp;String {
    let my_name = String::from("Shepard");
    &amp;amp;my_name
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The variable &lt;code&gt;my_name&lt;/code&gt; is only valid within the scope of the function and passing around the reference of a variable that will not exist is not a good idea.&lt;/p&gt;

&lt;h3&gt;
  
  
  Only safe references are allowed
&lt;/h3&gt;

&lt;p&gt;When Rust comes across a situation where an invalid memory is being accessed, the program fails instead of allowing the memory access and cause further damage.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let numbers = [1, 2, 3, 4, 5];
let index = 10;

let number = numbers[index];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The above code fails at the point when an 'out-of-bounds' index is being used to fetch a value from the array.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some other notable great features of the Rust eco-system
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The language itself lets you code faster&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Though the language might feel very difficult to initially begin with, there are features like implicit typing of variables that make it easier to work with those limitations. There are many similarities with older languages like 'C' but newer constructs like &lt;code&gt;tuple&lt;/code&gt;s and &lt;code&gt;vector&lt;/code&gt;s make it very useable in today's programming scene.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Its tooling is awesome&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Having spent over 8 years with &lt;a href="http://nodejs.org" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; and then stepping into a systems programming language like Rust, I didn't expect an ecosystem this modern. I found many things that I could relate to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://npmjs.com" rel="noopener noreferrer"&gt;Npm&lt;/a&gt; -&amp;gt; &lt;a href="https://github.com/rust-lang/cargo" rel="noopener noreferrer"&gt;Cargo&lt;/a&gt; (Build tool, package manager)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.npmjs.com/files/package.json" rel="noopener noreferrer"&gt;package.json&lt;/a&gt; -&amp;gt; &lt;a href="https://doc.rust-lang.org/cargo/reference/manifest.html" rel="noopener noreferrer"&gt;Cargo.toml&lt;/a&gt; (Manifest file)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://npmjs.com" rel="noopener noreferrer"&gt;npmjs.com&lt;/a&gt; -&amp;gt; &lt;a href="https://crates.io" rel="noopener noreferrer"&gt;creates.io&lt;/a&gt; (Package registry to access thousands of useful crates)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Packages would now be a crate, be it a binary or a library.&lt;/p&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;rustfmt&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rust-lang/rustfmt" rel="noopener noreferrer"&gt;&lt;code&gt;rustfmt&lt;/code&gt;&lt;/a&gt; is a tool for formatting Rust code according to a universally agreed-upon coding style. This would help developers focus on the logic of our programs rather than argue about how the code should be looking like. I've faced a lot of that in the JavaScript world where there are more standards than one could think of.&lt;/p&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Much more to learn about Rust...
&lt;/h2&gt;

&lt;p&gt;It's been a few months since I've started looking into Rust but given my learning schedule which has tremendously slowed down since we moved into this year, I could not dive deeper into the language yet.&lt;/p&gt;

&lt;p&gt;I did create &lt;a href="https://github.com/myTerminal/project-euler-solutions/tree/master/solutions/rust" rel="noopener noreferrer"&gt;a playground for myself&lt;/a&gt; though, where I plan to practice the language and am hoping to create some useful tool with Rust soon.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>rust</category>
    </item>
    <item>
      <title>A few clean-ups to relieve stress</title>
      <dc:creator>Mohammed Ismail Ansari</dc:creator>
      <pubDate>Wed, 19 Feb 2020 00:14:24 +0000</pubDate>
      <link>https://dev.to/myterminal/a-few-clean-ups-to-relieve-stress-9jm</link>
      <guid>https://dev.to/myterminal/a-few-clean-ups-to-relieve-stress-9jm</guid>
      <description>&lt;p&gt;&lt;em&gt;[This story was originally posted on &lt;a href="http://ismail.teamfluxion.com/diary/20200218/A_few_cleanups_to_relieve_stress" rel="noopener noreferrer"&gt;my personal blog&lt;/a&gt;]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've always had this itch of organizing the stuff that I come across every day, sometimes to an extent that it's over-organized for me to access later. It's partly because my mind keeps on shifting its perspective of how I see (and want to see) things around me and otherwise it's something that comes straight out of me being an over-thinker for things that do not need that much of thinking. I might arrange objects in a particular way, only to completely remodel the entire space, arguably making my previous attempt to make things 'right' look like a complete waste of my productive time.&lt;/p&gt;

&lt;p&gt;The following are a few items that I enjoy cleaning up and believe to be reducing my stress.&lt;/p&gt;

&lt;h2&gt;
  
  
  To-Do list
&lt;/h2&gt;

&lt;p&gt;My To-Do list keeps growing like crazy. It does help me track ideas and the things that I might need to be doing, but as it grows it tends to scare me with what's upcoming (especially the looking at the count of items in the list), often leaving my mind in a state where I find it very difficult to focus on the tasks that I currently have at hand.&lt;/p&gt;

&lt;p&gt;To me, cleaning a To-Do list could either mean scheduling items that are still in the &lt;em&gt;unscheduled&lt;/em&gt; state, better organize them by re-assign tags that make more sense to me (at that particular instant), or even deleting the items that I might have added a while back and do not seem to be worth doing or even making any sense at the time of the clean-up. And yes, it also helps me look past the mess I have in front of me.&lt;/p&gt;

&lt;p&gt;I can discover tasks that were planned way back but got lost among other 'less important' ones. Finally, it also helps me discover the 'filler' tasks that I could potentially pick up when there's relatively nothing else to do, which I know is rarely the case, but who knows?&lt;/p&gt;

&lt;h2&gt;
  
  
  Digital notes or lists
&lt;/h2&gt;

&lt;p&gt;My digital list collection is another place to look for those buried lists and plans that never got converted into tasks and eventually scheduled and picked up to be worked upon. On the other hand, there's so much that does not need to be worried about or carried around anymore.&lt;/p&gt;

&lt;p&gt;It mostly does not cost anything to keep this kind of useless data around, especially if you're on a free plan on the platform or service (&lt;a href="https://dynalist.io" rel="noopener noreferrer"&gt;Dynalist&lt;/a&gt; in my case) that you're using to maintain these lists, but when taken out, it does help me to find what I might be looking for faster and easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Web-browser bookmarks
&lt;/h2&gt;

&lt;p&gt;No matter how much time I spend on my collection of web bookmarks in &lt;a href="https://www.google.com/chrome" rel="noopener noreferrer"&gt;Google Chrome&lt;/a&gt;, it doesn't take long for the tree to grow out of control and very overwhelming to look at.&lt;/p&gt;

&lt;p&gt;Bookmarks can get accumulated quickly, especially with my pattern of web-browsing. It goes like: anything interesting that I come across and/or I feel needs more time and dedicated attention gets thrown into a subtree that I usually revisit regularly. As the second step, these deferred bookmarks get further categorized and sorted according to priority and subject. When the time finally comes to visit the web-resource it points to, it either gets deleted after sharing it with people who might find it interesting or stashed into the rest of the well-organized tree for almost forever.&lt;/p&gt;

&lt;p&gt;My tree has been growing since I first started using Google Chrome, which is almost a decade now. Funny enough, I used to maintain an excel worksheet of internet URLs that I wanted to store as a future reference instead of saving them as 'favorites' on my &lt;a href="https://www.microsoft.com/en-us/download/internet-explorer.aspx" rel="noopener noreferrer"&gt;Internet Explorer&lt;/a&gt; as they would otherwise be lost. As the bookmarks on my Google Chrome are associated with my account and the task of maintaining the collection for me is now taken care of by Google, it is the right place to maintain that kind of data. I recently conducted a moderately deep clean-up in my bookmarks collection and what I got from the result of the time-consuming (and arguably boring) activity is what I believe to be one of the cleanest bookmark collections I've seen to date, not that I have a habit of peeking into people's bookmarks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Projects kitchen
&lt;/h2&gt;

&lt;p&gt;On all my computers, I have a &lt;a href="https://dev.to/isaacandsuch/github-graveyards-ill-show-you-mine-49lh"&gt;projects graveyard&lt;/a&gt; where I perform coding experiments and most of the code residing there never makes its way out. Although some developers &lt;a href="https://dev.to/peter/graveyard-groundskeepers-2886"&gt;share their collection&lt;/a&gt; on GitHub or other similar places, I keep mine private and call it 'kitchen' on every single workstation of mine. Most of the ideas developed and polished there get life in the form of some other public project but the mess in the kitchen tends to keep growing quickly.&lt;/p&gt;

&lt;p&gt;Visiting these directories every once in a while and getting rid of waste helps me come across any unfinished experiments or at least helps me free some space on the tiny &lt;a href="https://en.wikipedia.org/wiki/Solid-state_drive" rel="noopener noreferrer"&gt;SSD&lt;/a&gt; on my &lt;a href="https://www.apple.com/macbook-pro" rel="noopener noreferrer"&gt;MacBook Pro&lt;/a&gt;. Regardless, cleaning the kitchen feels great.&lt;/p&gt;

&lt;h2&gt;
  
  
  Digital data on hard-drive or cloud
&lt;/h2&gt;

&lt;p&gt;My digital data on the cloud tends to get out of hand as well. During my early years of using computers to store data, this kind of data used to be stored in smaller hard-drives and USB flash drives that were far easier to run out of storage capacity on. With my not-so-recent move to virtually infinite cloud-storage, space is not an issue anymore, and I expect it to be that way for at least another decade before I start running out of space again. However, re-arranging files and deleting unrequired data gives me a sense of satisfaction greater than what I achieve after refactoring a piece of code that I wrote a decade back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apps, extensions, etc. from my setup
&lt;/h2&gt;

&lt;p&gt;It could be unused software on my computers, apps on my phone(s) that I might have never used and forgotten about, plugins on my text-editor or even extensions on my web-browser, the list can go on. Apart from the most obvious advantage of speeding up my work environment by removing the redundant bloat that not only do I not need anymore but also do not remember the reason to exist, it makes space for new stuff to come in: think new apps, extensions or productivity tools, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  More...
&lt;/h2&gt;

&lt;p&gt;There's much more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email subscriptions&lt;/strong&gt; so that I do not need to delete multiple emails from the same sender every day as if it was a daily ritual&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Games library&lt;/strong&gt; so that I don't feel bad for myself every time I come across it on discovering the huge list of games that I own but do not have time to play anymore
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser autofill info&lt;/strong&gt; so that I have a shorter list of credentials, addresses, payment methods, etc. to choose from while filling a web form&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Physical desk&lt;/strong&gt; so that I have to move lesser stuff around for being able to access other stuff&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My car&lt;/strong&gt; not because it helps me in any way, but I just like doing it down to the smallest detail possible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you might have guessed, the list does not end there.&lt;/p&gt;

&lt;h2&gt;
  
  
  And beyond...
&lt;/h2&gt;

&lt;p&gt;More than the amount of stress relief I tag these activities with, I also believe that they grant me some sort of a short-term productivity boost. I feel a little more focused and motivated towards doing what I'm currently doing, and that too with a fresh perspective until there's need for another round of clean-up.&lt;/p&gt;

</description>
      <category>watercooler</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I manage to meet most of my deadlines and still keep myself 'mostly' motivated</title>
      <dc:creator>Mohammed Ismail Ansari</dc:creator>
      <pubDate>Fri, 27 Dec 2019 04:59:07 +0000</pubDate>
      <link>https://dev.to/myterminal/how-i-manage-to-meet-most-of-my-deadlines-and-still-keep-myself-mostly-motivated-4dnm</link>
      <guid>https://dev.to/myterminal/how-i-manage-to-meet-most-of-my-deadlines-and-still-keep-myself-mostly-motivated-4dnm</guid>
      <description>&lt;p&gt;&lt;em&gt;[This story was originally posted on &lt;a href="http://ismail.teamfluxion.com/diary/20191207/My_first_decade_as_a_professional_software_developer" rel="noopener noreferrer"&gt;my personal blog&lt;/a&gt;]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this age of technology overload, to say that it's difficult to keep up with life would be quite an understatement. In fact, it's very easy to miss things going around you. You can imagine those things to be the ones that matter to you, and that is different for different people. They could be things like technology trends, utility payment due-dates, doctor appointments, and even family events, you name it.&lt;/p&gt;

&lt;p&gt;For a couple of years now, I've been driving my daily life with the help of a group of things that I collectively use as a system. Following these self-imposed guidelines has been helping me meet most of my short-term goals with relative ease, punctuality, and an ample peace of mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  My system in place
&lt;/h2&gt;

&lt;p&gt;There are always going to be failures and my system is not flawless either, it just helps minimize slippage of my tasks and responsibilities. Talking about failures, I fail too often with varying degrees of blunders. Sometimes that does shatter my confidence but otherwise, it helps me adapt in a positive manner.&lt;/p&gt;

&lt;p&gt;My system comprises of many habits, tools, and services that are a part of my daily life. Though it has been working for me for a few years now, it keeps evolving as I learn more about my responsibilities and my own self in general. I'll describe a few major elements of my system in this post.&lt;/p&gt;

&lt;h3&gt;
  
  
  My To-Do list
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Getting_Things_Done" rel="noopener noreferrer"&gt;GTD (Getting Things Done)&lt;/a&gt; is the biggest of all the elements of my system. My To-Do list defines and drives the most part of my life with inputs from my own self. Some inputs are automated and recur according to a pattern and/or a suitable frequency.&lt;/p&gt;

&lt;p&gt;I've written multiple posts in the past mentioning my To-Do list. I've &lt;a href="http://ismail.teamfluxion.com/diary/20190330/How_I_keep_myself_digitally_organized" rel="noopener noreferrer"&gt;mentioned recently&lt;/a&gt; how I hopped through quite a lot of tools to finally settle down on &lt;a href="https://rememberthemilk.com" rel="noopener noreferrer"&gt;Remember The Milk&lt;/a&gt; and I've also earlier described &lt;a href="http://ismail.teamfluxion.com/diary/20161204/Moving_away_from_TickTick" rel="noopener noreferrer"&gt;my quest&lt;/a&gt; in a little more detail where I explained my reason to switch to Remember The Milk. I won't spend time to repeat the advantages of maintaining a task list once again as that's something you can easily find elsewhere on the web as well.&lt;/p&gt;

&lt;p&gt;In the past few years, I've evaluated countless platforms. It's natural that a system that may work great for one may not at all be suitable for the other. For me, most options fell in one or more of the below categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Too simplistic&lt;/strong&gt;: I need to be able to organize my task list using projects, tags, etc. and browse through my tasks in more than one way. A tool that merely allows recording action items as a flat list definitely doesn't help me.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Too expensive&lt;/strong&gt;: Though a free service is always the best, I don't mind paying either a small monthly fee or a medium-to-high one-time fee. The number of features available in the free-tier also matters to me.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform limited&lt;/strong&gt;: Given that I work with at least three platforms daily, I need my tasks to be accessible virtually everywhere. A tool that's available for only a few platforms is unusable for me.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unintuitive&lt;/strong&gt;: I expect data-entry and retrieval to be as convenient as possible. Spending more &lt;a href="https://en.wikipedia.org/wiki/Glossary_of_video_game_terms#action_point" rel="noopener noreferrer"&gt;action-points&lt;/a&gt; to record a task leaves lesser to actually spend doing it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://todoist.com" rel="noopener noreferrer"&gt;Todoist&lt;/a&gt; seemed to be very well designed and not only seem to provide the features that I'd wish to have in a task management tool, but it also introduced me to a few more that I never thought could be useful. Out of so many interesting features Todoist provides, below are a few that 'almost' made me switch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nested projects&lt;/strong&gt; vs flat lists&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combining multiple filters&lt;/strong&gt; and viewing multiple lists in a single view&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subtasks are actual tasks&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better integration&lt;/strong&gt; with the outside world&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Affordable price&lt;/strong&gt;, sort of&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, even with the above outstanding features, there was still one hurdle: most of the basic features need a subscription to &lt;a href="https://todoist.com/premium" rel="noopener noreferrer"&gt;Todoist premium&lt;/a&gt;. This matters to me even more given the fact that even though I've been wishing to upgrade my Remember The Milk account to &lt;a href="https://www.rememberthemilk.com/upgrade" rel="noopener noreferrer"&gt;'Pro'&lt;/a&gt; since a couple of years, I'm still on the free plan and am almost satisfied with the feature set that they provide on the free plan there.&lt;/p&gt;

&lt;p&gt;Having wasted my 30-day trial a few years back, I deleted my account on Todoist and restarted my trial to evaluate it once more with a far better understanding of Todoist and my workflow as well. However, during the process of manual data-migration (yes I prefer to do it manually as I cannot afford to miss details from my sensitive tasks), a few things didn't feel right. Data entry felt too cumbersome as it needed quite many more keystrokes as compared to that needed to create a task in Remember The Milk. I also could not figure out the condition for when Todoist sets alarms (notifications) on my tasks and when it doesn't. After about an hour of mental struggle, I reverted to Remember The Milk once again, which was naturally the safest way out of the situation and it also saved me several hours of migration.&lt;/p&gt;

&lt;p&gt;With so many custom tools in my workflow, I've thought of creating my own custom solution more than once. I even have a private skeleton repo on &lt;a href="https://gitlab.com" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt; with minimal setup and have it sitting as a task in my To-Do list. However, I've learned that as my mind is getting older, I'm finding a little too difficult to focus on a single project and take it to closure. Yes, it will give me all the features I'd ever like and that too without a monthly recurring expense but to create something as featureful as Remember The Milk and write all the code on my own while being a parent feels just way too much of work now. Furthermore, it will be like spending time on a project that will most probably not be released for the public and will die a slow death just like most of my other projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inbox Zero
&lt;/h3&gt;

&lt;p&gt;I've been following a practice known as &lt;a href="https://blog.hubspot.com/service/inbox-zero" rel="noopener noreferrer"&gt;Inbox Zero&lt;/a&gt; for a few years now and I should say it helps more than I thought. A few advantages include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;I don't have to look at hundreds of unread emails&lt;/strong&gt; with a mix of information that matters to me and that which doesn't. There could be emails waiting for an action from my side, emails that need immediate attention about things like a credit card fraud transaction, emails about limited-time deals and discounts about things I do not plan (or want) to buy and other promotional emails that manage to get past the spam filters and sneak their way into my inbox.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My email inbox also acts as a secondary To-Do list&lt;/strong&gt; that contains my on-going interactions with people. This helps me stay on top of my communication with my friends, utility and service providers, and even my potential employers.&lt;/li&gt;
&lt;li&gt;When things are well tagged and sorted into sub-folders, &lt;strong&gt;finding an email doesn't feel like walking through a junk-yard&lt;/strong&gt; looking for a specific item buried somewhere under a pile of well... junk.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I started to implement this in my mailboxes at work which was very helpful to track my professional deliverables but then after &lt;a href="http://ismail.teamfluxion.com/diary/20190607/How_I_unified_my_email_accounts_in_2019" rel="noopener noreferrer"&gt;the unification of my email accounts&lt;/a&gt;, I've been following it for my personal email mailboxes as well. Things are so much simpler now!&lt;/p&gt;

&lt;h3&gt;
  
  
  Lists
&lt;/h3&gt;

&lt;p&gt;It doesn't take long to realize that grocery shopping lists are not the only lists in one's life. Your life is surrounded by many more lists for almost everything that you do daily. I started with a wishlist of video-games that I wanted to play and movies that I wanted to watch but then extended it to track many other things.&lt;/p&gt;

&lt;p&gt;A very small part of the list of things that I have as lists are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;things that I plan to learn&lt;/li&gt;
&lt;li&gt;things that I need on a trip&lt;/li&gt;
&lt;li&gt;wishlist of items that I plan to purchase in the long-term&lt;/li&gt;
&lt;li&gt;things that I can spend time on when there's nothing else to do&lt;/li&gt;
&lt;li&gt;list of my online accounts all over the web (which is the most difficult one to maintain)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have also recently started creating lists for life sub-routines that need to be executed on a particular event like getting a new credit card or buying a new daily-driver phone or car, and many more.&lt;/p&gt;

&lt;p&gt;To store these lists and to make sure they are accessible almost everywhere I go, I have moved between a few services like &lt;a href="https://keep.google.com" rel="noopener noreferrer"&gt;Google Keep&lt;/a&gt;, &lt;a href="https://evernote.com" rel="noopener noreferrer"&gt;Evernote&lt;/a&gt;, &lt;a href="https://paper.dropbox.com" rel="noopener noreferrer"&gt;Dropbox Paper&lt;/a&gt; but finally settled for &lt;a href="https://dynalist.io" rel="noopener noreferrer"&gt;Dyanlist&lt;/a&gt; for a few months. They offer a free plan that works for my use-case. These lists now act as an extension for my To-Do items from Remember The Milk because not everything can be noted down as subtasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Calendar
&lt;/h3&gt;

&lt;p&gt;I've been using Google Calendar for tracking events like my driver's license renewal, vehicle oil changes, etc. Though I have moved most of this as well to my To-Do list, I recently started using my calendar for a new experimental use-case.&lt;/p&gt;

&lt;p&gt;I have created themes for every single day. These are 'all-day' events that help me with a 'flavor' for the day suggesting things that I can be spending time doing on that particular day. I figured it's very easy to get drawn away with only working on a software that I'm fascinated about for a few days or learn a particular technology that has totally taken over my mind. There are so many things that &lt;em&gt;need&lt;/em&gt; to be done and there is an equally high number of things you &lt;em&gt;want&lt;/em&gt; to do or learn. Spending continuos time on one particular thing is definitely helpful for focus but that can adversely affect tasks in other areas. These day themes (as I have planned) will hopefully help me focus on one thing at a time and still cover the maximum area of my activities.&lt;/p&gt;

&lt;p&gt;Now I have a dedicated day that's themed to read and learn from internet posts and videos, a day to write posts, a day to spend time learning "that specific technology on my mind", a day to maintain &lt;a href="https://github.com/myTerminal?utf8=%E2%9C%93&amp;amp;tab=repositories&amp;amp;q=&amp;amp;type=source&amp;amp;language=" rel="noopener noreferrer"&gt;my open-source projects&lt;/a&gt;, and a few other days likewise. I can cheat and work on a thing that is outside of a particular day's theme but at least it's not as unplanned as it used to be before.&lt;/p&gt;

&lt;h3&gt;
  
  
  The combination of all of the above and more
&lt;/h3&gt;

&lt;p&gt;The above four items drive most of my activities. On a very high level, my lists and emails tell me what to do and my To-Do list and Calendar tell me when to do them. There are obvious overlaps between them and they all work together to help me drive my day a little more systematically.&lt;/p&gt;

&lt;p&gt;Apart from that, there are other things that I find to be boring and verbose. For that, I have some automation on my computers and phone. I have almost &lt;a href="http://github.com/myTerminal/dotfiles" rel="noopener noreferrer"&gt;all my computer configuration&lt;/a&gt; scripted and documented so that I can regenerate the exact same setup on a particular platform with the least effort anytime, any number of times. This gives me peace of mind and helps me keep moving forward to improve my setup without the fear of not being able to reproduce it again from scratch. In a time of machine failure, my hardware will not be cheap but even more expensive could be the cost to replicate my setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  And then there are 'time-leaks'
&lt;/h2&gt;

&lt;p&gt;Just like we software developers have to worry about &lt;a href="https://en.wikipedia.org/wiki/Memory_leak" rel="noopener noreferrer"&gt;memory-leaks&lt;/a&gt; in our programs, one thing that I fear about in my routine is time-leaks. I classify time-leak into two categories:&lt;/p&gt;

&lt;h3&gt;
  
  
  Digital time-leak
&lt;/h3&gt;

&lt;p&gt;This mostly comprises time spent on mundane tasks like trying new software from sources like &lt;a href="https://play.google.com" rel="noopener noreferrer"&gt;Google PlayStore&lt;/a&gt; and &lt;a href="https://f-droid.org" rel="noopener noreferrer"&gt;F-Droid&lt;/a&gt;, browsing profiles on &lt;a href="https://www.linkedin.com" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, reading non-conclusive posts on social media like &lt;a href="https://twitter.com" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.reddit.com" rel="noopener noreferrer"&gt;Reddit&lt;/a&gt; (and &lt;a href="https://www.facebook.com" rel="noopener noreferrer"&gt;Facebook&lt;/a&gt;), and watching digital media through channels like &lt;a href="https://www.youtube.com" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, &lt;a href="https://imgur.com" rel="noopener noreferrer"&gt;Imgur&lt;/a&gt;, and occasionally, &lt;a href="https://www.instagram.com" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Though most of my online subscriptions are purely for educational purposes, deviating from the intended reason for the visit a platform is extremely easy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real time-leak
&lt;/h3&gt;

&lt;p&gt;There's too much stuff outside the digital world that makes me lose my time. Most of that comprises tasks that I cannot automate, which is mostly all that stuff that I need to do to live a normal life in the 21st century. The other major chunk falls into the category of tasks that I like spending time on, with the most noticeable one being the "hours" I spend cleaning my car. Though that is one of my most favorite things to do outside my computer screen, I tend to get into &lt;a href="https://en.wikipedia.org/wiki/Auto_detailing" rel="noopener noreferrer"&gt;detailing&lt;/a&gt; even when the plan was to just give my mechanical companion a &lt;a href="https://www.walmart.com/ip/PRODUCT-OF-THE-YEAR-2019-Rain-X-Waterless-Car-Wash-Rain-Repellent-32-fl-oz-620100/159580923" rel="noopener noreferrer"&gt;waterless carwash&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  An analogy to a "scripted" routine
&lt;/h2&gt;

&lt;p&gt;In the last few years, I have realized that not having to remember "what needs to be done" and focusing only on "how it can be done, better" is pretty helpful, to say the least. That extra breathing space for the mind can be used for creativity.&lt;/p&gt;

&lt;p&gt;With most of my daily tasks scripted, I (being a gamer) look at my &lt;a href="http://ismail.teamfluxion.com/diary/20190604/How_life_can_be_compared_to_a_Massively_Multiplayer_Online_Role_Playing_Game" rel="noopener noreferrer"&gt;life as a multiplayer campaign of a role-playing video-game&lt;/a&gt;. I don't need to worry about which missions I need to complete and I still get to enjoy completing them, one after another not only progressing through the game but also leveling-up with those &lt;a href="https://en.wikipedia.org/wiki/Experience_point" rel="noopener noreferrer"&gt;experience points&lt;/a&gt; as I do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further from here
&lt;/h2&gt;

&lt;p&gt;I plan to keep making changes to my system, trying to make myself more efficient and for that my tools may need to keep evolving. This may mean that there could be more control added, more guidelines for my own self on how to spend my time.&lt;/p&gt;

&lt;p&gt;At the same time, I feel there should be a balance between the scripted and non-scripted parts of life. With all the productivity that I need in my life, I also want to be able to have a choice of my own. If everything becomes scripted, life might as well turn into a movie I'm playing a role in and every single event would happen only according to the script, every single moment of time.&lt;/p&gt;

</description>
      <category>watercooler</category>
      <category>productivity</category>
    </item>
    <item>
      <title>My first decade as a professional software developer</title>
      <dc:creator>Mohammed Ismail Ansari</dc:creator>
      <pubDate>Fri, 06 Dec 2019 15:27:33 +0000</pubDate>
      <link>https://dev.to/myterminal/my-first-decade-as-a-professional-software-developer-4227</link>
      <guid>https://dev.to/myterminal/my-first-decade-as-a-professional-software-developer-4227</guid>
      <description>&lt;p&gt;&lt;em&gt;[This story was originally posted on &lt;a href="http://ismail.teamfluxion.com/diary/20191207/My_first_decade_as_a_professional_software_developer" rel="noopener noreferrer"&gt;my personal blog&lt;/a&gt;]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Today (at the time of this writing) I completed my first decade of being a professional software developer. Though I usually hate using the term 'journey' for things unrelated to travel, I'll make this one an exception for all the mental displacement I went through during this period.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In this article, I reflect back on how I started as (or ended up being) a software developer, what all I experienced in this professional world till this day and how I saw myself change in almost every aspect of my approach towards programming, computers, and technology in general.&lt;/p&gt;

&lt;h2&gt;
  
  
  My background with computers and software development
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Not so long ago...&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  'First Contact'
&lt;/h3&gt;

&lt;p&gt;My first encounter with a personal computer was in 1995 when I saw it from across a glass window covered in cloth over the monitor screen and an "anti-glare" layer of dark glass over the screen. The owner of the computer was kind enough to let me play a couple of boring games on it for about an hour and that was it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Computers at my school
&lt;/h3&gt;

&lt;p&gt;A few months later, computers were introduced to my class at school. It was my fifth grade and my second experience with a personal computer, only this time officially. 'Computers' was a course in every grade until the ninth grade with syllabus consisting of the same repetitive topics, the first chapter in every grade being "Introduction to Computers" over and over again. While the world outside the campus was already using &lt;a href="https://en.wikipedia.org/wiki/Windows_98" rel="noopener noreferrer"&gt;Microsoft Windows 98&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Microsoft_Office_97" rel="noopener noreferrer"&gt;Microsoft Office&lt;/a&gt;, they "pretended to teach" us outdated software like &lt;a href="https://en.wikipedia.org/wiki/WordStar" rel="noopener noreferrer"&gt;Wordstar&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Logo_(programming_language)" rel="noopener noreferrer"&gt;Logo&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/BASIC" rel="noopener noreferrer"&gt;Basic&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/QBasic" rel="noopener noreferrer"&gt;QBasic&lt;/a&gt;, etc. with no context what-so-ever.&lt;/p&gt;

&lt;p&gt;Our teachers had no idea what they were talking about, all of their speech during the lectures was based out of some hand-written notes and just tried to act smarter than the rest of the faculty for them being next-gen because they knew computers, or at least they believed they did. We did have practical sessions where they divided the class into two parts, each half taking their turn in the computer lab with three kids sharing one computer, taking turns to play &lt;a href="https://en.wikipedia.org/wiki/Pac-Man" rel="noopener noreferrer"&gt;PacMan&lt;/a&gt; or Snake (or Dragon Ball) for the entire one hour, wasting that precious time that could have been utilized to teach us basics like for example what those hundred keys on the keyboard were for. The computer fees were significantly higher by magnitudes compared to the rest of the entire curriculum and all that money just to play arcade games on a monochromatic screen without being taught what a computer was. Oh wait, they did teach us what a computer was, over and over again, in fact, that being the first statement in the first chapter for every grade and the answer was, "A computer is an electronic machine". That's all that you need to know, don't you?&lt;/p&gt;

&lt;p&gt;I remember memorizing QBasic programs for practical exams because neither did they tell us, nor did I ever learn how the &lt;code&gt;let&lt;/code&gt; statement was different from an &lt;code&gt;input&lt;/code&gt; statement. Yes, they did teach us the difference between a variable and a constant in the first chapter, in every single grade till the ninth grade, but never explained to us or showed a real example for us to realize the role of a variable in a computer program.&lt;/p&gt;

&lt;h3&gt;
  
  
  The first desktop computer in my family
&lt;/h3&gt;

&lt;p&gt;The very first computer to get introduced in my (entire) family tree (or even the neighboring trees if I think about it now) was a pre-owned desktop computer at the end of the year 1999. It had brand new white-colored peripherals including a &lt;a href="https://www.cnet.com/products/samtron-56e-crt-monitor-15-series" rel="noopener noreferrer"&gt;Samtron 15" color CRT monitor&lt;/a&gt; and a really heavy three-button ball-mouse. The processor was an &lt;a href="https://en.wikipedia.org/wiki/Intel_80486" rel="noopener noreferrer"&gt;80486&lt;/a&gt; running a few Megs of &lt;a href="https://en.wikipedia.org/wiki/Random-access_memory" rel="noopener noreferrer"&gt;RAM&lt;/a&gt; with a dual-boot of &lt;a href="https://en.wikipedia.org/wiki/Windows_95" rel="noopener noreferrer"&gt;Windows 95&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Windows_3.1x" rel="noopener noreferrer"&gt;Windows 3.1&lt;/a&gt;, which I had no idea about and learned what it all actually means after about a year of playing DOS-based games through memorized commands typed on an &lt;a href="https://en.wikipedia.org/wiki/MS-DOS" rel="noopener noreferrer"&gt;MS-DOS&lt;/a&gt; Command Prompt Window. Along with the well-known 'C' drive, the computer also had 'A' and 'B' drives for &lt;a href="https://en.wikipedia.org/wiki/Floppy_disk#%E2%80%8B3_1%E2%81%842-inch_disk" rel="noopener noreferrer"&gt;3.5"&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Floppy_disk#8-inch_and_%E2%80%8B5_1%E2%81%844-inch_disks" rel="noopener noreferrer"&gt;5.25"&lt;/a&gt; floppy drives so I never really had the question that a kid would have today: why the drive letters start from 'C'.&lt;/p&gt;

&lt;p&gt;It was already my two years of 'learning' computers at school by then, but I still wasn't that comfortable with computers, given the kind of curriculum we had at school.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I thought of a computer before 1999
&lt;/h3&gt;

&lt;p&gt;For me, computers almost had only two primary uses: creating those boring monochromatic documents that I saw people at my dad's workplace create, and playing fun video-games that a few computer technicians made us believe spoilt computers.&lt;/p&gt;

&lt;p&gt;I had a Little Master TV video-game system at home that I had limited exposure to, and that was the only thing that I imagined our new computer in the house will replace. During a few conversations during recess at school, some kids talked about a few video-games that I had never heard of. I later learned that they were mostly &lt;a href="https://en.wikipedia.org/wiki/Prince_of_Persia_(1989_video_game)" rel="noopener noreferrer"&gt;Prince of Persia&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Dangerous_Dave" rel="noopener noreferrer"&gt;Dangerous Dave&lt;/a&gt; but before I did, all that I could relate those to was &lt;a href="https://en.wikipedia.org/wiki/Super_Mario" rel="noopener noreferrer"&gt;Super Mario&lt;/a&gt;, which wasn't exactly my favorite game.&lt;/p&gt;

&lt;p&gt;On the day the computer-guy assembled our first computer at home, I was surprised to learn that the same &lt;a href="https://en.wikipedia.org/wiki/Compact_disc" rel="noopener noreferrer"&gt;audio disc&lt;/a&gt; that we played on our Sony music system could also be played on a computer. There were a lot of unknowns though, as the need for a music player software like &lt;a href="https://en.wikipedia.org/wiki/Winamp" rel="noopener noreferrer"&gt;Winamp&lt;/a&gt; or &lt;a href="https://en.wikipedia.org/wiki/Windows_Media_Player" rel="noopener noreferrer"&gt;Windows Media Player&lt;/a&gt;, which were almost the only two options that I knew of at that time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Computer books and magazines
&lt;/h3&gt;

&lt;p&gt;I had a near-regular supply of outdated &lt;a href="https://www.dqweek.com/computers-home-largest-read-computer-magazine-in-india-irs-survey" rel="noopener noreferrer"&gt;Computers@Home&lt;/a&gt; magazines at home via a family friend between 1999 and 2001. It formed my second most read written material after my mathematics textbooks from school.&lt;/p&gt;

&lt;p&gt;It was quite similar to &lt;a href="https://en.wikipedia.org/wiki/Digit_(magazine)" rel="noopener noreferrer"&gt;Digit&lt;/a&gt; and &lt;a href="https://www.pcquest.com" rel="noopener noreferrer"&gt;PCQuest&lt;/a&gt;, which were two of the very few computer magazines available in India back then. Getting my hands on a new magazine issue every month was exciting and something that I looked forward to. I read all the answers to the questions from readers they featured every month. Yes, I don't remember people talking about online forums back then. People literally mailed them questions and waited for an answer to be printed in the next magazine issue. Every issue came with a compact disc containing goodies that ranged from essential software like &lt;a href="https://en.wikipedia.org/wiki/WinZip" rel="noopener noreferrer"&gt;WinZip&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/WinRAR" rel="noopener noreferrer"&gt;WinRar&lt;/a&gt; to Windows Media Player and Winamp themes to video-game demos. Not having an internet connection at home, the disc was our only source to update Winamp to the latest version.&lt;/p&gt;

&lt;p&gt;We also took a subscription for a year so that we received the latest magazines along with the latest software versions without that one-month delay and this time we didn't have to return magazine (and the disc) after reading. I still have them stashed at home back in India just for memories.&lt;/p&gt;

&lt;h3&gt;
  
  
  Computers, Indian kids and Indian parents
&lt;/h3&gt;

&lt;p&gt;I come from a (lower) middle-class Indian family where computers were (and to an extent still are) considered hazardous to kids as they are believed to be a distraction from studies. It's almost as if (and it may sound hilarious) access to a computer at home could potentially ruin the 'career' of a child.&lt;/p&gt;

&lt;p&gt;As soon as I realized the potential of computers, my interaction was not limited to just playing video-games anymore. In fact, I used the desktop at home to learn things, contrary to what my elders must be imagining that I was losing a few marks in my exams with every minute spent with the machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Discovery of my resonance with computer programming
&lt;/h3&gt;

&lt;p&gt;There was no doubt anymore that computers were helping me so much. I was learning things at a rate I never did before. It was partly because I was not the regular kid who would go out and play with my friends after school and learn a few things here and there, but I was one who didn't know what to do with my time once I'm home apart from drawing weird little shapes on paper with a worn-out pencil and counting them in different order every time.&lt;/p&gt;

&lt;p&gt;I improved my hand-writing by closely observing computer fonts, learned English as a spoken language from dialogues in video-game demos from those monthly compact-discs (we almost never bought full games and that wasn't a time where there used to be free games). Neither did I have an idea that I'd have a career with computers, nor did I know of a way to convince my parents that computers aren't hurting my academics but are helping me and hence my interaction with computers remained limited.&lt;/p&gt;

&lt;h3&gt;
  
  
  Being a computer/gadget geek at school
&lt;/h3&gt;

&lt;p&gt;With my interest in all things computers, I always had an edge among my friends in school. In ninth grade, I took the initiative to understand most part of what those QBasic programs meant. I finally appeared for my computer practical exams without re-memorizing the same programs that were taught in previous grades and managed to clear the tests writing all programs on my own. That's what I call progress!&lt;/p&gt;

&lt;h3&gt;
  
  
  My non-CS education
&lt;/h3&gt;

&lt;p&gt;I took up engineering after my high-school which was fairly rare in India in the early 2000s, where most of us (especially kids from my community) were to choose between either science, commerce or arts. It was almost the start of a trend for Computer engineering over there right when I was in the decision phase and I definitely decided not to pick that option mostly because it was too mainstream. There were a few other majors that I could've gone with including Automobile engineering (for my love for cars) for which there were no colleges in my city and Mechanical engineering (out of my interest in physics) for which a few people scared me about how difficult it would be for me given how physically weak I was in school. Almost no one from my community had ever traveled away from home for education so how could I?&lt;/p&gt;

&lt;p&gt;I started with my course of Diploma in Industrial Electronics engineering which was fairly easily available in colleges nearby. I joined as a computer nerd with plenty of interest in learning about computers but with almost no understanding of computer programming. With the limited exposure that I got with computer programming subjects in my college, I had no resources to reach out to in order to learn more. I was probably the only one in my entire classroom who enjoyed our first programming subject: "Programming with C" while the rest of us were really scared of it. Their fear must be partly due to the way it was presented to us. I consider myself lucky to get past it and still end up liking it. There were instances when I was the one to reach out to for solutions to errors in programs during practical sessions, sometimes even by the educator.&lt;/p&gt;

&lt;p&gt;In 2009, I graduated as an Electronics Engineer looking for a career in computers. It was exactly the other way around for most of my friends and classmates where they were being pulled towards this profession out of limited opportunities in Electronics or anything else in general but they were still scared of programming and had limited to no interest in working with computers.&lt;/p&gt;

&lt;h2&gt;
  
  
  My first job as a software developer
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;And the decade finally starts...&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On December 7th, 2009, I started working with &lt;a href="https://en.wikipedia.org/wiki/Infosys" rel="noopener noreferrer"&gt;Infosys Limited&lt;/a&gt; in &lt;a href="https://en.wikipedia.org/wiki/India" rel="noopener noreferrer"&gt;India&lt;/a&gt;, the second-largest software exporter in the country at that time.&lt;/p&gt;

&lt;h3&gt;
  
  
  My entry into the 'corporate' world
&lt;/h3&gt;

&lt;p&gt;As it is mostly the case for engineering graduates in India, my first job was through a campus placement drive where I was offered a job more than a year before I completed my degree in Electronics engineering. Out of about 480 of us appearing for the recruitment drive that day, I made it to the final 11 to get a job offer. I later learned that I barely passed the tests before the final HR interview, but somehow managed to convince the interviewer that I was worth hiring for even an entry-level role as a software developer, even with terrible communication skills and close to zero general knowledge.&lt;/p&gt;

&lt;p&gt;The job started with a six-month training on a specific random technology stack that they thought would work for my group. The entire batch of hundreds of candidates from all over the country was divided into groups and put into technical training for a very specific technology, which followed after a mandatory three days of "introduction to computers", once again! The ones among us with a computer science background were exempted from the 'basics' and were assigned projects way quicker than us. Needless to say, the training was by far my best days at the company where I got to learn quite a lot about software development at the pace that suits me, sort of what I always dreamed of during my engineering, which was spending a little more time with variables and methods than with filters and amplifiers.&lt;/p&gt;

&lt;h3&gt;
  
  
  How things were different than what I imagined them to be
&lt;/h3&gt;

&lt;p&gt;The training ended in about six months and we were again randomly assigned to projects according to some fictitious business requirements. The assignment made no sense at all, where a colleague of mine who went through rigorous training on &lt;a href="https://en.wikipedia.org/wiki/Java_(programming_language)" rel="noopener noreferrer"&gt;Java&lt;/a&gt; for around six months was now assigned a project based on &lt;a href="https://en.wikipedia.org/wiki/.NET_Framework" rel="noopener noreferrer"&gt;.Net&lt;/a&gt;. On the other hand, after nailing my .Net stack training, I was assigned a project based on some alien technology where programming was not even remotely involved. It was &lt;a href="https://en.wikipedia.org/wiki/Siebel_Systems" rel="noopener noreferrer"&gt;Siebel CRM&lt;/a&gt;, completely out of a random.&lt;/p&gt;

&lt;p&gt;It wasn't that I was afraid to learn something different, but looking at a few people who were working on the technology (and in the team) for a few years, it was not that difficult to figure out that it was not the kind of work (or place) I'd want to spend time at. Many people in the team had lost the ability to think like a programmer or to an extent, even write a basic computer program!&lt;/p&gt;

&lt;h3&gt;
  
  
  Me being trapped in a toxic work environment
&lt;/h3&gt;

&lt;p&gt;I worked on a couple of projects at my first job. The first one gave me a few very haunting months of my professional career. Nothing 'taught' to me during the training was even remotely helpful in my first project assignment, be it technical skills or professional skills. Work-life balance was worse than terrible and most of my team-mates including my manager made me feel that I don't belong there in the first place and looked down at me.&lt;/p&gt;

&lt;p&gt;I couldn't believe that someone like me, who aced in almost every effort related to programming during my school and even the technical training right before this job was now facing issues to deal with work pressure on the kind of job that I was supposed to be comfortable at. I spent most of my time learning .Net, having fun writing my own programs and sort of preparing for my next job during late hours after work until around 01:00 AM every day.&lt;/p&gt;

&lt;h3&gt;
  
  
  Leaving my first job
&lt;/h3&gt;

&lt;p&gt;I couldn't continue working like that where work was punishment every single day. Out of the disrespect and demotivation at my first job along with irrelevance to technology, I switched my job. After wasting around two years of my career working on (or pretending to work on) things that didn't make any sense to me, I took a job as a .Net developer with zero professional (but plenty of practical) experience on the stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further into my professional career
&lt;/h2&gt;

&lt;p&gt;Life gave me another chance to work with an entirely different crowd, and this time it was a team of exceptionally talented people at my second job. Except for the initial few weeks of imposter and insecurity, life was now fun again. I got to work with people who not only helped me at work but also encouraged me throughout my term at that job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Another unplanned shift in my career
&lt;/h3&gt;

&lt;p&gt;My second job brought an unplanned shift in my career. Just like my first job, this one was not exactly around what I wanted to do: the job title was ".Net development" but now I was a &lt;a href="https://en.wikipedia.org/wiki/Front-end_web_development" rel="noopener noreferrer"&gt;front-end&lt;/a&gt; developer. Because I started with &lt;a href="https://en.wikipedia.org/wiki/Cascading_Style_Sheets" rel="noopener noreferrer"&gt;CSS&lt;/a&gt;, I was unofficially referred to as a UI developer for quite a few months, later stepping into the rest of the front-end. I quickly became one of the best with CSS at the organization.&lt;/p&gt;

&lt;p&gt;I was still missing writing &lt;a href="https://en.wikipedia.org/wiki/Visual_Basic" rel="noopener noreferrer"&gt;VB&lt;/a&gt; in &lt;a href="https://en.wikipedia.org/wiki/Microsoft_Visual_Studio#2008" rel="noopener noreferrer"&gt;Visual Studio&lt;/a&gt;, the feeling of being able "fly with code", talking to the computer and communicating exactly what I want from the program. However, on the other hand, going back to basics like &lt;a href="https://en.wikipedia.org/wiki/HTML" rel="noopener noreferrer"&gt;HTML&lt;/a&gt;, writing my first CSS style-rule, and finally realizing what &lt;a href="https://en.wikipedia.org/wiki/JavaScript" rel="noopener noreferrer"&gt;JavaScript&lt;/a&gt; was all about was just priceless.&lt;/p&gt;

&lt;p&gt;A few months into the front-end world, I started replacing all my previous personal web-implementations with front-end code written using open technologies. JavaScript helped me reduce my dependency on &lt;a href="https://en.wikipedia.org/wiki/ASP.NET" rel="noopener noreferrer"&gt;ASP.Net&lt;/a&gt;, plain HTML and CSS helped me get rid of &lt;a href="https://en.wikipedia.org/wiki/Microsoft_Silverlight" rel="noopener noreferrer"&gt;Silverlight&lt;/a&gt; controls written in &lt;a href="https://en.wikipedia.org/wiki/Extensible_Application_Markup_Language" rel="noopener noreferrer"&gt;XAML&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Massive switch in my expectation from computers
&lt;/h3&gt;

&lt;p&gt;Moving from proprietary technologies like VB, &lt;a href="https://en.wikipedia.org/wiki/C_Sharp_(programming_language)" rel="noopener noreferrer"&gt;C#&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Windows_Presentation_Foundation" rel="noopener noreferrer"&gt;WPF&lt;/a&gt;, Silverlight, and .Net in general to a few as open as JavaScript that can run almost without any external dependency, my tool-set began to change as well. The only thing 'Microsoft' in my entire stack was all that was required to compile and run my ASP.Net websites.&lt;/p&gt;

&lt;p&gt;My brother (my first human contact, my partner in all things related to technology, my teacher who also taught me computer hardware, and my successor who's better than me in almost everything I do) &lt;a href="https://stackoverflow.com/users/1468093/kamran-ahmed" rel="noopener noreferrer"&gt;tfKamran&lt;/a&gt;, just like he always comes up with new stuff, also introduced me to the world on &lt;a href="https://en.wikipedia.org/wiki/Linux" rel="noopener noreferrer"&gt;Linux&lt;/a&gt;. That new direction changed the way I looked at computers for the rest of my life.&lt;/p&gt;

&lt;p&gt;This did not happen all of a sudden but over a period of a couple of years during which we carried an instance of &lt;a href="https://en.wikipedia.org/wiki/Ubuntu_GNOME" rel="noopener noreferrer"&gt;Ubuntu Gnome&lt;/a&gt; on a USB flash drive with us for cool stuff that we only knew one could do on Linux. Somewhere in 2013, I took the leap and replaced Windows on &lt;a href="https://www.dell.com/support/home/us/en/04/product-support/product/studio-1558/overview" rel="noopener noreferrer"&gt;my first primary personal workstation&lt;/a&gt; with &lt;a href="https://en.wikipedia.org/wiki/Unity_(user_interface)" rel="noopener noreferrer"&gt;Ubuntu Unity 13.04&lt;/a&gt;. This did get me scared about my .Net dependent development tasks for which I had a &lt;a href="https://en.wikipedia.org/wiki/Virtual_machine" rel="noopener noreferrer"&gt;VM&lt;/a&gt; running &lt;a href="https://en.wikipedia.org/wiki/Windows_7" rel="noopener noreferrer"&gt;Windows 7&lt;/a&gt; for over a year on my constantly changing &lt;a href="https://en.wikipedia.org/wiki/Linux_distribution" rel="noopener noreferrer"&gt;Linux distros&lt;/a&gt;, while the rest of my setup could now reside naturally and with ease on Linux. A little further into the timeline, I replaced my entire .Net dependent code with JavaScript running on &lt;a href="https://en.wikipedia.org/wiki/Node.js" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; and gave up Windows entirely, except for a few video-games running via a &lt;a href="https://en.wikipedia.org/wiki/Multi-booting" rel="noopener noreferrer"&gt;dual-boot&lt;/a&gt; with a reasonably sized Windows partition on the same hard-drive.&lt;/p&gt;

&lt;p&gt;Working with Linux taught me so much more than I would probably have ever known about computers. From running commands in a &lt;a href="https://en.wikipedia.org/wiki/Terminal_emulator" rel="noopener noreferrer"&gt;terminal&lt;/a&gt; for everyday tasks instead of using the &lt;a href="https://en.wikipedia.org/wiki/Graphical_user_interface" rel="noopener noreferrer"&gt;graphical interface&lt;/a&gt;, to maintaining my workstation setup scripts and whatnot. Not to mention that inexhaustive list of choices for Linux distros, &lt;a href="https://en.wikipedia.org/wiki/Desktop_environment" rel="noopener noreferrer"&gt;desktop environments&lt;/a&gt;, and &lt;a href="https://en.wikipedia.org/wiki/Window_manager" rel="noopener noreferrer"&gt;window managers&lt;/a&gt;, etc. This also helped me cope with the &lt;a href="https://en.wikipedia.org/wiki/Carpal_tunnel_syndrome" rel="noopener noreferrer"&gt;Carpal tunnel syndrome&lt;/a&gt; that I acquired during my first job as I had limited use for a computer mouse with my increasing use of keyboard shortcuts.&lt;/p&gt;

&lt;p&gt;A few years later, both of us switched to &lt;a href="https://en.wikipedia.org/wiki/MacOS" rel="noopener noreferrer"&gt;macOS&lt;/a&gt; with him leading once again as always. This did not change our operating system this time but just added another dimension to our computing experience. I still have at least one instance of Linux residing in a virtual machine on my &lt;a href="https://en.wikipedia.org/wiki/MacBook_Pro" rel="noopener noreferrer"&gt;MacBook Pro&lt;/a&gt; to still be able to play with toys like &lt;a href="https://getfedora.org" rel="noopener noreferrer"&gt;Fedora&lt;/a&gt;, &lt;a href="https://i3wm.org" rel="noopener noreferrer"&gt;i3wm&lt;/a&gt;, etc. just like the old times.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding resonance also at the workplace
&lt;/h3&gt;

&lt;p&gt;Working on cool cutting-edge technology and with a great team brought my love for programming at work back to life. Adding to that my first best friend from work who was also my team-lead, coding at work was enjoyable again. Apart from our project deliverables, I also participated in various official and non-official technical training, coding-competitions and other technical fun activities in the company.&lt;/p&gt;

&lt;p&gt;I gained a new hobby: presenting technical talks in front of a group of people, which is something that given my personality, I never thought I would be able to. In fact, once I literally turned-over a request for a front-end training in the organization saying that I won't be able to pull it off especially in front of an audience full of people whom I have never interacted with before. Later after a few months, I received "the best trainer" award for a quarter, just proving the point that things were different now.&lt;/p&gt;

&lt;h2&gt;
  
  
  My introduction to open-source and free software
&lt;/h2&gt;

&lt;p&gt;I was introduced to open-source software right in the middle of the decade. Some of it came to me due to the kind of work I was doing and the rest with the tools I was using for the job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Discovering GitHub
&lt;/h3&gt;

&lt;p&gt;Many of the libraries that I worked with for my front-end development role were found on &lt;a href="https://github.com" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. For me, it was a portal where downloading a library was an exception. They kept suggesting that one could &lt;code&gt;clone&lt;/code&gt; the source which was something that I had no idea for what it meant or how it would help me either.&lt;/p&gt;

&lt;p&gt;My first project on GitHub was one to contain &lt;a href="https://github.com/myTerminal/project-euler-solutions" rel="noopener noreferrer"&gt;my solutions for problems&lt;/a&gt; on &lt;a href="https://projecteuler.net" rel="noopener noreferrer"&gt;Project Euler&lt;/a&gt;. All my solutions were in JavaScript, a language that I used to hate not any longer than half a year ago. During the same time, a random conversation at work (with the same person who made coding at work fun) about another alien term "&lt;a href="https://en.wikipedia.org/wiki/Emacs" rel="noopener noreferrer"&gt;Emacs&lt;/a&gt;" changed "the world" around me, giving birth to &lt;a href="https://github.com/myTerminal/dotfiles" rel="noopener noreferrer"&gt;my second GitHub project&lt;/a&gt; that I used to store my personal configuration. I literally didn't know that a practice to store one's Emacs configuration as a GitHub project existed until I posted a "barely-working" configuration and later found a few very mature ones. Fast-forward to last month, I just made &lt;a href="https://github.com/myTerminal/dotfiles/commit/0daeb77d636cbf90ec84885a1627d739f603466a" rel="noopener noreferrer"&gt;my 500th commit&lt;/a&gt; to the repository and decided to create &lt;a href="https://github.com/myTerminal/.emacs.d" rel="noopener noreferrer"&gt;my 71st project&lt;/a&gt; for the very same thing, in order to once again extract my Emacs configuration to a separate repository of its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  From &lt;code&gt;txt&lt;/code&gt; to &lt;code&gt;md&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;I started with not knowing the purpose of an &lt;code&gt;md&lt;/code&gt; extension for a text file to hold plain text and ended up realizing the importance of the &lt;a href="https://en.wikipedia.org/wiki/Markdown" rel="noopener noreferrer"&gt;Markdown language&lt;/a&gt;, learning it, using it and even teaching and promoting it at work. Now I had my own &lt;a href="https://en.wikipedia.org/wiki/README" rel="noopener noreferrer"&gt;README.md&lt;/a&gt; files for all my source projects on GitHub and also made a few attempts to use the language for much more than just documentation.&lt;/p&gt;

&lt;p&gt;At the time of this writing, I had already made five attempts to create my custom presentation tool out of which three of them used markdown as a language directly or indirectly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Being an active contributor to the community
&lt;/h3&gt;

&lt;p&gt;At the end of the decade, I ended up owning over &lt;a href="https://github.com/myTerminal?utf8=%E2%9C%93&amp;amp;tab=repositories&amp;amp;q=&amp;amp;type=source&amp;amp;language=" rel="noopener noreferrer"&gt;70 open-source repositories&lt;/a&gt; at GitHub around a few different areas of software. There are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Front-end libraries&lt;/li&gt;
&lt;li&gt;Node.js libraries and apps&lt;/li&gt;
&lt;li&gt;Small web-apps&lt;/li&gt;
&lt;li&gt;Emacs starter-kits, extensions and color themes&lt;/li&gt;
&lt;li&gt;Google Chrome extensions&lt;/li&gt;
&lt;li&gt;Project templates and boilerplate code&lt;/li&gt;
&lt;li&gt;Documentation projects, lists, and training-material&lt;/li&gt;
&lt;li&gt;Docker images&lt;/li&gt;
&lt;li&gt;My dotfiles and Emacs configurations, the kind of stuff where it all started&lt;/li&gt;
&lt;li&gt;... more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many of them are libraries and extensions that are hosted on package managers and archives for their respective platforms.&lt;/p&gt;

&lt;p&gt;I finally crossed &lt;a href="https://stackoverflow.com/users/1749585/myterminal" rel="noopener noreferrer"&gt;1k reputation on StackOverflow&lt;/a&gt; and a little on &lt;a href="https://stackexchange.com/users/1944048/myterminal?tab=accounts" rel="noopener noreferrer"&gt;a few other StackExchange communities&lt;/a&gt;. I created a few failed YouTube video series on &lt;a href="https://www.youtube.com/user/tfismail" rel="noopener noreferrer"&gt;my channel&lt;/a&gt; and wrote &lt;a href="https://dev.to/myterminal"&gt;a bunch of boring posts on DEV.to&lt;/a&gt; with almost a thousand followers. It's hard to believe that there are real people that find me worth listening (or reading) to. :)&lt;/p&gt;

&lt;h2&gt;
  
  
  A few noteworthy experiences
&lt;/h2&gt;

&lt;p&gt;Ten years is a big time to be able to recollect experiences from those exactly a hundred and twenty months. Below is a very small list mentioning a few significant ones.&lt;/p&gt;

&lt;h3&gt;
  
  
  Humiliation and discouragement at the start of my professional career
&lt;/h3&gt;

&lt;p&gt;My first professional project assignment not only still upsets me, but also haunts me to a certain degree. Leaving out the fact for how a high-performer from the on-job training could prove out to be a low-performer on the real job, there were way too many issues at the set over there. Workaholic managers who didn't care about the personal life of their teams, arrogant team-mates who made every effort to scare and intimidate new joiners, people who ensured job security by keeping their code as encrypted as possible to make it almost impossible for someone else to do the job, and the list goes on. I expected (and still do) team-members to help new people and get them on board, not only as a gesture of good-will but also for their own good in the future. The culture over there was exactly the opposite.&lt;/p&gt;

&lt;p&gt;I was asked the reason for not using my brains at work and was even indirectly asked to consider changing my profession. Well, here I am, I just completed a decade being a software developer and that person works right in the neighboring state. I'd love to meet him one day and talk about my incredible experiences after I left his degrading team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Realizing that I'm not a "star"
&lt;/h3&gt;

&lt;p&gt;I was told at my first job that no matter how many times my colleagues and I will change our jobs and wherever we go in the future, we'll always be standing out from the crowd because of our talents and skills. However, my second job was an eye-opener where I got to meet a few very talented and hard-working people, only to quickly realize that I'm not kind of "star" they told me I was.&lt;/p&gt;

&lt;p&gt;There were people who were far better at their job than me and my training batch-mates from my previous job. It was just that they were not only getting appreciated for that kind of performance but were also getting compensated well for the job without the toxic environment I had to spend months of my life in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Being asked to slow down at work
&lt;/h3&gt;

&lt;p&gt;This was another shattering moment for me when I received instructions at work to slow down and not work a little too hard outside my boring daily job. Not able to contain my passion for computer programs and technology, I was just trying to do my job a little better than they would've expected from me at that role, not realizing the kind of insecurity it poses to people who've been there in the organization since a few years before me. I'd not use any names here (nor would it be of any positive help), but all I'd say is that it was really devastating.&lt;/p&gt;

&lt;h3&gt;
  
  
  People stealing credit for their own career path
&lt;/h3&gt;

&lt;p&gt;This is something that I'm sort of used to now. This hasn't happened to me just once or twice. Moreover many instances ended up the other party getting publicly applauded and even offered a promotion. It's also a mistake at my part that I tend to take every question asked at work seriously, even those discussed in small-talks and side-conversations and end up not only losing the credit for it but see it reach the masses through someone else who did not even have the courtesy to pass a small credit or acknowledgment for my selfless help.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few things that I learned
&lt;/h2&gt;

&lt;p&gt;Learning technology was relatively easy but the decade was full of learning other things as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cool things vs Real-world code
&lt;/h3&gt;

&lt;p&gt;It's very easy for a technology enthusiast to drown in fascination with new things showing up on the surface of the earth every day. As you get familiar with new stuff, get a little comfortable with it and realize the good things that it brings in your software, you tend to use it in every single implementation you create. At work, not everyone welcomes (or even accepts) change that quickly which makes it a little difficult to introduce "that cool thing" in a team of more than a single person, which otherwise would have been just you.&lt;/p&gt;

&lt;p&gt;Having said that, it's not impossible to do that either. I've seen people pull that off without much reasoning and end up changing the entire codebase just because they 'think' something awesome is out there and we should use it. On the other hand, I've been into situations where I could literally see a solution to a particular problem but failed to convince my team to use it either I wasn't assertive enough or they didn't trust me due to being new at the job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Loving your job vs Being good at your job
&lt;/h3&gt;

&lt;p&gt;I'll start by stating that even after spending hours with code outside of work daily for over 15 years now, I think I'm still a mediocre developer. My passion for software and technology may not be having an effect on how professionally effective I am. I've learned that one won't always be great at something one loves to do.&lt;/p&gt;

&lt;p&gt;One example of this comes from my unpopular interest in mountain biking. I love it but suck at it at the same time. I've spent months trying to get even a basic bunny-hop to work but failed to lift the rear-wheel in the air by more than even an inch. In fact, I did end up hurting myself at multiple places back in late 2018, eventually indefinitely postponing my learning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Speed vs Experience
&lt;/h3&gt;

&lt;p&gt;I've learned that there are at least two ways to solve a problem: speed (which in most cases is pure brute-force) and experience (which I relate to smart-work). I realize that over the past few years, I may have lost the speed at which I code, but I've gained experience and resilience so that I can take those shorter routes facing more resistance and reach the desired goal with lesser effort and maybe even earlier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills or Number of years
&lt;/h3&gt;

&lt;p&gt;During the earlier years of my career, I used to believe that the number of years you spend in this industry dictates your growth. Then I came across a few people who proved me wrong by growing way beyond their year count in the profession. Later I thought that it must be your skills that help you grow, only to learn that I was wrong even this time.&lt;/p&gt;

&lt;p&gt;Now I realize that there is no single variable for success but it's a combination of many factors that you don't get to see in the final result. I've also seen a person with far superior skills not receiving the kind of attention/respect/ears/(or whatever) one would expect for being good at their job compared to a person who has spent more years with the same company and has been around for long at the same place. This could be exactly the opposite where a new member of the team may end up stealing the show even though they may not be adding that kind of value that the older team-members may be adding.&lt;/p&gt;

&lt;p&gt;It's all very complicated and I'm still not sure what it is. Maybe it needs more of talking, maybe a little more bragging, or maybe stealing other people's work for your own credit? Just saying.&lt;/p&gt;

&lt;h2&gt;
  
  
  The purpose of writing this article
&lt;/h2&gt;

&lt;p&gt;One of the main reasons for me to write this article was to reflect back at the last decade to not only realize and appreciate how great the 'journey' has been but to also look at and find inspiration in my own story. I know that working for a decade in an industry is not that big of a deal where we have some experts with several decades of experience, but I still consider this an achievement for me, especially after surviving &lt;a href="http://ismail.teamfluxion.com/diary/20190731/How_my_life_restarted_as_a_New_Game_Plus" rel="noopener noreferrer"&gt;the big reset last year&lt;/a&gt;, that could have prevented me from completing this decade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; Some parts of this article may sound like a brag and some like a rant but that is purely unintentional. I'm still trying to make myself worthy in the software industry, still trying to figure out what this is all about and I'm not even remotely there yet.&lt;/p&gt;

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