<?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: Kahlil Lechelt</title>
    <description>The latest articles on DEV Community by Kahlil Lechelt (@kahlil).</description>
    <link>https://dev.to/kahlil</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%2F129959%2Fcb1c9067-c1b7-440f-9501-5341377225f6.jpg</url>
      <title>DEV Community: Kahlil Lechelt</title>
      <link>https://dev.to/kahlil</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kahlil"/>
    <language>en</language>
    <item>
      <title>Run your day, don’t let the day run you</title>
      <dc:creator>Kahlil Lechelt</dc:creator>
      <pubDate>Wed, 02 Mar 2022 09:27:04 +0000</pubDate>
      <link>https://dev.to/kahlil/run-your-day-dont-let-the-day-run-you-10d2</link>
      <guid>https://dev.to/kahlil/run-your-day-dont-let-the-day-run-you-10d2</guid>
      <description>&lt;p&gt;When I transitioned from software engineering to engineering management I had a difficult time adjusting to the new job. As an engineer, I let the day run me. I did not proactively plan my day or my week. I worked on my sprint tasks when I had no meetings and joined meetings when I had to.&lt;/p&gt;

&lt;p&gt;That is a common way of working as an engineer. You want to do your work and try to maximize your time to code and try to get into flow state. This can work out fine.&lt;/p&gt;

&lt;p&gt;I continued with that basic framework as an engineering manager out of habit and it did not work.&lt;/p&gt;

&lt;p&gt;By letting the day run me I was sitting in meetings almost all the time, never got into flow state and just reacted to things. I barely had time to do any proactive, strategic work and when I had some time I feverishly caught up on outstanding todos.&lt;/p&gt;

&lt;p&gt;Picture of a 45 inch record of Flourgon’s number one hit “We run things”&lt;br&gt;
The lyrics in We Run Things by Flourgon lead to the solution to my problem. Just turn it around.&lt;br&gt;
In 1988 Jamaican artist Flourgon landed a number one hit with “We run things”. In the chorus he used the Jamaican proverb:&lt;/p&gt;

&lt;p&gt;We run tings, tings nuh run we.&lt;/p&gt;

&lt;p&gt;In the spirit of these wise words, the solution to the problem was for me to start to run my day. Doing so basically means to take control of your calendar and live by it.&lt;/p&gt;

&lt;p&gt;Every day I switch my calendar into day-view and clean it up. I Reject any meetings I don’t have to participate in, resolve parallel meeting conflicts by rejecting or moving meetings that I can’t attend and schedule things I want to get done in the remaining free areas of the day.&lt;/p&gt;

&lt;p&gt;Using your calendar and scheduling everything you want to do in there is a major productivity practice taught by many productivity experts. Ideally you work on one thing at a time and plan beforehand when to do it.&lt;/p&gt;

&lt;p&gt;Taking control of your calendar has little value if you are letting Slack and email constantly distract you from what you are trying to do. Checking your messages is also work that should be scheduled.&lt;/p&gt;

&lt;p&gt;My Slack notifications are always turned off. I schedule time to check Slack and answer messages. Sometimes I just quit Slack to make sure I am not distracted by attempts of the lizard brain to quickly switch over and see what is going on in there. The same setup goes for email.&lt;/p&gt;

&lt;p&gt;The last ingredient needed to run your day is to keep a todo list. This is something I never needed as a software engineer. Every attempt of using a todo list ended in todos rotting away somewhere in different todo apps, never reviewed, never checked off.&lt;/p&gt;

&lt;p&gt;As an engineering manager I find myself inundated with little tasks I need to do or little to big things I volunteer to do for my direct reports or my manager. In order to not forget 90% of these things I have to write them down. I use Things for that.&lt;/p&gt;

&lt;p&gt;I use a global keyboard shortcut to capture every single thing I need to do in my Things Inbox. On a daily basis I do a review of the todos. Sort them into the right areas (typically just “Work”) and prioritize them.&lt;/p&gt;

&lt;p&gt;When it comes to prioritization I learned that it really helps to focus in on the 1-3 tasks you really and truly want or need to get done today. Add them to your Today list and makes sure you definitely do them. Repeat every day.&lt;/p&gt;

&lt;p&gt;To be honest I am quite bad at reviewing my todo list every day but when I fall off the wagon I just pick up from where I left off. I go through the list, check off everything that is already done, delete every todo I don’t need anymore and proceed to prioritizing the top 1-3 items.&lt;/p&gt;

&lt;p&gt;When sorting todos I also use Things’ scheduling features for items I don’t need to think about now so that they are out of my face.&lt;/p&gt;

&lt;p&gt;This technique really helps to deal with the emotionally overwhelming aspect of growing todo lists. And this is where we go full circle and come back to the calendar because the work items that you schedule for your meeting-free time should be the top priorities from your todo list.&lt;/p&gt;

&lt;p&gt;So this is how you run your day.&lt;/p&gt;

&lt;p&gt;To summarize, the first rule is to make your calendar the single source of truth for anything you do today and live by it. Second, one must turn off all notifications and any other distractions, schedule message checking and answering as per the first rule. And the third rule is to keep, review and prioritize a todo list, schedule top priorities as per rule one.&lt;/p&gt;

</description>
      <category>engineeringmanager</category>
      <category>productivity</category>
      <category>newmanager</category>
    </item>
    <item>
      <title>Volta</title>
      <dc:creator>Kahlil Lechelt</dc:creator>
      <pubDate>Wed, 15 Jul 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/kahlil/volta-46l5</link>
      <guid>https://dev.to/kahlil/volta-46l5</guid>
      <description>&lt;p&gt;This post is about &lt;a href="https://volta.sh"&gt;Volta&lt;/a&gt; and why it should be the first thing you should install on your machine as a JavaScript developer. This is how &lt;a href="https://docs.volta.sh/guide/"&gt;the Getting Started guide&lt;/a&gt; describes Volta in different places:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Volta is a hassle-free way to manage your JavaScript command-line tools.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Volta solves the problem of global packages&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and it can&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Managing your [JavaScript] toolchain&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first time I landed on the page I had problems really understanding what the Volta’s value was just by reading the descriptions. Somewhere in the docs they are talking about the “JavaScript toolchain”. I never used that term before. What does it mean?&lt;/p&gt;

&lt;p&gt;What is the “problem of global packages”?&lt;/p&gt;

&lt;h2&gt;
  
  
  The definition of “JavaScript toolchain”
&lt;/h2&gt;

&lt;p&gt;In order to understand which problem Volta solves, let’s define what they mean by “JavaScript toolchain”.&lt;/p&gt;

&lt;p&gt;The JavaScript toolchain that Volta manages for you consists of all the tooling that you need in order to run and install JavaScript packages as well as globally installed command-line tools.&lt;/p&gt;

&lt;p&gt;You can categorize these tools into three categories:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The runtime, that would be &lt;strong&gt;Node.js&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;JavaScript package managers, that would be &lt;strong&gt;npm&lt;/strong&gt; and &lt;strong&gt;Yarn&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;JavaScript CLI tools, that would be &lt;strong&gt;any globally installed npm package&lt;/strong&gt; binaries&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The problem of global packages
&lt;/h2&gt;

&lt;p&gt;The problems of global packages are slightly different for the three categories mentioned above.&lt;/p&gt;

&lt;h3&gt;
  
  
  Node
&lt;/h3&gt;

&lt;p&gt;The problem with a global JavaScript runtime is that you have to switch the runtime globally per project if you need different Node versions for different projects.&lt;/p&gt;

&lt;p&gt;This can be done via a script whenever you enter the directory via command-line but the switch can be slow and any global packages you installed for one version are now not available anymore or might break because they depend on a specific version to work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Package managers
&lt;/h3&gt;

&lt;p&gt;A certain Node version comes with a certain npm version. Yarn global installs might require a certain Node version or just possibly not work with a certain version of Node.&lt;/p&gt;

&lt;p&gt;Some projects might need different versions of package managers because they might rely on features that are differ between the version.&lt;/p&gt;

&lt;h3&gt;
  
  
  Global npm packages
&lt;/h3&gt;

&lt;p&gt;For globally installed npm packages or JavaScript CLI tools as you might call them, the problem can be either of two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It is installed for the currently active Node version. That means it is not available when you switch to a different version.&lt;/li&gt;
&lt;li&gt;Or it just uses whichever Node version is currently active which creates reliability issues because it might not be compatible for this version. In some cases it even needs to be recompiled.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Volta solves all of this&lt;/strong&gt; and gets out of your way. Let me tell you how.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Volta manages Node
&lt;/h2&gt;

&lt;p&gt;Volta allows you to install Node via the Volta CLI.&lt;code&gt;volta install node&lt;/code&gt; installs the latest LTS version of Node. You can also install a specific version with &lt;code&gt;volta install node@10.15.3&lt;/code&gt; for instance.&lt;/p&gt;

&lt;p&gt;Whenever you run a Node program it will use the latest version you installed. If you need to use a specific version of Node for a project you can pin the currently active Node version to the project’s package.json with &lt;code&gt;volta pin node&lt;/code&gt; or a different Node version with &lt;code&gt;volta pin node@10&lt;/code&gt; for instance.&lt;/p&gt;

&lt;p&gt;From this point on all Node programs and locally installed npm packages that are being executed in this project are run on that pinned Node version and nothing else.&lt;/p&gt;

&lt;p&gt;The pinning is nothing else besides an entry in the package.json. This means you can easily change the Node version by hand at any time if you want.&lt;/p&gt;

&lt;p&gt;When you share this project via GitHub any other team member that has Volta installed on their machine will also automatically use the pinned Node version in that project. Volta will just go ahead and install it if you don’t have that specific version installed yet.&lt;/p&gt;

&lt;p&gt;This is huge for teams. As long as Volta is installed everywhere it just takes care of using the right version per project and gets out of your way.&lt;/p&gt;

&lt;p&gt;Many times I have experienced onboarding team members running into problems or experiencing inconsistencies because they were using a different Node version in a project.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Volta manages package managers
&lt;/h2&gt;

&lt;p&gt;Package managers can be installed and pinned per project with Volta.&lt;/p&gt;

&lt;p&gt;On first install of a package manager Volta installs the latest stable Node version with it and binds the two so that the package manager works forever.&lt;/p&gt;

&lt;p&gt;Via &lt;code&gt;volta pin&lt;/code&gt; you can pin the package manager and desired version to a JavaScript project.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Volta manages JavaScript CLI tools
&lt;/h2&gt;

&lt;p&gt;Volta allows you to install any JavaScript CLI tool and will make sure it works forever once installed. If you want to install Sindre Sorhus’ tremendous Trash CLI tool you can do that by typing &lt;code&gt;volta install trash-cli&lt;/code&gt; to use it.&lt;/p&gt;

&lt;p&gt;Volta installs the latest LTS Node version with the tool if that version of Node was not installed yet and will always run the tool on that version of Node forever. No matter which version of Node you are using in your current project.&lt;/p&gt;

&lt;p&gt;When you use a different Node version manager or install your Node versions globally yourself you can never be sure if all your CLI tools are working.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it all works together
&lt;/h2&gt;

&lt;p&gt;Once Node and package manager are pinned for a project and Volta is used by all devs on your team and your CI/CD automation, all weird bugs and weird behavior caused by incompatible Node and package manager versions are completely eliminated.&lt;/p&gt;

&lt;p&gt;This tool unlocks extra stability levels for the JavaScript dev and essentially makes the toolchain much reliable.&lt;/p&gt;

&lt;p&gt;Meaning: if your setup worked once it will definitely work again later. No matter what you globally install for other projects.&lt;/p&gt;

&lt;p&gt;It’s one of the first things I install on a fresh system. I highly recommend you have a good look at Volta.&lt;/p&gt;

&lt;p&gt;And on top of everything it is wicked fast because it’s written in Rust and Rust compiles down to a native binary.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>devrel</category>
    </item>
    <item>
      <title>I am an engineering manager now</title>
      <dc:creator>Kahlil Lechelt</dc:creator>
      <pubDate>Thu, 23 Jan 2020 13:29:08 +0000</pubDate>
      <link>https://dev.to/kahlil/i-am-an-engineering-manager-now-4fo2</link>
      <guid>https://dev.to/kahlil/i-am-an-engineering-manager-now-4fo2</guid>
      <description>&lt;p&gt;Last year my manager quit. I was offered his position and since December or so, I am an engineering manager.&lt;/p&gt;

&lt;p&gt;It is strange to move from a well-defined role into such a hazily-defined one.&lt;/p&gt;

&lt;p&gt;A few things have changed. I don’t code anymore at work and the relationship to my team has changed. Especially to those who now report to me.&lt;/p&gt;

&lt;p&gt;I want to be the best possible manager to them that I can be, so I am busy learning.&lt;/p&gt;

&lt;p&gt;My friend &lt;a href="http://twitter.com/hglattergotz"&gt;Henning Glatter-Götz&lt;/a&gt; recommended the &lt;a href="http://managingup.simplecast.com/"&gt;&lt;strong&gt;Managing Up podcast&lt;/strong&gt;&lt;/a&gt; to me. I have listened to a bunch of episodes so far and it has been very helpful already.&lt;/p&gt;

&lt;p&gt;If you are an engineering manager or are interested in becoming one, I highly recommend you check out &lt;a href="http://managingup.simplecast.com/"&gt;Managing Up&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So far, my favorite episodes are:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://managingup.simplecast.com/episodes/54705bed"&gt;&lt;strong&gt;Episode 5: One on Ones: The Basics&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I loved hearing about how they approach their one-on-ones and about their different techniques on how to ask questions. It was also really great to learn how commonplace one-on-ones are in engineering organizations.One thing that surprised me was that it seems to be common to have weekly one-on-one meetings. We do it bi-weekly at LogMeIn. I think that it’s a good frequency if the one-on-ones are not skipped.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://managingup.simplecast.com/episodes/creating-self-managing-teams"&gt;&lt;strong&gt;Episode 26: Creating Self-Managing Teams&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This episode really exposed the experience the co-hosts of the show have. They are very open about mistakes they have made in the past and discuss how you might achieve “managing yourself out of a job”. This is a phrase that I have been thinking about a lot myself and I feel that should definitely be an engineering managers goal.&lt;/p&gt;

</description>
      <category>management</category>
      <category>engineeringmanager</category>
    </item>
    <item>
      <title>Build a Slack slash command app with Zeit’s Now</title>
      <dc:creator>Kahlil Lechelt</dc:creator>
      <pubDate>Mon, 08 Jul 2019 07:29:08 +0000</pubDate>
      <link>https://dev.to/kahlil/build-a-slack-slash-command-app-with-zeit-s-now-169o</link>
      <guid>https://dev.to/kahlil/build-a-slack-slash-command-app-with-zeit-s-now-169o</guid>
      <description>&lt;p&gt;First of all: &lt;a href="https://zeit.co/now"&gt;&lt;strong&gt;Now&lt;/strong&gt;&lt;/a&gt; is so flipping great it’s not even funny. Basically it is this: &lt;/p&gt;

&lt;p&gt;You write your app, type &lt;code&gt;now&lt;/code&gt; and it's deployed. You get back the URL under which it is deployed and that’s that. Every other deployment results in a new deployment under a new URL.&lt;/p&gt;

&lt;p&gt;The latest deployment is always aliased to a URL that doesn’t change and that’s the address to your app or API.&lt;/p&gt;

&lt;p&gt;If you hook up Github, your branches get deployed automatically as immutable deployments. The alias of those deployments contains the branch name. Every push results in a new deployment.&lt;/p&gt;

&lt;p&gt;Now is a perfect fit if you want to create a slash command app for Slack.&lt;/p&gt;




&lt;p&gt;Slash commands are super simple. When you send off a message like &lt;code&gt;/mycommand yey&lt;/code&gt; all the command does is sending a post request over to a URL with your command and then prints out the response to you in Slack.&lt;/p&gt;

&lt;p&gt;I used &lt;a href="https://github.com/zeit/micro"&gt;&lt;strong&gt;Micro&lt;/strong&gt;&lt;/a&gt; (also made by our buddies at Zeit) to set up the API. Micro is a small no-config Node tool that allows you to create a microservice in no time. Write the function that takes the request and start the microservice with the &lt;code&gt;micro&lt;/code&gt; command and you're good to go. &lt;/p&gt;

&lt;p&gt;Now comes with &lt;a href="https://zeit.co/blog/now-init"&gt;initialization templates&lt;/a&gt; that have configurations for different tools, frameworks, static site generators, etc. One of them is called &lt;code&gt;node-micro&lt;/code&gt; which configures Micro for Now. In order to use it, type &lt;code&gt;now init&lt;/code&gt; and then choose &lt;code&gt;node-micro&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It works out of the box. If you start the &lt;code&gt;now dev&lt;/code&gt; and curl &lt;code&gt;localhost:3000&lt;/code&gt; you get the hello world message as a response.&lt;/p&gt;

&lt;p&gt;You can deploy that by just typing &lt;code&gt;now&lt;/code&gt; on the terminal or by hooking up now with your GitHub repository.&lt;/p&gt;




&lt;p&gt;Next, configure your &lt;a href="https://api.slack.com/slash-commands"&gt;&lt;strong&gt;Slack slash command&lt;/strong&gt;&lt;/a&gt;. Give it a name and a slash command and the endpoint URL. In our case it would be the alias that was generated. The alias always points to the latest deployment. &lt;/p&gt;

&lt;p&gt;When you use that slash command it will post back that hello world message back into your Slack chat as a response. &lt;/p&gt;

&lt;p&gt;Now you are ready to take over the world with your Slack slash command!&lt;/p&gt;

</description>
      <category>howto</category>
      <category>slack</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I was at ReactEurope and now I "get" React Hooks</title>
      <dc:creator>Kahlil Lechelt</dc:creator>
      <pubDate>Fri, 07 Jun 2019 09:33:30 +0000</pubDate>
      <link>https://dev.to/kahlil/i-was-at-reacteurope-and-now-i-get-react-hooks-287j</link>
      <guid>https://dev.to/kahlil/i-was-at-reacteurope-and-now-i-get-react-hooks-287j</guid>
      <description>&lt;p&gt;Last week, I went to Paris to spend some time there with my family and to attend ReactEurope.&lt;/p&gt;

&lt;p&gt;Based on the kind of mediocre design of their website I did not expect a lot of care to go into the organization of the conference. I expected a dull conference room in a hotel and some interesting talks.&lt;/p&gt;

&lt;p&gt;I got some interesting talks and a dull, stuffy conference room in a dull, ugly area of Paris. The room was too small for so many people though. The air was terrible and people coughing and sneezing all around me. I was not capable of spending a lot of time in there.&lt;/p&gt;

&lt;p&gt;Instead, I took some time to read through the &lt;a href="https://reactjs.org/docs/hooks-intro.html"&gt;React Hooks documentation&lt;/a&gt;. Let me just take a second to say how well written and how thought-out the documentation is. Really world-class. Unlike the ReactEurope conference.&lt;/p&gt;

&lt;p&gt;I also started rewriting &lt;a href="https://github.com/kahlil/grit"&gt;my Grit editor&lt;/a&gt; from &lt;a href="https://github.com/preactjs/preact"&gt;Preact&lt;/a&gt; and &lt;a href="https://github.com/developit/htm"&gt;htm&lt;/a&gt; to React with hooks. Just so to get familiar with them.&lt;/p&gt;

&lt;p&gt;It is always hard to convey how features like that impact your development experience without trying it out. I have only rewritten a small part of it so far but I like it a lot.&lt;/p&gt;

&lt;p&gt;The concept of custom hooks especially seems to have a lot of impact when it comes to simplifying your code.&lt;/p&gt;

&lt;p&gt;Here is an example.&lt;/p&gt;

&lt;p&gt;In order for Grit to work the user has to store the path to their Markdown files in the settings. I store the settings by using this ace package called electron-store by Sindre Sorhus (Shout out to him, what would I do without his stellar open source work?!).&lt;/p&gt;

&lt;p&gt;This path needs to be shown in the UI via a state variable and it has to be synced back to the electron-store if it is changed.&lt;/p&gt;

&lt;p&gt;So I created this custom hook called useElectronStore to read the path from electron-store and to set the filePath state variable from it and to set both, the state variable and electron-store, with the new value once it is changed.&lt;/p&gt;

&lt;p&gt;And it makes getting and setting electron-store values incredibly easy. The API basically looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const [someValue, setSomeValue] = useElectronStore('someValue', '');

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

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;'someValue'&lt;/code&gt;-string is the path in electron-store and the second value is the default value for it.&lt;/p&gt;

&lt;p&gt;I can now say that I “get” React Hooks because ReactEurope was not that great. Works for me.&lt;/p&gt;

</description>
      <category>conference</category>
      <category>reacthooks</category>
    </item>
    <item>
      <title>Announcing Grit: a Markdown editor for blogging with a static site generator</title>
      <dc:creator>Kahlil Lechelt</dc:creator>
      <pubDate>Tue, 07 May 2019 09:30:59 +0000</pubDate>
      <link>https://dev.to/kahlil/announcing-grit-a-markdown-editor-for-blogging-with-a-static-site-generator-52il</link>
      <guid>https://dev.to/kahlil/announcing-grit-a-markdown-editor-for-blogging-with-a-static-site-generator-52il</guid>
      <description>&lt;p&gt;Last year I decided to write more. I thought I’d try a hosted solution because I wanted to concentrate on the writing and not on the fiddling with the site.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://micro.blog"&gt;Micro.blog&lt;/a&gt; was the most attractive solution to me but after using it for a while I realized that, as a developer, I am not capable of leaving the building of my blog to somebody else. There were too many things I wanted to tweak/change, bugs I couldn’t live with etc.&lt;/p&gt;

&lt;p&gt;So I ended up sticking with my &lt;a href="http://gohugo.io"&gt;Hugo&lt;/a&gt; solution.&lt;/p&gt;

&lt;p&gt;Unfortunately there are many little annoyances when blogging with a static site generator, due to the fact that your posts are a bunch of Markdown files in a folder with a specific file name and some frontmatter boilerplate in them.&lt;/p&gt;

&lt;p&gt;Creating a blog post was always tedious. Too many little fiddly things to do before you could just start to write.&lt;/p&gt;

&lt;p&gt;In order to remedy this I created a &lt;a href="https://github.com/kahlil/blog-cli"&gt;blog-cli&lt;/a&gt; that just schaffolds new blog posts for me. It works fine but I really wanted an editor that can do that for me.&lt;/p&gt;

&lt;p&gt;That’s why I built &lt;a href="https://github.com/kahlil/grit"&gt;Grit&lt;/a&gt;. It’s a little Electron app that let’s you manage a folder full of Markdown posts and edit them as well.&lt;/p&gt;

&lt;p&gt;It allows you to store the path to your Markdown files, filter through the files, create a new file, edit the file and publish via Git.&lt;/p&gt;

&lt;p&gt;I used &lt;a href="https://preactjs.com/"&gt;Preact&lt;/a&gt; and &lt;a href="https://github.com/developit/htm"&gt;htm&lt;/a&gt; to write it because I was too lazy to set up a build step and I love writing code the browser can directly interpret. For the file editing part in Grit I am using &lt;a href="https://codemirror.net/"&gt;CodeMirror&lt;/a&gt; which is a hell of a product, wow.&lt;/p&gt;

&lt;p&gt;If you use Hugo, Jekyll, Gatsby or whatever other static site generator to build your blog and are looking for a little convenience there, give it a spin! See the current feature list &lt;a href="https://github.com/kahlil/grit"&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s an alpha version so there be dragons. But I am planning a bunch of improvements like: drag and drop images, configurable frontmatter and some enhancements around file-creation.&lt;/p&gt;

&lt;p&gt;If you want, let me know what you think &lt;a href="https://twitter.com/kahliltweets"&gt;on Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>blogging</category>
      <category>staticsitegenerator</category>
      <category>editor</category>
      <category>markdown</category>
    </item>
    <item>
      <title>Get off of Medium and publish a blog under your own domain</title>
      <dc:creator>Kahlil Lechelt</dc:creator>
      <pubDate>Tue, 02 Apr 2019 06:08:50 +0000</pubDate>
      <link>https://dev.to/kahlil/get-off-of-medium-and-publish-a-blog-under-your-own-domain-50ak</link>
      <guid>https://dev.to/kahlil/get-off-of-medium-and-publish-a-blog-under-your-own-domain-50ak</guid>
      <description>&lt;p&gt;Nobody can wall that off behind a paywall.&lt;/p&gt;

&lt;p&gt;Nobody can put a popup over your stuff and say “Don’t look at the content right now. It’s so much better if you login!”.&lt;/p&gt;

&lt;p&gt;Nobody can build their brand off of your work. Nobody can make money off of your work, if you don’t want to.&lt;/p&gt;

&lt;p&gt;Nobody can tell you “You can’t have your own domain on here.”&lt;/p&gt;

&lt;p&gt;Your hoster will most likely not suddenly go: “Oops we just went out of business / were acquired, we’re deleting all your stuff but you can export it until tomorrow and fuck off, basically.”&lt;/p&gt;

&lt;p&gt;And if they do, you can go and host that somewhere else.&lt;/p&gt;

&lt;p&gt;You can still decide to re-distribute your content to places like Medium, dev.to, Micro.blog, Twitter, Instagram, Linkedin, Facebook and / or via a newsletter. It’s a good way to extend your readership.&lt;/p&gt;

&lt;p&gt;You can have an RSS feed! That feed should always be &lt;em&gt;under your domain&lt;/em&gt;!&lt;/p&gt;

&lt;p&gt;Writing on the internet under other peoples / companies domain names is like giving away money.&lt;/p&gt;

&lt;p&gt;Sure, sometimes it makes sense to guest-post on somebody else’s blog because it broadens your audience. That’s a good trade-off.&lt;/p&gt;

&lt;p&gt;You should just always have a place that people can come back to that is yours.&lt;/p&gt;

</description>
      <category>blogging</category>
      <category>personalbrand</category>
    </item>
    <item>
      <title>How to Force Your Brain to Be Creative</title>
      <dc:creator>Kahlil Lechelt</dc:creator>
      <pubDate>Fri, 08 Mar 2019 12:13:02 +0000</pubDate>
      <link>https://dev.to/kahlil/how-to-force-your-brain-to-be-creative-274a</link>
      <guid>https://dev.to/kahlil/how-to-force-your-brain-to-be-creative-274a</guid>
      <description>&lt;p&gt;Since I realized that constraints can produce more creative outcomes I‘ve been fascinated by it.&lt;/p&gt;

&lt;p&gt;I think I first learned about it when the iPhone became popular and the form factor and usage patterns produced beautifully designed apps and then website and web app designs that were optimized for mobile.&lt;/p&gt;

&lt;p&gt;I read up on it a little and there seems to be a pretty logical explanation for this.&lt;/p&gt;

&lt;p&gt;In an environment of abundance the brain is not being challenged. The brain likes to be efficient as possible. If there is an abundance of resources it’s going to be harder to be creative because your brain has no incentive to really get into gear.&lt;/p&gt;

&lt;p&gt;In a situation where you are confronted with resource scarcity of some kind, your brain has no choice to start turning up in order to find out how to work around the scarcity.&lt;/p&gt;

&lt;p&gt;This results in more creative, out-of-the-box thinking.&lt;/p&gt;

&lt;p&gt;I think there is a second element that plays a part in this as well: reduced cognitive load.&lt;/p&gt;

&lt;p&gt;Resource scarcity could also be interpreted as: some decisions were already made for you. The fewer decisions you have to make, the more brain capacity is available to you to solve the problem at hand. &lt;/p&gt;

&lt;p&gt;If you want to be productive and inventive, set constraints.&lt;/p&gt;

&lt;p&gt;Like a time limit or a specific set of tools.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>creativity</category>
    </item>
    <item>
      <title>The Ultimate Recipe to Attract an Audience on the Internet</title>
      <dc:creator>Kahlil Lechelt</dc:creator>
      <pubDate>Fri, 01 Mar 2019 14:38:03 +0000</pubDate>
      <link>https://dev.to/kahlil/the-ultimate-recipe-to-attract-an-audience-on-the-internet-5dag</link>
      <guid>https://dev.to/kahlil/the-ultimate-recipe-to-attract-an-audience-on-the-internet-5dag</guid>
      <description>

&lt;p&gt;My awesome co-worker &lt;a href="https://mobile.twitter.com"&gt;Emma Wedekind&lt;/a&gt; wrote&lt;br&gt;
&lt;a href="https://dev.to/emmawedekind/how-i-gained-27000-twitter-followers-in-6-months-2hog"&gt;this post about how she got 27K followers on Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It's a great post with lots of good advice to grow high quality followers.&lt;/p&gt;

&lt;p&gt;I was able to watch the whole ride and it was quite something. There is one&lt;br&gt;
thing I noticed about how she used Twitter that I think had significant&lt;br&gt;
influence in why she blew up.&lt;/p&gt;

&lt;p&gt;She &lt;strong&gt;editorializes&lt;/strong&gt; her Twitter account. She deliberately tweets content that&lt;br&gt;
might be valuable to the developer community. And she responds to tweets a lot.&lt;/p&gt;

&lt;p&gt;She also keeps a very friendly, welcoming and helpful tone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be kind and provide value frequently and consistently over long stretches of&lt;br&gt;
time&lt;/strong&gt; is basically the ultimate recipe for attracting and growing an audience&lt;br&gt;
on the internet. We've all seen this work many times.&lt;/p&gt;

&lt;p&gt;It has happened many times over on YouTube, Twitter and of course many blogs.&lt;/p&gt;

&lt;p&gt;The thing is, the hardest part is not to come up with the topics or to do the&lt;br&gt;
writing itself. The hardest part is to keep it going in a specific rhythm over&lt;br&gt;
long stretches of time.&lt;/p&gt;

&lt;p&gt;It takes a lot of discipline to keep that up, it's hard work. But if you can do&lt;br&gt;
it, it will pay off.&lt;/p&gt;

&lt;p&gt;My hat goes off to Emma for doing it.&lt;/p&gt;

&lt;p&gt;If you want an audience too, follow &lt;em&gt;the ultimate recipe&lt;/em&gt; and you most likely&lt;br&gt;
will not blow up like Emma did, but you will for sure attract an audience that&lt;br&gt;
cares about what you have to say.&lt;/p&gt;


</description>
      <category>personalbrand</category>
      <category>marketing</category>
      <category>blogging</category>
    </item>
    <item>
      <title>TFW You Realize What Technical Debt Actually Means</title>
      <dc:creator>Kahlil Lechelt</dc:creator>
      <pubDate>Thu, 21 Feb 2019 21:57:12 +0000</pubDate>
      <link>https://dev.to/kahlil/tfw-you-realize-what-technical-debt-actually-means-9nn</link>
      <guid>https://dev.to/kahlil/tfw-you-realize-what-technical-debt-actually-means-9nn</guid>
      <description>

&lt;p&gt;A few weeks ago I set out to write a blog post about technical debt and the&lt;br&gt;
complexities of getting rid of it, or some of it, when you work for a company.&lt;/p&gt;

&lt;p&gt;I wanted to see what others had written about it and of course I landed on&lt;br&gt;
&lt;a href="https://martinfowler.com/bliki/TechnicalDebt.html"&gt;Martin Fowler's article about technical debt&lt;/a&gt;.&lt;br&gt;
When I started reading it I realized that up to that point I didn't really know&lt;br&gt;
what tech debt was.&lt;/p&gt;

&lt;p&gt;It seams that while being confronted with the eternal vastness of software&lt;br&gt;
engineering, this is what my brain does: when I hear a term for the first time&lt;br&gt;
and I can deduce its approximate meaning from context, I store it as a known&lt;br&gt;
term. Even though I don't know exactly what it is.&lt;/p&gt;

&lt;p&gt;What I deduced it to be was: "Legacy code, that makes it hard to maintain your&lt;br&gt;
code or to add features."&lt;/p&gt;

&lt;p&gt;And every time I heard or used the term "technical debt" there was a tiny little&lt;br&gt;
voice in the back of my head going: "Why is it "debt"!? I don't get it."&lt;/p&gt;

&lt;p&gt;Anyways good ol' Martin cleaned up that part of my brain and made it crystal&lt;br&gt;
clear for me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Technical Debt is a wonderful metaphor developed by Ward Cunningham to help us&lt;br&gt;
think about this problem. In this metaphor, doing things the quick and dirty&lt;br&gt;
way sets us up with a technical debt, which is similar to a financial debt.&lt;/p&gt;

&lt;p&gt;Like a financial debt, the technical debt incurs interest payments, which come&lt;br&gt;
in the form of the extra effort that we have to do in future development&lt;br&gt;
because of the quick and dirty design choice.&lt;/p&gt;

&lt;p&gt;We can choose to continue paying the interest, or we can pay down the&lt;br&gt;
principal by refactoring the quick and dirty design into the better design.&lt;br&gt;
Although it costs to pay down the principal, we gain by reduced interest&lt;br&gt;
payments in the future.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's a &lt;em&gt;metaphor&lt;/em&gt;! It is actually a term that was invented in order to explain&lt;br&gt;
consequences of sloppy coding to people in suits!&lt;/p&gt;

&lt;p&gt;Fowler goes on to write:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The metaphor also explains why it may be sensible to do the quick and dirty&lt;br&gt;
approach. Just as a business incurs some debt to take advantage of a market&lt;br&gt;
opportunity developers may incur technical debt to hit an important deadline.&lt;/p&gt;

&lt;p&gt;The all too common problem is that development organizations let their debt&lt;br&gt;
get out of control and spend most of their future development effort paying&lt;br&gt;
crippling interest payments.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thank. You. Technical debt can lead to &lt;strong&gt;crippling interest payments&lt;/strong&gt;. These&lt;br&gt;
can slow down your development teams so badly that you can't compete anymore.&lt;/p&gt;

&lt;p&gt;The term "technical debt" carries all the information you need in order to make&lt;br&gt;
the argument to company leadership why getting rid of it or keeping it at bay&lt;br&gt;
may be a wise business decision.&lt;/p&gt;

&lt;p&gt;Who knew?! 😂&lt;/p&gt;


</description>
      <category>technicaldebt</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Nested Loops Bow-Out</title>
      <dc:creator>Kahlil Lechelt</dc:creator>
      <pubDate>Wed, 06 Feb 2019 13:28:19 +0000</pubDate>
      <link>https://dev.to/kahlil/nested-loops-bow-out-5ef6</link>
      <guid>https://dev.to/kahlil/nested-loops-bow-out-5ef6</guid>
      <description>&lt;p&gt;As you may know, I am a member of the JavaScript band &lt;a href="https://nestedloops.github.io/"&gt;Nested Loops&lt;/a&gt;. We performed on the last three opening performces of &lt;a href="http://jsconf.eu/"&gt;JSConf.eu&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We will not be performing at JSConf.eu this year.&lt;/p&gt;

&lt;p&gt;It was a great honor and privilege for us to be able to do that and we are thankful for the opportunity.&lt;/p&gt;

&lt;p&gt;We produced original music for the conference and performed it in a browser. If you want, you can re-live of our performances &lt;a href="https://www.youtube.com/results?search_query=jsconf+eu+nested+loops"&gt;on YouTube&lt;/a&gt;. And you can listen to our story on the Changelog podcast &lt;a href="https://changelog.com/jsparty/52"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I have no idea if we will ever perform again at JSConf.eu or any other event.&lt;/p&gt;

&lt;p&gt;If you want to talk to us about performing at your JavaScript conference or any other event, or if you needs some original music just &lt;a href="//mailto:hello@kahlil.info"&gt;drop me an email&lt;/a&gt; or DM me on &lt;a href="https://mobile.twitter.com/kahliltweets"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>music</category>
    </item>
    <item>
      <title>How to Use Async Functions</title>
      <dc:creator>Kahlil Lechelt</dc:creator>
      <pubDate>Tue, 22 Jan 2019 10:43:02 +0000</pubDate>
      <link>https://dev.to/kahlil/how-to-use-async-functions-5gkb</link>
      <guid>https://dev.to/kahlil/how-to-use-async-functions-5gkb</guid>
      <description>&lt;p&gt;&lt;a href="http://2ality.com/2016/10/async-function-tips.html"&gt;This article&lt;/a&gt; by Dr. Axel Rauschmayer was exactly what I needed to wrap my head around how to use async functions without confusion.&lt;/p&gt;

&lt;p&gt;Because I was just using them intuitively so far and because of their synchronous style I got confused about when to &lt;code&gt;try-catch&lt;/code&gt;. I also attempted to call an async function without &lt;code&gt;await&lt;/code&gt; in front of it while using &lt;code&gt;await&lt;/code&gt; in its body, fully expecting it will be executed synchronously.&lt;/p&gt;

&lt;p&gt;It’s important to remember that the foundation of async functions is Promises.&lt;/p&gt;

&lt;p&gt;The most interesting parts of Axel’s article to me, were these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://2ality.com/2016/10/async-function-tips.html#async-functions-are-started-synchronously-settled-asynchronously"&gt;Async functions are started synchronously, settled asynchronously&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://2ality.com/2016/10/async-function-tips.html#parallelism"&gt;Parallelism&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://2ality.com/2016/10/async-function-tips.html#immediately-invoked-async-function-expressions"&gt;Immediately Invoked Async Function Expressions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>asyncawait</category>
      <category>javascript</category>
      <category>promises</category>
    </item>
  </channel>
</rss>
