<?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>Forem: Piotr Gaczkowski</title>
    <description>The latest articles on Forem by Piotr Gaczkowski (@doomhammerng).</description>
    <link>https://forem.com/doomhammerng</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%2F133494%2F46451fb5-2355-4a93-9500-1d2681323877.jpg</url>
      <title>Forem: Piotr Gaczkowski</title>
      <link>https://forem.com/doomhammerng</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/doomhammerng"/>
    <language>en</language>
    <item>
      <title>Ego-less Development: The Philosophy of Better Code</title>
      <dc:creator>Piotr Gaczkowski</dc:creator>
      <pubDate>Wed, 14 Oct 2020 15:37:35 +0000</pubDate>
      <link>https://forem.com/doomhammerng/ego-less-development-the-philosophy-of-better-code-g87</link>
      <guid>https://forem.com/doomhammerng/ego-less-development-the-philosophy-of-better-code-g87</guid>
      <description>&lt;p&gt;What is the first thing that comes to mind when you hear the word "philosophy"? Probably an image of ancient bearded guys, walking down the beach reading books, writing books, thinking about books, discussing ideas that have nothing to do with the real world.&lt;/p&gt;

&lt;p&gt;The whole idea seemed disconnected from reality. People were trying to survive: growing crops, producing food, manufacturing tools, and doing all sorts of practical things. And those guys were walking, talking and thinking about how we got there and where we're headed.&lt;/p&gt;

&lt;p&gt;But the first impression is deceptive. Philosophers focused on things that are familiar and that are close to ordinary life, like problems of logic, problems of ethics, social and political constructs. So if you ever catch yourself thinking about these concepts, you can call yourself a philosopher. It's not limited to abstract and metaphysical things. It also covers things that can happen in everyday life and in tech.&lt;/p&gt;

&lt;p&gt;Of course, philosophy isn't the first thing that comes to mind when we talk about programming. But if we look a bit deeper, we'll notice that its concepts are relevant for the tech industry too. So it's not a surprise that a lot of people who code take interest in it.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Definition of Ego
&lt;/h1&gt;

&lt;p&gt;So what is ego-less development? To understand the concept we first need to define ego.&lt;/p&gt;

&lt;p&gt;The concept of ego is more complex and multilateral and there are different definitions of what it is. Basically, the ego means self; it is what makes us - us, the driving force that makes us feel special in our own understanding and perspective.&lt;/p&gt;

&lt;p&gt;Everyone has a different view on their own "self", the one that fits in their understanding of life and the world.&lt;/p&gt;

&lt;p&gt;Another common interpretation of the ego is putting our own interests above others. It's a survival mechanism. Even though we live in a modern world, our basic needs are still driven by this instinct. We need to survive, we need to reproduce, we need to provide. Sometimes it makes us think that we need to take advantage of the others to reach our goals. This kind of ego makes us selfish.&lt;/p&gt;

&lt;p&gt;We can also understand ego as an inner critic or our internal feedback mechanism that tells us that we are going great things or bad things.&lt;/p&gt;

&lt;p&gt;What unites these interpretations is that ego is focused on the person itself, not on the others. And this can cause problems in different aspects of life, including working in tech.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DBsGGuwW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hb942ksxbgakr8c4c560.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DBsGGuwW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hb942ksxbgakr8c4c560.jpg" alt="resize_andre-mouton-GBEHjsPQbEQ-unsplash"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Problems Caused by Ego
&lt;/h1&gt;

&lt;p&gt;There are several ways that the ego can complicate software development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terrible APIs
&lt;/h2&gt;

&lt;p&gt;When an API designer has a lot of knowledge and the knowledge is paired with huge ego, curious things may happen. Using all the fancy design patterns "others should know about" may make the API so complicated noone beside the author would be able to use it. And if they won't use it, they will probably create their own solutions thus duplicating the work.&lt;/p&gt;

&lt;p&gt;That's the happy path, at least. Even worse scenario is when the team uses the terrible API in a way that causes bugs. Instead of moving the product forward, everybody is suddenly debugging.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Not Invented Here" Syndrome
&lt;/h2&gt;

&lt;p&gt;Recreating something that's already there because we know how to do it better. For example, the proliferation of different Linux distributions. Sometimes there are valid reasons to create a new software distribution and sometimes we do it because we disagree with the others and want to live with the consequences of our own choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ego Clashes
&lt;/h2&gt;

&lt;p&gt;When developers try to highlight their own contributions at the cost of teamwork and/or try to protect themselves against the doings of others. It might look like a panic mode and can harm the company, the team, and the product as the problems accumulate.&lt;/p&gt;

&lt;h2&gt;
  
  
  (Entrenched) Code Ownership
&lt;/h2&gt;

&lt;p&gt;We hear a lot that we should strive for code ownership and developers should be responsible for the code they produce. If a code has an author, then they can make sure that the code is of a good enough quality for a release. That's the good side of code ownership.&lt;/p&gt;

&lt;p&gt;But every medal has two sides. The negative side of code ownership manifests in the reluctance to accept a pull request even though it is sensible. It can happen because of personal believes and protectiveness or because the solution is simply novel.&lt;/p&gt;

&lt;p&gt;In fact, whenever someone says "We've always done it this way" it's a clear indicator of an ego play, a sign that someone feels insulted and doesn't have a better way to defend themselves.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M5xwtB96--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u05uk2xtajmlqk8pmqoj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M5xwtB96--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u05uk2xtajmlqk8pmqoj.jpg" alt="resize_micheile-henderson-VWpOwhCzPuE-unsplash"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What Philosophy is All About
&lt;/h1&gt;

&lt;p&gt;You can skip this part if you're only looking for solutions to the problems outlined above. This part is for those interested in different approaches to ego throught the culture.&lt;/p&gt;

&lt;p&gt;Let's get back to philosophy for a moment. Nowadays, with the rising popularity of AI and ML, it became more relevant as there are different problems related to ethics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stoicism
&lt;/h2&gt;

&lt;p&gt;One of the philosophies I want to mention here is stoicism. Ancient Greek and Romans practiced it. It recently got the second wave of interest thanks to the popularity among many public figures in tech and marketing. They see it as the answer to many of our problems and that it fits our cultural challenges.&lt;/p&gt;

&lt;p&gt;In my understanding, the main focus of stoicism is identifying what is and what isn't under my control. Imagine waking up today and seeing that it is cloudy outside. You are asking yourself whether it is going to rain or not, what happens if it does, how frustrated you'd be if it ruins your clothes. There is plenty of overthinking and you focus on the problems.&lt;/p&gt;

&lt;p&gt;The stoic approach to this situation would be putting on your waterproof clothes and taking an umbrella. This way you are taking control of the situation.&lt;/p&gt;

&lt;p&gt;When it comes to the perception of ego there is also this feeling of being in control.&lt;/p&gt;

&lt;p&gt;When someone calls you a poor excuse for an engineer you might feel offended. The natural thing to do would be to fight back, to argue and say "No, I'm not, I know what I'm doing, it's perfectly fine!". That's the loss of control.&lt;/p&gt;

&lt;p&gt;Stoics' approach would be to think in different terms. Ask yourself whether it is an immediate danger to our well-being and does it affect our well-being in a long-term perspective. Is it true? Is the person trustworthy? Does this opinion count? Can it hurt our status, our position? Or maybe it hurts the offender even more by showing that this person lost control and we kept our cool.&lt;/p&gt;

&lt;p&gt;Stoicism helps us to listen to our ego but question these assumptions within our heads. Identify the real threats from the perceived ones. Is it a tiger in the bushes or is it just a striped rock?&lt;/p&gt;

&lt;h2&gt;
  
  
  Soli Deo Gloria
&lt;/h2&gt;

&lt;p&gt;There is another philosophical way of thinking that has an interesting approach to the ego. Various Christian thinkers used two similar terms to express it.&lt;/p&gt;

&lt;p&gt;Soli Deo Gloria (glory to God alone) which means that we shouldn’t take credit for everything that we do. We are the part of some bigger environment and we should always consider this environment and give the credit due.&lt;/p&gt;

&lt;p&gt;For example, I've heard that Johann Sebastian Bach started signing his works with the initials SDG. When he started doing that, his work improved. He was no longer thinking about how he can show his genius to the audience, but how he helps the audience by doing his work.&lt;/p&gt;

&lt;p&gt;Jesuits used similar approach with their Ad Maiorem Dei Gloriam (which means for the greater glory of God). And we can see how it works when we look at the process of building a cathedral.&lt;/p&gt;

&lt;p&gt;Imagine going back in time a few hundred years and talking to a builder laying bricks on the construction site. We ask them about what you are doing. One builder replies "Oh, don't even ask. I'm laying bricks the whole day in the heat, in the rain, in the wind, in the snow, the work is endless. We'll never finish during my lifetime. People show us no gratitude and are always yelling at us. But I have to do this because I have a family and I need to support them."&lt;/p&gt;

&lt;p&gt;Then another says "We are building a cathedral, which is going to be the most spectacular thing you've ever seen. It will be magnificent! I won't live long enough to see it finished but believe me, the future generations will think that we did extraordinary work. I love it."&lt;/p&gt;

&lt;p&gt;So what's the difference in these two approaches? The first approach is ego-driven. It revolves around what that person can get from this work. The second approach considers a bigger picture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zen
&lt;/h2&gt;

&lt;p&gt;Not forget to mention Buddhism and Zen philosophies and the belief systems of the East in general. In Western culture, people usually like to practice individualism. We believe that we are special, chosen ones to do great things, that is "I" who should be the most important person in the room. In Eastern culture, the focus is more on the collective, on how a person can contribute to the community, their family, their town, their country.&lt;/p&gt;

&lt;p&gt;In Buddhism, there is the focus on feeling and being a part of a greater universe. It's not how I can approach things as an individual, but how I can make myself disappear and become a part of the universe.&lt;/p&gt;

&lt;p&gt;And the final philosophy worth mentioning is DevOps. DevOps has different meanings and different definitions, but for me, it's something akin to philosophy or to culture, the way we do things.&lt;/p&gt;

&lt;p&gt;Look at closing the gap between the client and development, short release cycles, iterative approach to design and reduction of waste. All these things have something in common. They come together because to achieve them we need to build a better communication framework.&lt;/p&gt;

&lt;p&gt;We need to be a part of one collective. We can't separate clients and developers. We are building something we can all benefit from. With open communication and shared goals we come to the most important requirement - that we put our ego aside. We have to stop thinking about personal benefits for a moment and think about how we can be more involved and be part of a bigger ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---iiKO5_t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hwwg3m069rlko1m5dp1i.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---iiKO5_t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hwwg3m069rlko1m5dp1i.jpg" alt="resize_freddie-marriage-wofDw8uqX6I-unsplash"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  How Ego Disrupts DevOps
&lt;/h1&gt;

&lt;p&gt;You know the problems that come with ego, so how they affect the DevOps practitioners?&lt;/p&gt;

&lt;p&gt;Inadequate APIs become a source of waste. When you have to look up documentation instead of focusing on more important things, there are more chances to mess things up. And once you've messed it up and the things are in production, the cost of mistakes increases. So APIs should be easy to use and hide the complexities inside, not the other way around.&lt;/p&gt;

&lt;p&gt;"Not Invented Here" syndrome is an obvious source of waste. Instead of focusing on delivering a good product, you try to prove somebody else that you are better and more capable.&lt;/p&gt;

&lt;p&gt;Ego clashes also present different sources of waste. Everyone on the team focuses on making their part of the job feel more important. That wastes energy and time put into product creation. It may as well lead to decay of a culture, which means problems with efficiency and collaboration.&lt;/p&gt;

&lt;p&gt;Entrenched code ownership can lead to "Not Invented Here" syndrome and reduce your bus factor to one. The bus factor is an idea, that illustrates code ownership limitations. How many people have to get hit by a metaphorical bus until there is nobody who knows how your project works? If there is only one person who has all the information and they get hit by a metaphorical bus (which usually means a change of employer), you are left with nothing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--REOrF4xu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kyal1tgjqn8jksd717nr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--REOrF4xu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kyal1tgjqn8jksd717nr.jpg" alt="resize_anna-samoylova-w55SpMmoPgE-unsplash"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Cultural Tools for Ego-less Development
&lt;/h1&gt;

&lt;p&gt;First of all, you need to create a culture. There are 3 pillars of a strong team culture: safety, vulnerability, and a shared future.&lt;/p&gt;

&lt;p&gt;A great culture emerges when people know they are safe, when people share their vulnerabilities, their problems and challenges with each other and when they share some future that they know will get better with time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduce Formal Processes
&lt;/h2&gt;

&lt;p&gt;Unlike bureaucracy, formal processes can help people feel less lost. It should be a logical extension of the culture you are cultivating. You don't need to force it, but there should be a natural progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Familiarity
&lt;/h2&gt;

&lt;p&gt;Another cultural tool is doing code reviews. People are getting familiar with the code they are producing and everyone knows what's happening beyond the features they are working on.&lt;/p&gt;

&lt;p&gt;And pair programming is a good opportunity to leave the ego aside and focus on how to improve the product.&lt;/p&gt;

&lt;p&gt;Once everything is familiar and once everyone knows what they are doing, it makes it much easier to work on the product.&lt;/p&gt;

&lt;h1&gt;
  
  
  Software Tools
&lt;/h1&gt;

&lt;p&gt;I focused on examples in Python because it's the language that is closest to my heart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linters (PyLint)
&lt;/h2&gt;

&lt;p&gt;Check your code to see whether it contains any known bugs. If you can see them by reading the code, you can focus on the code quality instead of searching for mistakes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code formatters (YAPF, Black)
&lt;/h2&gt;

&lt;p&gt;It takes code and formats it according to the given standard to maintain consistency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aux tools (PyAnnotate and MyPy)
&lt;/h2&gt;

&lt;p&gt;They help you create better interfaces, check APIs, and find errors before your clients do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Git Hooks
&lt;/h2&gt;

&lt;p&gt;You can run it whenever you do an action in GitHub or run them locally. They would check all the tests even before you push the main repository. After that, the continuous integration process would check the changes and finally your peers will get a request for the code review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automated Build Scripts (Makefiles)
&lt;/h2&gt;

&lt;p&gt;You can reduce your Continuous Integration/Continuous Delivery pipeline to calling &lt;code&gt;make build&lt;/code&gt;, &lt;code&gt;make deploy&lt;/code&gt;, &lt;code&gt;make test&lt;/code&gt;, &lt;code&gt;make whatever&lt;/code&gt;. This way, you can reproduce the same steps on any machine - developer machines, QA machines, CI workers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Opinionated Frameworks
&lt;/h2&gt;

&lt;p&gt;It's hard to make your team understand why they need to use this opinionated framework instead of a different oneBut once you do, you'll be happy that someone has already made some choices for you and you don’t have to sweat about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Behavior-Driven Development
&lt;/h2&gt;

&lt;p&gt;Instead of writing tests to determine if the code behaves correctly, first try to decide with your client what is it that they are trying to achieve with this piece of code. BDD also encourages communication between different stakeholders and brings everyone on board.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;These are some of my observations about the ego in play in software development. Where possible I also proposed some solutions and workarounds that could make it easier for the entire teams to own the codebase.&lt;/p&gt;

&lt;p&gt;But each of us has probably some ego-related horror stories as well. Share your own in the comments!&lt;/p&gt;

&lt;p&gt;Images courtesy of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;span&gt;&lt;a href="https://unsplash.com/@alexblock?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Alex Block&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href="https://unsplash.com/@andremouton?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Andre Mouton&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href="https://unsplash.com/@micheile?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Micheile Henderson&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href="https://unsplash.com/@fredmarriage?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;freddie marriage&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href="https://unsplash.com/@hagalnaud?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Anna Samoylova&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>culture</category>
      <category>productivity</category>
      <category>development</category>
    </item>
    <item>
      <title>Command Line Tools for Developers</title>
      <dc:creator>Piotr Gaczkowski</dc:creator>
      <pubDate>Tue, 25 Aug 2020 14:17:15 +0000</pubDate>
      <link>https://forem.com/doomhammerng/command-line-tools-for-developers-34j6</link>
      <guid>https://forem.com/doomhammerng/command-line-tools-for-developers-34j6</guid>
      <description>&lt;p&gt;In today's online world, the battle to attract users continues to rage on, with app makers preferring either mobile or web apps. Desktop applications are becoming less and less relevant. Moreover, they also tend to be nothing more than rich clients to web apps—Electron being the popular platform of choice.&lt;/p&gt;

&lt;p&gt;Does this mean we will soon abandon the desktop as a platform? No, of course not, I wouldn't say that. Besides, while GUI apps seem to have been stalling recently, there is a segment of desktop apps that continues to grow.&lt;/p&gt;

&lt;p&gt;Have you ever seen any movie featuring hackers? More often than not, these people are shown working in front of monitors displaying some sort of terminal (usually with a dark background and light foreground). This terminal, in turn, tends to be flooded with passing characters that apparently have some meaning to the person watching them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ECQunBiG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u6e913ls6mgdmebd1wb7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ECQunBiG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u6e913ls6mgdmebd1wb7.jpg" alt="Illustration: command line tools and hacking look cooler in the movies than in real life"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Such representations of hackers in action are often mocked by professional developers, and there are even some programs that simulate various "hacker" effects, just for fun.&lt;/p&gt;

&lt;p&gt;However, in the real world, command line tools aren't used for their entertainment value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Still Use Command Line Interface Tools
&lt;/h2&gt;

&lt;p&gt;This article focuses on the practical side of using command line interface (CLI) tools. Knowing CLI commands and using quality tools can make you more productive and can also open doors to various approaches to automation that are far more practical with textual interfaces than with GUI apps.&lt;/p&gt;

&lt;p&gt;You can get better at doing repetitive tasks in GUI, to the point that your multiple clicks are heard as a single long one. The problem is, this still won't beat the efficiency of a specialized script. What's more, performing the same operations manually introduces both an added cognitive load and the increased possibility of human error. As usual, we rely on computers to handle tasks humans may find boring, repetitive, or overwhelming.&lt;/p&gt;

&lt;p&gt;It is worth knowing that a terminal tool can offer several types of interfaces. There are non-interactive ones like &lt;a href="https://en.wikipedia.org/wiki/Ls"&gt;ls&lt;/a&gt;, which simply take the parameters and provides the output. There are interactive or semi-interactive interfaces most often found in package managers. ("Are you sure you want to proceed with the installation from unverified source?") Then, there are textual user interfaces (TUIs), which are interactive GUI apps designed to fit the limitations of a terminal. Probably the most famous one is &lt;a href="https://en.wikipedia.org/wiki/Midnight_Commander"&gt;Midnight Commander&lt;/a&gt; (mc), a clone of extremely popular (in the 90s) &lt;a href="https://en.wikipedia.org/wiki/Norton_Commander"&gt;Norton Commander&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Essential Command Line Tools
&lt;/h2&gt;

&lt;p&gt;If you want to become a console dweller, you need to equip yourself with a minimum set command line developer tools—the bare essentials. Things you most definitely can't live without are an interactive shell (aim for something modern with convenient tab-completion) and a text editor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8A-u4LvE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s1awdckqtlnq0n7z6qq8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8A-u4LvE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s1awdckqtlnq0n7z6qq8.jpg" alt="Illustration: essential command line tools"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, I will mention the &lt;a href="http://homepage.cs.uri.edu/~thenry/resources/unix_art/ch01s06.html"&gt;&lt;em&gt;UNIX philosophy&lt;/em&gt;&lt;/a&gt;, which is often the foundation behind design decisions made by the tool's authors, whether consciously or not. Some of the key points can be summed up as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Treat everything as a file.&lt;/li&gt;
&lt;li&gt;  Do only one thing, but do it well.&lt;/li&gt;
&lt;li&gt;  Read from standard input, write to standard output, and communicate errors to a standard error stream.&lt;/li&gt;
&lt;li&gt;  When succeeded, return code 0. A non-zero value means an error (which can be specified by the exact return code).&lt;/li&gt;
&lt;li&gt;  Allow for command chaining and scripting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Shell
&lt;/h3&gt;

&lt;p&gt;The first thing you see when opening a terminal is a shell. This is the part that makes the interaction between the user and the machine possible. It interprets your commands, splits them into program names and arguments, and executes all shell commands you throw at it.&lt;/p&gt;

&lt;p&gt;Historically, there have been many different kinds of shells. Among the most popular ones were csh (C Shell) and various implementations of the Bourne Shell (usually known simply as sh). Bourne Shell got extended into Korn Shell which also gained some traction and is still being used by its enthusiasts. Csh is currently the default shell on some BSD systems, while almost all other UNIX-like operating systems prefer some kind of a Bourne Shell. Linux distributions tend to favor &lt;a href="https://www.gnu.org/software/bash/"&gt;bash&lt;/a&gt; while Mac OS X comes with &lt;a href="http://www.zsh.org/"&gt;zsh&lt;/a&gt; as the default choice.&lt;/p&gt;

&lt;p&gt;There are other possibilities out there, but they are far less popular, except Microsoft &lt;a href="https://en.wikipedia.org/wiki/PowerShell"&gt;PowerShell&lt;/a&gt; on Windows systems. PowerShell is inspired in part by the interactive UNIX shells such as zsh and in part by the .NET runtime. Instead of treating everything as text, a concept common in UNIX world, it allows for object-oriented manipulation of data.&lt;/p&gt;

&lt;p&gt;Even though Microsoft PowerShell is quite popular in the Windows realm, many programs with UNIX origins (most notable being Git, Autotools, or Make) tend to prefer some variation of Bourne Shell. Because of this, projects such as &lt;a href="http://www.mingw.org/wiki/msys"&gt;msys&lt;/a&gt; (bundled with Git for Windows), &lt;a href="http://www.cygwin.com/"&gt;Cygwin&lt;/a&gt;, or Microsoft's recent &lt;a href="https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux"&gt;WSL&lt;/a&gt; were born. If you want a Linux-like feeling on Windows, MSys is the best choice here. If you want a full-featured Linux environment able to run standard Linux binaries, then WSL is the way to go. For something in between—UNIX API but compiled as a Windows executable (only use it when you actually know why you need this)—Cygwin is the answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Editor
&lt;/h3&gt;

&lt;p&gt;Once you get acquainted with your shell, you will want to pick up some useful skills. As most of the coding work revolves around writing text (code, READMEs, commit messages), a good knowledge of interactive text editors is essential. There are many to choose from, and since an editor is one of the most necessary tools for any developer, there are probably just as many opinions on which editor is best.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dwe7WlO4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/z10dva07in5odbgok5pl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dwe7WlO4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/z10dva07in5odbgok5pl.jpg" alt="Illustration: a command-line editor has a simple interface"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most popular text editors can be separated into two basic groups: Simple text editors and programmable text editors.&lt;/p&gt;

&lt;p&gt;Both can be great for writing code, but, as the name suggests, the programmable ones offer the ability to shape and customize the editor to perfectly suit your needs. This comes at a price, though, as they also tend to have a steeper learning curve and may require more time to set up.&lt;/p&gt;

&lt;h4&gt;
  
  
  BASIC TEXT EDITORS
&lt;/h4&gt;

&lt;p&gt;Among the simple text editors, &lt;a href="https://www.nano-editor.org/"&gt;GNU Nano&lt;/a&gt; is the most widespread. Actually, it is a clone of the &lt;a href="https://en.wikipedia.org/wiki/Pico_%28text_editor%29"&gt;pico&lt;/a&gt; editor, so if one is not available on your system, you can try the other. Another, more modern, alternative to both is the &lt;a href="https://micro-editor.github.io/"&gt;micro&lt;/a&gt; editor. If you want something simple and extensible at the same time, this one is a good place to start.&lt;/p&gt;

&lt;h4&gt;
  
  
  PROGRAMMABLE TEXT EDITORS
&lt;/h4&gt;

&lt;p&gt;Many developers rely on programmable editors from different camps, such as &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; and &lt;a href="https://www.gnu.org/software/emacs/"&gt;GNU Emacs&lt;/a&gt;. Both editors can run in the console or in GUI mode, and both had an impact on the key bindings found in other software. They both offer not only an API but also actual programming languages built-in. Emacs focuses on LISP and Vim uses its own VimL, but it also offers interfaces to other popular scripting languages (like Lua, Perl, Python, or Ruby). A more recent approach to Vim, called &lt;a href="https://neovim.io/"&gt;Neovim&lt;/a&gt;, is also worth mentioning, as it is starting to get a serious following.&lt;/p&gt;

&lt;p&gt;It may be somewhat confusing, but there is also an editor called &lt;a href="https://en.wikipedia.org/wiki/Vi"&gt;vi&lt;/a&gt; which is a predecessor of Vim (which, incidentally, stands for "Vi improved"). It is much simpler than Vim, but if you have enough confidence to write in Vim, it should not be a challenge to you if you find yourself needing to use vi.&lt;/p&gt;

&lt;p&gt;Since pico/GNU Nano and vi/Vim are usually preinstalled on various systems, it is a good idea to at least grasp their basics (quitting Vim is a notoriously hard problem for beginners). This way, if you need to edit something on a remote machine, you will be ready regardless of what editor is already there. On your private device, feel free to use any editor you find the most comfortable.&lt;/p&gt;

&lt;h4&gt;
  
  
  DEFAULT SYSTEM EDITOR
&lt;/h4&gt;

&lt;p&gt;One last thing to note is that your system may have what is called a &lt;em&gt;default editor&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;$EDITOR&lt;/code&gt; environment variable points to the default editor and in Bourne-compatible shells (sh, bash, ksh, zsh) you can see it by entering &lt;code&gt;echo $EDITOR&lt;/code&gt;. If the value differs from your personal choice, you can set it yourself by adding &lt;code&gt;export EDITOR=my-awesome-editor&lt;/code&gt; to your shell's runtime configuration (&lt;code&gt;~/.profile&lt;/code&gt;, &lt;code&gt;~./bashrc&lt;/code&gt;, &lt;code&gt;~/.zshrc&lt;/code&gt;, and so on).&lt;/p&gt;

&lt;p&gt;Other programs, such as version control systems and mail clients, will use this editor when they need longer text input.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multiplexer
&lt;/h3&gt;

&lt;p&gt;As soon as you start doing serious stuff in CLI, you will encounter the limitation of being able to keep only one application open at any given time. When coding, you may want to edit the code, execute it, fix the mistakes, and execute again. When looking for a bug, you may want to list logs and see what gets logged when you send a request to the server. Typically, this would either mean switching between the two applications constantly or opening several terminal windows.&lt;/p&gt;

&lt;p&gt;This is where a terminal multiplexer can help you. When speaking of multiplexers, some people immediately assume the topic to be of &lt;a href="https://www.gnu.org/software/screen/"&gt;GNU Screen&lt;/a&gt;. It was the first widespread tool of its kind and is still very popular today (often being installed by default). Its modern replacement is &lt;a href="https://github.com/tmux/tmux/wiki"&gt;tmux&lt;/a&gt; which, unsurprisingly, stands for "terminal multiplexer."&lt;/p&gt;

&lt;p&gt;These two allow you to have more than one window open in a given terminal session and switch between those sessions freely. They allow you to split the windows into panes, which helps running several applications at the same time and observing their output in real time (without switching any windows). Also, they work in a client-server mode, which means you can detach them at any given time and come back later to continue the work just where you left off. This last feature led to Screen's popularity when people wanted persistent &lt;a href="https://en.wikipedia.org/wiki/Internet_Relay_Chat"&gt;IRC&lt;/a&gt; sessions.&lt;/p&gt;

&lt;p&gt;For most use cases, GNU Screen or tmux should be great for you, but if for some reason you would consider them to be too heavy on resources, there are also lighter alternatives. There's &lt;a href="http://dtach.sourceforge.net/"&gt;dtach&lt;/a&gt;/&lt;a href="https://github.com/sorin-ionescu/atach"&gt;atach&lt;/a&gt; and there's &lt;a href="http://www.brain-dump.org/projects/abduco/"&gt;abduco&lt;/a&gt;. They are limited in scope on purpose but can perform their respective duties well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Package Manager
&lt;/h3&gt;

&lt;p&gt;At this point, you may start thinking about getting all the aforementioned software installed on your machine. One problem is that each of the tools has different installation instructions. Sometimes, you need to download sources and compile them yourself, sometimes you get the self-contained binary, and sometimes you get what is called a binary package, which usually means an executable compressed together with some metadata.&lt;/p&gt;

&lt;p&gt;To ease the process of installing software, operating systems creators came with a concept of package managers. Put simply, a package manager is like an app store for CLI and desktop apps. It precedes actual app stores by some decades. The problem is that almost every system has its own package manager. Debian, Ubuntu, and derived GNU/Linux distributions use APT, Red Hat-based distributions prefer yum or DNF, other Linux distros have more exotic means of installing software and so does different BSD clones. Besides built-in package managers, there are also user-installed ones like &lt;a href="https://chocolatey.org/"&gt;Chocolatey&lt;/a&gt; for MS Windows and &lt;a href="https://brew.sh/"&gt;Homebrew&lt;/a&gt; for Mac OS X/macOS. When you want to write instructions on how to install your program, you may end up writing cases for each of those systems. Seems like a bit too much, doesn't it?&lt;/p&gt;

&lt;p&gt;Fortunately the last of the mentioned systems, Homebrew, may be the most portable one. It works on Mac, on Linux, and it even works on WSL if you want to have a similar user experience on Microsoft Windows.&lt;/p&gt;

&lt;p&gt;So, besides portability, what else can Homebrew offer? First of all, it does not interfere with the system packages, so everything you install resides on a separate layer to the operating system. Besides, no root permissions are usually needed to install packages. You can, therefore, have system packages which are stable and tested but at the same time check their newer versions without sacrificing the stability of the system.&lt;/p&gt;

&lt;p&gt;If you wanted to test the editors, I mentioned earlier that all you need to do on a system with either Homebrew is to run this command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;brew install emacs micro nano vim neovim&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Shiny Stuff
&lt;/h2&gt;

&lt;p&gt;What we have already discussed is undoubtedly useful for work. But there are also applications that, while not necessary, still bring comfort to everyday life. You may not need them, but it is always worth to know them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interactive Filter
&lt;/h3&gt;

&lt;p&gt;Searching the command history can be tedious. While both bash and zsh feature Ctrl+R keybinding, it only shows one substitution at a time. What is more, you need to enter the exact text that you used before. Since this is quite a common operation, once you start using the command line, it looks like a fine place for improvement.&lt;/p&gt;

&lt;p&gt;Interactive filters, like &lt;a href="https://github.com/jhawthorn/fzy"&gt;fzy&lt;/a&gt;, &lt;a href="https://github.com/mooz/percol"&gt;percol&lt;/a&gt;, &lt;a href="https://github.com/peco/peco"&gt;peco&lt;/a&gt; or &lt;a href="https://github.com/junegunn/fzf"&gt;fzf&lt;/a&gt; help you with filtering long lines of text. This can either be the aforementioned command history, all the lines of code in a project directory, or a list of filenames generated by &lt;code&gt;find .&lt;/code&gt;. The general idea here is to present you first with all the lines available and then rely on fuzzy finding algorithms to filter out everything that doesn't match.&lt;/p&gt;

&lt;p&gt;For example, binding Ctrl+R to fzf shows you a list of the most recent commands, which you can navigate up and down using arrows, or you can type &lt;code&gt;git&lt;/code&gt; to only show commands that feature Git somewhere inside. Personally, when I work with a shell that does not have an interactive filter, I feel suddenly a little bit lost. This feature is really compelling!&lt;/p&gt;

&lt;p&gt;Plus, you can make your interactive filter available inside your programmable text editor. This way, you will have unified searching capabilities between your shell and your editor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interactive Navigator
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://facebook.github.io/PathPicker/"&gt;Facebook PathPicker&lt;/a&gt; was a great help when I was working mostly with C++ projects. The error log generated by the compiler can get pretty big and pretty nasty, and the ability to find the actual paths inside that log was a productivity boon.&lt;/p&gt;

&lt;p&gt;In any given text file, or the content of your screen when used with &lt;a href="https://github.com/tmux-plugins/tmux-fpp"&gt;tmux&lt;/a&gt;, fpp filters everything but the file paths. It then presents a UI where you can select one or more of those paths and run a command with them. The most common response would be to open the files in an editor, of course, which is the default action.&lt;/p&gt;

&lt;h3&gt;
  
  
  Git UI
&lt;/h3&gt;

&lt;p&gt;Chances are at least one of the projects you work on uses &lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt; as a version control system. While being entirely powerful, the Git CLI is not the pinnacle of excellent user experience. To save you some stress reading through all the options in the Git help &lt;code&gt;$SUBCOMMAND&lt;/code&gt;, I recommend that you check out &lt;a href="https://jonas.github.io/tig/"&gt;tig&lt;/a&gt;. It offers a nice console UI for the operations that benefit from it, like &lt;code&gt;log&lt;/code&gt; or &lt;code&gt;blame&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Another tool that aims to help GIt users is &lt;a href="https://github.com/mkchoi212/fac"&gt;fac&lt;/a&gt;, which is an acronym for &lt;em&gt;Fix All Conflicts&lt;/em&gt;. As you might have guessed, it comes in handy when you run into conflicts while doing merges or rebases. It's an alternative to other merge tools like vimdiff.&lt;/p&gt;

&lt;h3&gt;
  
  
  File Manager
&lt;/h3&gt;

&lt;p&gt;There was a time in the 90s when everybody wanted a two-pane file manager. The trend started with &lt;a href="https://en.wikipedia.org/wiki/Norton_Commander"&gt;Norton Commander&lt;/a&gt;. Many others followed the same path, but the one that still sees a stable user base is &lt;a href="https://en.wikipedia.org/wiki/Midnight_Commander"&gt;Midnight Commander&lt;/a&gt;. The most obvious use case is using mc to manipulate local files, but it's also very useful when working with remote machines.&lt;/p&gt;

&lt;p&gt;Like most command-line programs, it's very lightweight, so there is no problem running it over ssh and thanks to supporting FTP and FISH protocols, you can have a local file system visible in one pane and the remote one in the other—a convenient feature when you want to avoid typing or copying files names as arguments to scp.&lt;/p&gt;

&lt;h2&gt;
  
  
  CLI Tools Just for Fun
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;"All work and no play makes Jack a dull boy,"&lt;/em&gt; they say. There are a lot of programs, command line and otherwise, that only serve your amusement. The &lt;a href="https://en.wikipedia.org/wiki/Rogue_%28video_game%29"&gt;Rogue&lt;/a&gt; video game falls into this category. It even gave name to the whole genre of games! Other popular toys are &lt;a href="https://en.wikipedia.org/wiki/Fortune_%28Unix%29"&gt;fortune&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Cowsay"&gt;cowsay&lt;/a&gt;, which can make your day a bit less dull if you use them somewhere in your CI scripts, for example.&lt;/p&gt;

&lt;p&gt;But for some of us, the main appeal of using a console in the first place is to feel like a hacker in the movies. &lt;a href="https://github.com/bartobri/no-more-secrets"&gt;No More Secrets&lt;/a&gt; and &lt;a href="https://github.com/Hypfer/hollywood-hacker"&gt;Hollywood Hacker&lt;/a&gt; represent this group well. Try it when somebody's watching you work, and your hacker cred is certain to rise!&lt;/p&gt;

&lt;h2&gt;
  
  
  Command Line in Practice
&lt;/h2&gt;

&lt;p&gt;So, what is so appealing about the command line that offsets the hours spent learning how to use the shell, the editor, and all the switches of various apps? The short answer is productivity, which comes from two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;One is that when you are presented with only a terminal window and nothing more, you can focus more intensely, as there is not much to distract you. No notifications popping up, no ads, no pictures of pretty kittens. Just you and your goal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The second thing is automation. You can put several frequently combined actions in a script and call it later as a whole instead of typing them all by hand each time. You can quickly get back to a particularly complex command you once wrote by searching through your shell's history. Basically, you can record and replay anything, and the code is available as a documentation of what you did.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The ability to add aliases also contributes to the gains. For example, I find myself often crafting commits in Git by updating the same one until it's perfect (for the moment). Once I stage the desired files, I run &lt;code&gt;git carmh&lt;/code&gt;. Don't try to look it up in the manual, as it is my private alias meaning &lt;code&gt;commit --amend --reuse-message=HEAD&lt;/code&gt;. It saves some typing for sure.&lt;/p&gt;

&lt;p&gt;Thing is, people get bored repeating the same actions over and over, and boredom reduces focus. This can lead to mistakes and errors. The only way to avoid them is not to interlace high-focus and low-focus actions. Writing code is high-focus and reviewing a commit message and contents is high-focus, but when you need to repeat several mechanical clicks here and there to get to the stage of commit review, chances are your focus is lowered. Command line isn't, of course, free of such mechanical activities, but thanks to automation, you can avoid most of them.&lt;/p&gt;

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

&lt;p&gt;You may already have been aware of some or all command line tools mentioned in this article. You may have learned something new and useful while reading it. If so, excellent---my aim here was not to offer a comprehensive overview and comparison of different tools, but to demonstrate a few crucial tools that I have found helpful in my daily work, in the hopes that you might find some of them useful, too.&lt;/p&gt;

&lt;p&gt;There are far more interesting command line programs out there, and if you are interested in them, I recommend checking the &lt;a href="https://github.com/alebcay/awesome-shell"&gt;Awesome Shell&lt;/a&gt; curated list of some of the best command line tools available today.&lt;/p&gt;

&lt;p&gt;Most of the GUI apps have their terminal counterpart. That includes web browsers, email clients, chat clients (IRC, Slack, XMPP), PIM suites, or spreadsheets. If you know of any good programs that I haven't mentioned, please bring them up in comments.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://www.toptal.com/software/best-command-line-tools"&gt;https://www.toptal.com/software/best-command-line-tools&lt;/a&gt;&lt;/p&gt;

</description>
      <category>codenewbie</category>
      <category>terminal</category>
      <category>productivity</category>
      <category>linux</category>
    </item>
    <item>
      <title>A master list of Pluralsight courses that will jumpstart your career</title>
      <dc:creator>Piotr Gaczkowski</dc:creator>
      <pubDate>Thu, 20 Aug 2020 18:46:29 +0000</pubDate>
      <link>https://forem.com/doomhammerng/a-master-list-of-pluralsight-courses-that-will-jumpstart-your-career-22oj</link>
      <guid>https://forem.com/doomhammerng/a-master-list-of-pluralsight-courses-that-will-jumpstart-your-career-22oj</guid>
      <description>&lt;p&gt;One of the biggest mistakes in life that you can do is stop learning. With the rapid technological development and progress, new trends emerge just as fast as the information gets outdated. If you want to stay relevant in your career, you need to keep up to date. And it doesn't apply solely for tech professionals - almost every industry is changing as you read this.&lt;/p&gt;

&lt;p&gt;This is why I am such a huge fan of &lt;a href="https://www.pluralsight.com/offer/2020/33-off-q3?clickid=QDUy8ey3ixyORJPwUx0Mo3EWUkiQ3DQdGRJR2s0&amp;amp;irgwc=1&amp;amp;mpid=1383508&amp;amp;aid=7010a000001xAKZAA2&amp;amp;utm_medium=digital_affiliate&amp;amp;utm_campaign=1383508&amp;amp;utm_source=impactradius"&gt;Pluralsight&lt;/a&gt; (Disclosure: I get commissions for purchases made through links in this article). For the past two years, I've been using it both to learn and create. And I've been very happy with it - they select the best speakers and high-quality courses, you can get it at the price of a Netflix Premium account and the community support is outstanding. .&lt;/p&gt;

&lt;p&gt;Some of my peers asked for recommendations, so I've combined my favorite courses into one list. But first of all, I wanted to clarify one thing: Pluralsight offers more than just technical courses. This is a popular misconception, but you can find courses on a career change, marketing, leadership among the others.&lt;/p&gt;

&lt;p&gt;Want to learn &lt;a href="https://www.pluralsight.com/courses/managing-product-marketing?clickid=QDUy8ey3ixyORJPwUx0Mo3EWUkiQ3BSNGRJR2s0&amp;amp;irgwc=1&amp;amp;mpid=1383508&amp;amp;aid=7010a000001xAKZAA2&amp;amp;utm_medium=digital_affiliate&amp;amp;utm_campaign=1383508&amp;amp;utm_source=impactradius"&gt;Product Marketing&lt;/a&gt;? You're covered with this course by &lt;a href="https://www.linkedin.com/jillian-kaplan"&gt;Jillian Kaplan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Not a marketing person? Maybe &lt;a href="https://www.pluralsight.com/courses/product-management-executive-briefing?clickid=QDUy8ey3ixyORJPwUx0Mo3EWUkiQ3G15GRJR2s0&amp;amp;irgwc=1&amp;amp;mpid=1383508&amp;amp;aid=7010a000001xAKZAA2&amp;amp;utm_medium=digital_affiliate&amp;amp;utm_campaign=1383508&amp;amp;utm_source=impactradius"&gt;Product Management&lt;/a&gt; is your thing? Here is another good one by &lt;a href="https://www.linkedin.com/jillian-kaplan"&gt;Jillian Kaplan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There's something for the writing community as well. This course by &lt;a href="https://twitter.com/AlanAckmann"&gt;Alan Ackmann&lt;/a&gt; highlights the &lt;a href="https://www.pluralsight.com/courses/resumes-research-writing-job-hunt"&gt;importance of writing for job hunting&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One of my favorite authors on the platform is &lt;a href="https://www.linkedin.com/in/JasonAlba"&gt;Jason Alba&lt;/a&gt;. If you're searching for a job, his course on &lt;a href="https://www.pluralsight.com/courses/seminar-job-search-career?clickid=QDUy8ey3ixyORJPwUx0Mo3EWUkiQ3D2JGRJR2s0&amp;amp;irgwc=1&amp;amp;mpid=1383508&amp;amp;aid=7010a000001xAKZAA2&amp;amp;utm_medium=digital_affiliate&amp;amp;utm_campaign=1383508&amp;amp;utm_source=impactradius"&gt;Job Search and Career&lt;/a&gt; might be just what you need.&lt;/p&gt;

&lt;p&gt;Want to learn how and why &lt;a href="https://www.pluralsight.com/courses/ux-research-conducting"&gt;UX Research&lt;/a&gt; can help you create intuitive and delightful experiences? &lt;a href="https://www.linkedin.com/in/krispian/"&gt;Krispian Emert&lt;/a&gt; has all the answers.&lt;/p&gt;

&lt;p&gt;Maybe &lt;a href="https://www.pluralsight.com/courses/getting-started-ux-design"&gt;UX Design&lt;/a&gt; is more suitable for you? Learn what UX designers do, how they do it, and how you can get started in the field from &lt;a href="https://www.linkedin.com/in/kkrumme/"&gt;Kurt Krumme&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Speaking of design, there's an entire &lt;a href="https://www.pluralsight.com/paths/photoshop-photo-manipulation"&gt;path dedicated to Photoshop&lt;/a&gt;. Even if you're an expert, you may still be surprised by some of its contents.&lt;/p&gt;

&lt;p&gt;When you already know design, the next step might be to &lt;a href="https://www.pluralsight.com/courses/html-css-javascript-getting-started-building-websites"&gt;create a working Website&lt;/a&gt; from scratch. &lt;a href="https://twitter.com/craigshoemaker"&gt;Craig Shoemaker&lt;/a&gt; will be your guide on this journey.&lt;/p&gt;

&lt;p&gt;Want to go deeper? Why not try &lt;a href="https://www.pluralsight.com/courses/styling-websites-css?clickid=QDUy8ey3ixyORJPwUx0Mo3EWUkiQ3AQdGRJR2s0&amp;amp;irgwc=1&amp;amp;mpid=1383508&amp;amp;aid=7010a000001xAKZAA2&amp;amp;utm_medium=digital_affiliate&amp;amp;utm_campaign=1383508&amp;amp;utm_source=impactradius"&gt;creating stylesheets and adding style rule&lt;/a&gt;s using different types of CSS selectors with &lt;a href="https://www.linkedin.com/in/susansimkins"&gt;Susan Simkins&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Interested in &lt;a href="https://www.pluralsight.com/courses/motion-design-css?clickid=QDUy8ey3ixyORJPwUx0Mo3EWUkiQ3F0VGRJR2s0&amp;amp;irgwc=1&amp;amp;mpid=1383508&amp;amp;aid=7010a000001xAKZAA2&amp;amp;utm_medium=digital_affiliate&amp;amp;utm_campaign=1383508&amp;amp;utm_source=impactradius"&gt;animation&lt;/a&gt;? Try making some cute moving things with &lt;a href="https://twitter.com/@rachelnabors"&gt;Rachel Nabors. &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you handle the basics you may want to find some frameworks. On the frontend, you can choose between the most popular ones: &lt;a href="https://www.pluralsight.com/courses/angular-2-getting-started-update"&gt;Angular&lt;/a&gt; by &lt;a href="https://twitter.com/@DeborahKurata"&gt;Deborah Kurata&lt;/a&gt; or &lt;a href="https://www.pluralsight.com/courses/react-js-getting-started"&gt;React&lt;/a&gt; by &lt;a href="https://www.linkedin.com/in/samerbuna"&gt;Samer Buna&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Frontend is not your cup of tea? Well, maybe backend with &lt;a href="https://www.pluralsight.com/courses/python-best-practices-code-quality"&gt;Python&lt;/a&gt; and &lt;a href="https://www.pluralsight.com/courses/django-getting-started"&gt;Django&lt;/a&gt; with code sensei &lt;a href="https://nl.linkedin.com/in/rjekker/"&gt;Reindert-Jan Ekker&lt;/a&gt; then?&lt;/p&gt;

&lt;p&gt;Having a Web application ready you'll want to deploy it somewhere. Check out whether &lt;a href="https://www.pluralsight.com/courses/docker-kubernetes-big-picture"&gt;Docker or Kubernetes&lt;/a&gt; is a way to go by&lt;a href="https://twitter.com/nigelpoulton"&gt; Nigel Poulton&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;While we're at it, before you start growing, it may help to get some &lt;a href="https://www.pluralsight.com/courses/devops-big-picture"&gt;DevOps Fundamentals&lt;/a&gt;. Learn with &lt;a href="https://twitter.com/rseroter"&gt;Richard Seroter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you decide to go with &lt;a href="https://www.pluralsight.com/courses/kubernetes-installation-configuration-fundamentals"&gt;Kubernetes&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/nocentino"&gt;Anthony Nocentino&lt;/a&gt; will help you get there fast.&lt;/p&gt;

&lt;p&gt;Now, you'll probably want to put your work in the cloud. But which one?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.pluralsight.com/courses/google-cloud-platform-fundamentals"&gt;GCPcloud&lt;/a&gt;? &lt;a href="https://www.linkedin.com/in/howarddierking"&gt;Howard Dierking&lt;/a&gt; explains the fundamentals.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.pluralsight.com/courses/docker-production-using-amazon-web-services"&gt;AWS cloud&lt;/a&gt;? &lt;a href="https://www.pluralsight.com/authors/justin-menga"&gt;Justin Menga&lt;/a&gt; shares how to keep the budget tight.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.pluralsight.com/courses/microsoft-azure-the-big-picture"&gt;Azure&lt;/a&gt;? &lt;a href="https://www.linkedin.com/in/mattmilner"&gt;Matt Milner&lt;/a&gt; is your guy.&lt;/p&gt;

&lt;p&gt;You may also consider some&lt;a href="https://www.pluralsight.com/courses/domain-driven-design-fundamentals"&gt; Domain-Driven Design&lt;/a&gt; (architecture design, nor graphic or UX design) to make sure your application will be easier to develop. Check out this course co-authored by &lt;a href="https://www.linkedin.com/in/stevenandrewsmith"&gt;Steve Smith&lt;/a&gt; and &lt;a href="https://twitter.com/julielerman"&gt;Julie Lerman&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To keep track of the changes, you'll probably use &lt;a href="https://www.pluralsight.com/courses/how-git-works"&gt;Git&lt;/a&gt;. &lt;a href="https://www.linkedin.com/in/paoloperrotta"&gt;Paolo Perrotta&lt;/a&gt; has something to show you to make you better equipped.&lt;/p&gt;

&lt;p&gt;If you're more of a &lt;a href="https://www.pluralsight.com/courses/using-git-with-gui"&gt;GUI&lt;/a&gt; person, this course by &lt;a href="https://www.linkedin.com/in/xmorera"&gt;Xavier Morera&lt;/a&gt; will help as well.&lt;/p&gt;

&lt;p&gt;And Git is also the tool used by many Open Source projects, so why not consider contributing on &lt;a href="https://www.pluralsight.com/courses/contributing-open-source-project-github"&gt;GitHub&lt;/a&gt; with &lt;a href="https://linkedin.com/in/subkamran"&gt;Kamran Ayub&lt;/a&gt; as your guide?&lt;/p&gt;

&lt;p&gt;Web applications are not your cup of tea? Maybe some &lt;a href="https://www.pluralsight.com/courses/learn-program-cplusplus"&gt;good old C++&lt;/a&gt; is a better choice, &lt;a href="https://twitter.com/gregcons"&gt;Kate Gregory&lt;/a&gt; knows all about it.&lt;/p&gt;

&lt;p&gt;Or maybe you've heard Elon Musk and Sam Altman talking about AI and want to get a piece of the action? &lt;a href="https://www.pluralsight.com/courses/computer-vision-executive-briefing"&gt;Computer Vision&lt;/a&gt; by &lt;a href="https://www.linkedin.com/in/xmorera"&gt;Xavier Morera&lt;/a&gt;  is your first step to building a self-driving car (even if it will be a LEGO one).&lt;/p&gt;

&lt;p&gt;And here are &lt;a href="https://app.pluralsight.com/profile/author/piotr-gaczkowski?clickid=QDUy8ey3ixyORJPwUx0Mo3EWUkiQ3o2lGRJR2s0&amp;amp;irgwc=1&amp;amp;mpid=1383508&amp;amp;aid=7010a000001xAKZAA2&amp;amp;utm_medium=digital_affiliate&amp;amp;utm_campaign=1383508&amp;amp;utm_source=impactradius"&gt;some courses&lt;/a&gt; by yours truly.&lt;/p&gt;

&lt;p&gt;If you like them, click on the Follow button to be notified when something new and exciting pops up (and to bring me some joy). This also applies to all the other great authors sharing their knowledge. Rating and followers mean the world to us!&lt;/p&gt;

&lt;p&gt;So many great courses for around the price of a Netflix Premium account! And until the 28th of August, they are available with &lt;a href="https://pluralsight.pxf.io/c/1383508/871608/7490"&gt;a 33% discount&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Any other great courses that should make it on this list?&lt;/p&gt;

</description>
      <category>pluralsight</category>
      <category>courses</category>
      <category>career</category>
      <category>learning</category>
    </item>
    <item>
      <title>Why you might need Ansible and not even know it</title>
      <dc:creator>Piotr Gaczkowski</dc:creator>
      <pubDate>Wed, 05 Aug 2020 17:00:52 +0000</pubDate>
      <link>https://forem.com/doomhammerng/why-you-might-need-ansible-and-not-even-know-it-2a88</link>
      <guid>https://forem.com/doomhammerng/why-you-might-need-ansible-and-not-even-know-it-2a88</guid>
      <description>&lt;p&gt;Do you want to start using Ansible? Are you already using it, but coming up against challenges? Even if you don’t fall into either category, don’t stop reading. I’m going to show you why you might actually need Ansible and how to best take advantage of it.&lt;/p&gt;

&lt;p&gt;Ansible’s catchphrase is “simple IT automation.” This is a pretty accurate description of what it does. In its most popular mode of operation (there are several), you describe the desired state of your machines, and Ansible manipulates them to achieve this state. At this point, you may be thinking “yeah, but we’ve already got shell scripts for that.” Ansible, though, offers several advantages over good old shell scripts.&lt;/p&gt;

&lt;p&gt;First of all, the playbook, which describes the desired state, is declarative and written in YAML. Using a playbook means you don’t need to handle the error control and condition checking yourself. It also means no actions will be taken if the state is already satisfied (e.g. &lt;code&gt;apt-get&lt;/code&gt; won’t run if an &lt;code&gt;nginx&lt;/code&gt; package is already installed).&lt;/p&gt;

&lt;p&gt;But this is only part of the story.&lt;/p&gt;

&lt;p&gt;The other thing that makes Ansible so powerful is the use of modules. Instead of relying on many third-party applications (&lt;code&gt;sed&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;jq&lt;/code&gt;, &lt;code&gt;useradd&lt;/code&gt;, &lt;code&gt;parted&lt;/code&gt;, etc.) and parsing their output, you can focus solely on the state itself. This means that regardless of the underlying userspace programs (&lt;code&gt;useradd&lt;/code&gt;, &lt;code&gt;adduser&lt;/code&gt;, Busybox, BSD, or GNU variants), you can just specify a universal task as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;– name: Create the operator user
  user:
    name: operator
    createhome: yes
    groups: wheel
    shell: /bin/sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In the same way, you would encapsulate parts of your script into separate libraries, Ansible embraces the concept of roles. Roles describe particular states of a machine, together with possible variables, configuration files, or templates. They’re aptly named, and the machine can use roles like &lt;code&gt;docker&lt;/code&gt;, &lt;code&gt;nginx&lt;/code&gt;, and &lt;code&gt;python&lt;/code&gt;, for example. Each of these may then be tested in isolation and reused among all of your projects. They also can encapsulate more abstract concepts like the &lt;a href="https://github.com/openstack/ansible-hardening"&gt;ansible-hardening&lt;/a&gt; role from OpenStack, which makes a target a little bit harder to break.&lt;/p&gt;

&lt;p&gt;And the other cool thing? To run Ansible, you only need Python 2.6+ on your target machines and an open SSH connection. There’s no need to install anything else! This means you’re probably ready to start using Ansible right away! Prepare your control machine by running brew install ansible or pip install -user ansible and follow me.&lt;/p&gt;

&lt;h1&gt;
  
  
  Deployment as Code
&lt;/h1&gt;

&lt;p&gt;Forget about the README located in the project’s root directory. It usually contains all the tedious details on how to deploy to staging or production. With Ansible, the documentation is in the code. It’s testable, it’s reusable, and it can be run by anybody, as long as the person has access to the target machines. It also forms the perfect basis for a Continuous Deployment (CD) pipeline.&lt;br&gt;
Making sure your app is always deployable can also help avert disaster. Instead of figuring out what to do when your servers go down, you simply edit the inventory file and make a fresh deployment to a new set of machines.&lt;/p&gt;

&lt;h1&gt;
  
  
  Make Sure Your Team Is Ready for DevOps
&lt;/h1&gt;

&lt;p&gt;When the deployment is a part of the codebase, it has to evolve with the codebase. Make sure all of your team is DevOps-enabled and understands how to use Ansible. The best way to do this is to provide a Vagrant environment so each dev can test the deployment process locally.&lt;/p&gt;

&lt;p&gt;It’s essential that you test your deployment code in the same way you test your application. Each change to an application that may be relevant to deployment needs to be reflected in changes to Ansible files. For example, if you add new files that must be copied to the server, make sure there’s a corresponding task. If an application starts logging in a particular directory, make sure Ansible creates that directory and sets appropriate permissions.&lt;/p&gt;

&lt;h1&gt;
  
  
  It’s Easy to Make It Work, Harder to Make It Maintainable
&lt;/h1&gt;

&lt;p&gt;Ansible has its downsides, as well. These aren’t necessarily related to the tool itself, but they do crop up occasionally. Even though Ansible has well-documented &lt;a href="http://docs.ansible.com/ansible/latest/playbooks_best_practices.html"&gt;best practices&lt;/a&gt;, those don’t always help you achieve a single goal. This can lead to the creation of complicated solutions when simple ones would suffice.&lt;/p&gt;

&lt;h1&gt;
  
  
  Prefer One-Time Deployments
&lt;/h1&gt;

&lt;p&gt;Even though one of the features Ansible advertises is &lt;a href="https://stackoverflow.com/questions/1077412/what-is-an-idempotent-operation"&gt;idempotence&lt;/a&gt;, it’s still quite easy to write a playbook that won’t work correctly. For example, how do you update service in an idempotent way? You can’t, it’s self-contradictory, which means you have to sacrifice one thing to save another (an update, that is).&lt;/p&gt;

&lt;p&gt;There are two concepts that can help with this problem: &lt;a href="http://www.conigliaro.org/disposable-not-immutable-infrastructure/"&gt;disposable infrastructure&lt;/a&gt; and &lt;a href="https://www.oreilly.com/ideas/an-introduction-to-immutable-infrastructure"&gt;immutable infrastructure&lt;/a&gt;. The two are pretty similar from a deployment point of view. The former assumes that a machine can be easily disposed of at any point in time after a successful deployment. It may be reconfigured in the future, but there’s nothing stopping you from taking it down at any time. The latter also requires that a machine never changes its configuration after it is provisioned.&lt;/p&gt;

&lt;p&gt;Both assume your application is located beyond a load balancer (or a reverse proxy). Such a load balancer could be hosted either externally or internally, independent of the rest of the infrastructure. Services that make up your application are registered in the load balancer. The backend configuration is updated dynamically as services come and go. If you want to host the load balancer yourself, &lt;a href="https://github.com/kelseyhightower/confd"&gt;confd&lt;/a&gt; or &lt;a href="https://dev.toconsul-template"&gt;consul-template&lt;/a&gt; can help with dynamic reconfiguration.&lt;/p&gt;

&lt;h1&gt;
  
  
  Use and Reuse Roles
&lt;/h1&gt;

&lt;p&gt;Questions like when and how to use roles or what aspects should be configurable don’t have single, straightforward answers. In my experience, it’s best to think of the various use cases for a particular machine and then to encapsulate those use cases in separate roles that can not only be tested in isolation but can also be reused for other projects. Such reuse also leads to better code quality thanks to a larger testing base.&lt;/p&gt;

&lt;h1&gt;
  
  
  A Galaxy of Possibilities
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://galaxy.ansible.com/"&gt;Ansible Galaxy&lt;/a&gt; provides lots of modules we can use. This is similar to Docker Hub or NPM, where you can search for the relevant parts and use them in your project. They are all written adhering to one standard, meaning they should be easily reusable. Unfortunately, this isn’t always the case.&lt;/p&gt;

&lt;p&gt;More than once in my career, I’ve happened upon a module that declared compatibility with Debian but was only ever tested on Ubuntu. This may not be a problem if you can choose your base OS. It may mean some additional work in porting it if you want to make use of existing infrastructure.&lt;/p&gt;

&lt;p&gt;Version pinning is another problem. We all know that software evolves and that backward compatibility is rarely observed. When modules use several dependencies, it’s crucial that every such dependency is described with an exact version tag. This way, we can avoid the problem of installing a package in the latest version that’s no longer compatible with another part of the system.&lt;/p&gt;

&lt;p&gt;When talking about pinned versions, there’s no avoiding the subject of bit rot. Unused software decays. Referenced hyperlinks can become obsolete, releases can be taken down, hosting services may cease operation. Even if a module uses a pinned version, it may become unusable if it’s not regularly tested and updated as needed, which leads us to our next topic.&lt;/p&gt;

&lt;h1&gt;
  
  
  Testing Is Hard — and Time-Consuming
&lt;/h1&gt;

&lt;p&gt;Ansible usually operates on system services. While it’s possible to test some of its features in containers (e.g., with Docker), this approach will generally fail. Docker can’t test all the kernel operations or systemd calls, because they don’t exist in its scope. To properly test Ansible playbooks, you need VMs. Did you notice the plural? Good, because it’s not enough to test on just one VM.&lt;/p&gt;

&lt;p&gt;The most basic test setup should use a clean VM, run the playbook, check the results, and then run the playbook again to check for idempotency issues. But this only gives you limited information. You still don’t know if the playbook will actually deploy in production. The target machine won’t necessarily be a clean VM (unless you’re already using disposable infrastructure).&lt;/p&gt;

&lt;p&gt;To mitigate this risk, it may be a good idea to have a separate VM that could serve as “long-term memory.” This VM, in contrast, would not be cleaned after every test deployment but would allow changes to accumulate over time.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;The best way to document code is in the code itself. Considering this simple statement leads us to a logical conclusion — the best deployment documentation is the deployment code. There are many tools to help achieve this, with Ansible being one of them. Personally, I prefer it to Chef or Puppet, but I’ve yet to try Salt or StackStorm.&lt;/p&gt;

&lt;p&gt;As with every tool I’ve encountered in my professional life, it also has its downsides. Knowing them up front should help you avoid some of the problems I’ve stumbled upon. Hopefully, learning from my experience will save you time and frustration in your own work.&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href="https://www.iamondemand.com"&gt;https://www.iamondemand.com&lt;/a&gt; on August 10, 2017.&lt;/p&gt;

</description>
      <category>python</category>
      <category>devops</category>
      <category>automation</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
