<?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: sensen</title>
    <description>The latest articles on DEV Community by sensen (@sensen).</description>
    <link>https://dev.to/sensen</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%2F216101%2Fb8672c91-d8cd-4301-b958-f757ce3c975b.jpeg</url>
      <title>DEV Community: sensen</title>
      <link>https://dev.to/sensen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sensen"/>
    <language>en</language>
    <item>
      <title>8 Steps to Deal with Feature Requests</title>
      <dc:creator>sensen</dc:creator>
      <pubDate>Wed, 01 Jan 2020 01:39:53 +0000</pubDate>
      <link>https://dev.to/sensen/8-steps-to-deal-with-feature-requests-4p6k</link>
      <guid>https://dev.to/sensen/8-steps-to-deal-with-feature-requests-4p6k</guid>
      <description>&lt;p&gt;Not long after releasing &lt;a href="https://www.typinghero.app"&gt;Typing Hero&lt;/a&gt; to &lt;a href="https://play.google.com/store/apps/details?id=sen.typinghero"&gt;Google Play&lt;/a&gt; over a year ago, &lt;a href="https://stadt-bremerhaven.de/author/benjamin/"&gt;Benjamin Mamerow&lt;/a&gt; who writes for &lt;a href="https://stadt-bremerhaven.de/"&gt;Caschys Blog&lt;/a&gt; published an &lt;a href="https://stadt-bremerhaven.de/typing-hero-kostenlose-text-expanding-app-fuer-android/"&gt;article&lt;/a&gt; about it. Soon, articles and videos about Typing Hero were published on various tech blog sites, news outlets, and YouTube.&lt;/p&gt;

&lt;p&gt;With many new users trying out Typing Hero, and then some continuing to use it on daily basis, I received a lot of feedback requesting features. From all of those feedback, I learn that user tends to describe solution (&lt;em&gt;the feature&lt;/em&gt;) they have in their mind, rather than explaining the problem they face.&lt;/p&gt;

&lt;p&gt;When asked to work on a feature, it is important to understand the problem needed to be solved. By understanding the problem, we can ask questions to determine if we're going to solve it or not, as well as when and how we're going to solve it.&lt;/p&gt;

&lt;p&gt;In this article, I'm going to share a few feature requests from users using Typing Hero, what I decided to do with those requests, and the process of coming to that decision. But first, I believe you need to understand what Typing Hero is, so you can relate more with the details later.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is Typing Hero?
&lt;/h1&gt;

&lt;p&gt;It's a text expander app. It helps you transform (&lt;em&gt;expand&lt;/em&gt;) your own keyword to any lengthy text you want in an instant.&lt;/p&gt;

&lt;p&gt;One start by creating a snippet, which is a pair of keyword and text. For example, one might set keyword "&lt;strong&gt;&lt;em&gt;gtg&lt;/em&gt;&lt;/strong&gt;" to expand into "Got to go!". Or, "&lt;strong&gt;&lt;em&gt;ty&lt;/em&gt;&lt;/strong&gt;" to expand into "Thank you!". You get the idea!&lt;/p&gt;

&lt;p&gt;You can create as many snippet as you wish. Some told me that they have hundreds of snippets. They use it to chat with friends, respond to clients with canned responses, send cold email to prospects, and many other use cases. In short, to get things done faster with less effort.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hh68mC45--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/mdxewvqzg3xqzpj2hydu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hh68mC45--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/mdxewvqzg3xqzpj2hydu.png" alt="Typing Hero, Snippet List"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EYOFDyO4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/scbu1ksw68rgj1xc5ldr.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EYOFDyO4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/scbu1ksw68rgj1xc5ldr.gif" alt="Typing Hero, Text Expansion in Action"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Feature requests
&lt;/h1&gt;

&lt;p&gt;Among many, I'd like to discuss two specific requests.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Allow sorting or alphabetical grouping functionality when displaying snippet list&lt;/li&gt;
&lt;li&gt;Show pop-up with undo button after expanding keyword&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I will share my finding about the problem that drives the user requesting the feature, my thought on when and how to solve the problem, and what I decided to do eventually.&lt;/p&gt;

&lt;p&gt;So, let's get to it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature #1: Sorting or alphabetical grouping
&lt;/h2&gt;

&lt;p&gt;In Typing Hero, recently created snippets are displayed at the top. There is no functionality to customize how it is displayed.&lt;/p&gt;

&lt;p&gt;When I receive feedback to add sorting functionality, I'm curious what triggers it. So, I asked a few people to explain the need for sorting functionality.&lt;/p&gt;

&lt;p&gt;Apparently, those users were adding a lot of snippets recently. When they need to make changes to existing snippet, they're struggling to find one snippet among hundreds. The problem they face is real. I don't have as many snippet as they do, but when I tried to find one among dozens, it seems like a &lt;a href="https://www.vocabulary.com/dictionary/Sisyphean"&gt;Sisyphean&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/Sisyphus"&gt;task&lt;/a&gt;. I find it unacceptable to let users going through this. It's obvious that it must be solved now.&lt;/p&gt;

&lt;p&gt;So, the fun part begins!&lt;/p&gt;

&lt;h3&gt;
  
  
  Questions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Is sorting directly helping them to find the one snippet they need to change?&lt;/em&gt;&lt;/strong&gt; It does in certain cases, but not all. If the snippet is located in the middle of the list, it will still be a struggle to get to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;What could possibly caused the struggle on finding a snippet?&lt;/em&gt;&lt;/strong&gt; Fortunately, the message "struggling to find one among hundreds" gave away the answer: huge list of snippets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;If huge list is the cause, will having a small list help make finding said snippet easier?&lt;/em&gt;&lt;/strong&gt; Finding one among 5 is easier than among 12. So, theoretically, yes. Reducing the size of the list seems like the correct way to solve this issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Is sorting reducing the size of the list?&lt;/em&gt;&lt;/strong&gt; No. It shows the same list in different order. It's obvious now that sorting isn't the solution to the problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;How might we reduce the list?&lt;/em&gt;&lt;/strong&gt; We could do filter. We can filter by label or category, which will involve assigning labels to a snippet, or grouping snippets into category. Another alternative is, we do &lt;strong&gt;search&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision
&lt;/h3&gt;

&lt;p&gt;With the three alternatives in hand (&lt;em&gt;label, category, and search&lt;/em&gt;), I chose to work on &lt;strong&gt;search&lt;/strong&gt; to solve the problem. The reasons are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Intuitive&lt;/strong&gt;. If you want to find something, you &lt;strong&gt;search&lt;/strong&gt; for it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Effort&lt;/strong&gt;. There is no database changes required, and it involves a very minimal UI changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplicity&lt;/strong&gt;. It's not adding a new concept to existing flow, and user don't need to put effort to modify existing snippets (&lt;em&gt;labelling, categorizing&lt;/em&gt;) for it to work.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sorting is still in the backlog, and I probably will never work on it (&lt;em&gt;for reasons irrelevant to this article&lt;/em&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature #2: Show pop-up with undo button
&lt;/h2&gt;

&lt;p&gt;Say you configure Typing Hero so that every time you type "&lt;strong&gt;&lt;em&gt;howdy&lt;/em&gt;&lt;/strong&gt;", it will be replaced with "&lt;strong&gt;&lt;em&gt;Hey, how are you?&lt;/em&gt;&lt;/strong&gt;". At certain times, you want to send the word "&lt;strong&gt;&lt;em&gt;howdy&lt;/em&gt;&lt;/strong&gt;" to a buddy. But, by the time you type it, it's automatically replaced with "&lt;strong&gt;&lt;em&gt;Hey, how are you?&lt;/em&gt;&lt;/strong&gt;", preventing you from sending the word "&lt;strong&gt;&lt;em&gt;howdy&lt;/em&gt;&lt;/strong&gt;".&lt;/p&gt;

&lt;p&gt;That is one of the reasons user needs undo functionality. The case is, once again, real.&lt;/p&gt;

&lt;p&gt;One user who is accustomed to other abandoned app requested to have undo functionality exactly how it's implemented in that app. So, every time a keyword is replaced with its matching text, an overlay view containing a button to undo recent text expansion will be shown. The solution actually works!&lt;/p&gt;

&lt;h3&gt;
  
  
  Questions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;How easy is it for user to perform undo?&lt;/em&gt;&lt;/strong&gt; It's easy for everyone. Simply move the finger to where the overlay view is, and tap the button.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Is it distracting to see the overlay view every time text expansion takes place?&lt;/em&gt;&lt;/strong&gt; Probably yes for some. Probably no for some.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;How might we make it easier?&lt;/em&gt;&lt;/strong&gt; It could be easier if user doesn't need to move their hand or finger to where the overlay view is, to perform undo.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;How might we make it less distracting for everyone?&lt;/em&gt;&lt;/strong&gt; If overlay view is distracting, then removing the overlay view will also remove the distraction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;How might we provide an alternative that is easier and not distracting?&lt;/em&gt;&lt;/strong&gt; If easier means user doesn't need to move their hand or finger, then we could simply utilize what is available where their fingers are at that time: the keyboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision
&lt;/h3&gt;

&lt;p&gt;By asking the questions above and finding out the answer to them, I decided to use the &lt;strong&gt;delete&lt;/strong&gt; (&lt;em&gt;or&lt;/em&gt; &lt;strong&gt;&lt;em&gt;backspace&lt;/em&gt;&lt;/strong&gt;) key on the keyboard to perform undo. The reasons are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Intuitive&lt;/strong&gt;. If you want to "undo" what you've typed, you &lt;strong&gt;delete&lt;/strong&gt; them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Effort&lt;/strong&gt;. There is no UI changes at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplicity&lt;/strong&gt;. There is no need to move finger to where the overlay is, and tap on the undo button. Simply reach for the already familiar &lt;strong&gt;delete&lt;/strong&gt; (&lt;em&gt;or&lt;/em&gt; &lt;strong&gt;&lt;em&gt;backspace&lt;/em&gt;&lt;/strong&gt;) key.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Takeaways
&lt;/h1&gt;

&lt;p&gt;The next time users of your app come with answers (&lt;em&gt;feature requests&lt;/em&gt;) rather than problems, you can take these 8 steps to help you decide what to do. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Understand the proposed feature&lt;/li&gt;
&lt;li&gt;Uncover the problem&lt;/li&gt;
&lt;li&gt;Find out what caused the problem&lt;/li&gt;
&lt;li&gt;Determine if proposed feature is actually eliminating what caused the problem&lt;/li&gt;
&lt;li&gt;Uncover potential problems with proposed feature&lt;/li&gt;
&lt;li&gt;Explore alternatives to eliminate what caused the problem&lt;/li&gt;
&lt;li&gt;Compare proposed feature and alternatives using values you care&lt;/li&gt;
&lt;li&gt;Choose what benefits both users and the team building the feature&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Understand that each step requires asking questions. Don't (&lt;em&gt;just&lt;/em&gt;) listen to users. Find the right questions, and ask them rigorously.&lt;/p&gt;

&lt;p&gt;Now, let's try to find more takeaways from the perspective of the team building the feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would have happened if a team didn't stop and asking questions when getting such feature requests?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would have happened if they simply &lt;em&gt;just&lt;/em&gt; listen to users, and do it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Please share them in the comments below!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover: Photo by &lt;a href="https://unsplash.com/@apx90?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;AP x 90&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/strategy?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>product</category>
      <category>android</category>
      <category>questioning</category>
    </item>
    <item>
      <title>Building a Product: Customer Support</title>
      <dc:creator>sensen</dc:creator>
      <pubDate>Mon, 23 Dec 2019 00:25:15 +0000</pubDate>
      <link>https://dev.to/sensen/building-a-product-customer-support-5bb6</link>
      <guid>https://dev.to/sensen/building-a-product-customer-support-5bb6</guid>
      <description>&lt;p&gt;Bad reviews affect your app's ranking and discoverability in the distribution channel. It can be frustrating when your app is receiving such reviews.&lt;/p&gt;

&lt;p&gt;One of the lessons I learn from releasing &lt;a href="https://www.typinghero.app/"&gt;Typing Hero&lt;/a&gt; to public over a year ago is how to turn bad review to five stars review. Is that even possible?&lt;/p&gt;

&lt;p&gt;It depends!&lt;/p&gt;

&lt;p&gt;Bad reviews are usually given by reviewer to express themselves. Of all bad reviews given for &lt;a href="https://www.typinghero.app/"&gt;Typing Hero&lt;/a&gt;, I learned that users are expressing one of the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frustration&lt;/li&gt;
&lt;li&gt;Accusation&lt;/li&gt;
&lt;li&gt;Principle&lt;/li&gt;
&lt;li&gt;Power&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If users are expressing frustration or accusation, it is still possible to get five stars review from them. If users are expressing the latter, I find it a waste of time to even try, unless you focus your effort on explaining your principle for others to understand.&lt;/p&gt;

&lt;p&gt;So, how does one turn bad review to five stars review? Customer Support!&lt;/p&gt;

&lt;h1&gt;
  
  
  What is Customer Support?
&lt;/h1&gt;

&lt;p&gt;In context of technology product; an app in this case, &lt;a href="https://en.wikipedia.org/wiki/Customer_support"&gt;customer support&lt;/a&gt; is termed &lt;a href="https://en.wikipedia.org/wiki/Technical_support"&gt;technical support&lt;/a&gt;. Technical support provides help regarding specific problems with a product or service, and maybe delivered over by phone or internet.&lt;/p&gt;

&lt;p&gt;Customer support is considered as one of the main data channels for &lt;a href="https://en.wikipedia.org/wiki/Customer_satisfaction_research"&gt;customer satisfaction research&lt;/a&gt; and a way to increase &lt;a href="https://en.wikipedia.org/wiki/Customer_retention"&gt;customer retention&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dealing with reviews
&lt;/h1&gt;

&lt;p&gt;I always respond to every review, doesn't matter if it's the perfect five stars review, or the horrific one star review. Some might find responding to each review as too much, but I personally find that it's the only way to show that the team who build the product care about the product and the users. I believe Customer support is a very critical aspect of a product, but often underrated and disconnected from the team developing the product itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bad review examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frustration
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--moeK8BEf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5vwjxy8wpgispi5h071z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--moeK8BEf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5vwjxy8wpgispi5h071z.png" alt="Frustration #1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HFdcnPxF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/oph3mbfy0bj8zttg8982.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HFdcnPxF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/oph3mbfy0bj8zttg8982.png" alt="Frustration #2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One user is frustrated because Typing Hero stops working a couple of days later. Another is frustrated because Typing Hero never works!&lt;/p&gt;

&lt;h3&gt;
  
  
  Accusation
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VF51os59--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bgsjv5dluau0cbhsskxr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VF51os59--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bgsjv5dluau0cbhsskxr.png" alt="Accusation #1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s-EbCNL3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/y9tmzmn9h16ph8vybb8p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s-EbCNL3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/y9tmzmn9h16ph8vybb8p.png" alt="Accusation #2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Typing Hero is accused of containing adware and slowing down user's device. How might you respond differently?&lt;/p&gt;

&lt;h3&gt;
  
  
  Principle
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uFKmBZ62--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/o3gis4nyyt51przw4zv2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uFKmBZ62--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/o3gis4nyyt51przw4zv2.png" alt="Principle #1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xGU-_Pyq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/f922rp7fx8b498rvnl08.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xGU-_Pyq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/f922rp7fx8b498rvnl08.png" alt="Principle #2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Users believe Typing Hero should not request internet permission due to its capability of reading what is typed on the device.&lt;/p&gt;

&lt;p&gt;Don't get me wrong, this is a very fair concern. But I stand my ground for all the reasons I wrote in the reply for that review.&lt;/p&gt;

&lt;h3&gt;
  
  
  Power
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QDaqSbKX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ound08w0j06q9vb92quh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QDaqSbKX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ound08w0j06q9vb92quh.png" alt="Power #1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7h_zfR37--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/54n4xo36tpa62t35s5td.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7h_zfR37--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/54n4xo36tpa62t35s5td.png" alt="Power #2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Users asking for translation and new functionality.&lt;/p&gt;

&lt;p&gt;As you can see from the examples above, I'm not able to turn those reviews into five stars. That's sad, but at least I showed that I really tried to reach out to them, either to explain, stand my ground, or resolving their issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bad to five stars reviews
&lt;/h2&gt;

&lt;p&gt;The following are some bad reviews that were changed to five stars after making them understand what the issue is, and helping them resolve the issue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PEYlIz9I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ih686wmm5swhrirhyho1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PEYlIz9I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ih686wmm5swhrirhyho1.png" alt="Five Stars #1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--acgFQFoh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/hgc2afrc1kc95sn1ipgs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--acgFQFoh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/hgc2afrc1kc95sn1ipgs.png" alt="Five Stars #2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tQhnNCmU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ew1ss5h6m11grj2qqels.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tQhnNCmU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ew1ss5h6m11grj2qqels.png" alt="Five Stars #3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yYCXLrqn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/fi6ysglds6q78gyt9r37.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yYCXLrqn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/fi6ysglds6q78gyt9r37.png" alt="Five Stars #4"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TxiI4PCn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ot2hzhm2rnwfw6p0l8aj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TxiI4PCn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ot2hzhm2rnwfw6p0l8aj.png" alt="Five Stars #5"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Bug-JprP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/yve2kys9mge2ct6pbv5j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Bug-JprP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/yve2kys9mge2ct6pbv5j.png" alt="Five Stars #6"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fKxIJqrs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/mvfbtbjl3djgild4ukhx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fKxIJqrs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/mvfbtbjl3djgild4ukhx.png" alt="Five Stars #7"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ThvT0x9g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/p77l36uvr4iftgqmltu6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ThvT0x9g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/p77l36uvr4iftgqmltu6.png" alt="Five Stars #8"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t_yI_J9y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/cf0typy9ag0zb7dtw4ip.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t_yI_J9y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/cf0typy9ag0zb7dtw4ip.png" alt="Five Stars #9"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GykPVN8K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/7vkfilyb77d8mbqe7s8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GykPVN8K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/7vkfilyb77d8mbqe7s8n.png" alt="Five Stars #10"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TXmzOJkt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/08ne3806wvj5z9bdua3q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TXmzOJkt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/08ne3806wvj5z9bdua3q.png" alt="Five Stars #11"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Lesson Learned
&lt;/h1&gt;

&lt;p&gt;Bad reviews are calls for help from users. They could be a golden ticket to five stars review. The chance of getting five stars review from those who give bad review is higher than from those who don't rate or review at all.&lt;/p&gt;

&lt;p&gt;Whatever stage your product is, always prioritize supporting your customer over working on new features. Help yourself by keeping your customer continue using the product you build.&lt;/p&gt;

&lt;p&gt;As a company, consider making Customer Support part of the team designing and building the product. If Customer Support team is integrated with those teams, they will have the same in-depth knowledge of the product. Such knowledge will empower them answering questions from frustrated users with on point responses.&lt;/p&gt;

</description>
      <category>product</category>
      <category>customer</category>
      <category>support</category>
      <category>android</category>
    </item>
    <item>
      <title>CLI for Efficiency #1</title>
      <dc:creator>sensen</dc:creator>
      <pubDate>Tue, 19 Nov 2019 14:41:02 +0000</pubDate>
      <link>https://dev.to/sensen/cli-for-efficiency-1-1fjj</link>
      <guid>https://dev.to/sensen/cli-for-efficiency-1-1fjj</guid>
      <description>&lt;p&gt;I tried KDE Plasma on my Ubuntu machine last weekend. After using it for a while, I decided that it is too complicated for me and I'd like to remove them from my machine.&lt;/p&gt;

&lt;p&gt;To remove installed packages in Ubuntu is simple. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ sudo apt remove package-name-1 package-name-2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;But, there are a lot of packages installed automatically when you install KDE Plasma. Removing them one by one is definitely, well, inefficient. So, the challenge here is to get a list of installed KDE packages in proper format, so you can feed them into the command above.&lt;/p&gt;

&lt;p&gt;Here's how I solve it in an efficient way.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apt&lt;/code&gt; as the interface for the package management system in Ubuntu provides a way for you to list installed packages. Here's one way to list installed packages which name contains &lt;code&gt;kde&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ apt list --installed | grep kde

.
.
debconf-kde-helper/disco 1.0.3-1 amd64 [installed,automatic]
kde-style-breeze/disco 4:5.15.4.1-0ubuntu1 [installed,automatic]
.
.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The output is not something we can feed into &lt;code&gt;apt remove&lt;/code&gt; command directly, so we need to sanitize it quite a bit.&lt;/p&gt;

&lt;p&gt;It's obvious that the package name is anything before &lt;code&gt;/&lt;/code&gt;. We can use the &lt;code&gt;cut&lt;/code&gt; command to do just that.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ apt list --installed | grep kde | cut -d "/" -f 1

.
.
debconf-kde-helper
kde-style-breeze
.
.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Next, since each packages are listed in a new line, we still can't pass this output directly to the &lt;code&gt;apt remove&lt;/code&gt; command. Let's replace the new line with space using &lt;code&gt;tr&lt;/code&gt; command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ apt list --installed | grep kde | cut -d "/" -f 1 | tr '\n' ' '

.
.
debconf-kde-helper kde-style-breeze
.
.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now, the output of installed KDE packages are now in proper format. We can now feed the output directly to &lt;code&gt;apt remove&lt;/code&gt; command using &lt;code&gt;xargs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ apt list --installed | grep kde | cut -d "/" -f 1 | tr '\n' ' ' | xargs sudo apt remove&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It's amazing how these four simple tools: &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;cut&lt;/code&gt;, &lt;code&gt;tr&lt;/code&gt;, and &lt;code&gt;xargs&lt;/code&gt;, can help you automate and achieve your goal; saving you from the manual and repetitive labor. &lt;/p&gt;

&lt;p&gt;How might you do it differently?&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Switching (back) from Apple's Ecosystem to Linux</title>
      <dc:creator>sensen</dc:creator>
      <pubDate>Sun, 03 Nov 2019 14:18:25 +0000</pubDate>
      <link>https://dev.to/sensen/switching-back-from-apple-s-ecosystem-to-linux-1ld3</link>
      <guid>https://dev.to/sensen/switching-back-from-apple-s-ecosystem-to-linux-1ld3</guid>
      <description>&lt;p&gt;Finding a decent machine to replace 15" Macbook Pro (MBP) is challenging; it stopped me from making the switch (back) from Apple's ecosystem to Linux around two years ago.&lt;/p&gt;

&lt;p&gt;Early September 2019 marked the day I finally made the switch. If you're about to start the same journey, hopefully this post will be useful for you.&lt;/p&gt;

&lt;h1&gt;
  
  
  Hardware
&lt;/h1&gt;

&lt;p&gt;When searching for a replacement machine, these are the deciding factor for me, in order of importance.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Display, GPU&lt;/li&gt;
&lt;li&gt;Processor&lt;/li&gt;
&lt;li&gt;Customer Replaceable Unit (CRU)&lt;/li&gt;
&lt;li&gt;Battery&lt;/li&gt;
&lt;li&gt;(Many) Ports&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Display, GPU
&lt;/h2&gt;

&lt;p&gt;It has to be at least 14", FHD (1920x1080), and matte finished. I prefer non 4K display, as the battery trade-off isn't worth it for me. And yes, no external GPU, I don't need it at all. &lt;/p&gt;

&lt;h2&gt;
  
  
  Processor
&lt;/h2&gt;

&lt;p&gt;Released to market at most 2 years ago.&lt;/p&gt;

&lt;h2&gt;
  
  
  Customer Replaceable Unit (CRU)
&lt;/h2&gt;

&lt;p&gt;This is the most important feature of the machine after display and processor. It should be designed to allow you as owner, to take the machine apart, and replace parts on your own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Battery
&lt;/h2&gt;

&lt;p&gt;Around 6 hours of battery life.&lt;/p&gt;

&lt;h2&gt;
  
  
  (Many) Ports
&lt;/h2&gt;

&lt;p&gt;To eliminate the needs to purchase and carry another adapter with you all the time.&lt;/p&gt;

&lt;p&gt;After some research by reading customer and professional reviews on various sites and forums, I chose ThinkPad T480 to replace 15" MBP.&lt;/p&gt;

&lt;p&gt;I bought 14" FHD T480 that comes with i5-8250U as opposed to i7, because the price difference doesn't justify the additional performance. I saved a lot of money by giving up extra performance I will get on i7 when doing things I rarely do.&lt;/p&gt;

&lt;p&gt;If you wonder why CRU is the next most important feature after display and processor, you'll understand why. I chose a version of T480 that comes with &lt;em&gt;as little and slowest storage disk, and as little RAM as it is available&lt;/em&gt; in the market. As both parts are CRU, you can replace them on your own. Doing so saves me a lot of money: hundreds of dollars! &lt;/p&gt;

&lt;p&gt;As for battery, ThinkPad T480 has two battery slots, internal and external, both designed as CRU. The external battery has 6-cells variant, which when combined with its 3-cells internal battery, will last over 15+ hours on a single charge (as reviewed by some reviewers).&lt;/p&gt;

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

&lt;p&gt;I rely on many amazing apps in Apple's ecosystem. These are some essential apps I use in macOS, which (I think) will make my life less comfortable, if I couldn't find their replacement in Linux ecosystem.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Password manager&lt;/li&gt;
&lt;li&gt;Note-taking &lt;/li&gt;
&lt;li&gt;Music&lt;/li&gt;
&lt;li&gt;Firewall&lt;/li&gt;
&lt;li&gt;Productivity&lt;/li&gt;
&lt;li&gt;Utility&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Password Manager
&lt;/h2&gt;

&lt;p&gt;As &lt;a href="https://1password.com/"&gt;1Password&lt;/a&gt; customer, I was quite happy to find out that they have 1Password X browser extension that works very well. They don't have a stand-alone 1Password app, but this is much better than a few years ago. &lt;/p&gt;

&lt;h2&gt;
  
  
  Note-taking
&lt;/h2&gt;

&lt;p&gt;I have been using Apple's Notes and Google's Keep app to take note for a few years. In May 2019, I made the switch to &lt;a href="https://standardnotes.org/"&gt;Standard Notes&lt;/a&gt;, a free, open-source, and completely encrypted notes app. &lt;/p&gt;

&lt;h2&gt;
  
  
  Music
&lt;/h2&gt;

&lt;p&gt;There's an unofficial Spotify client for Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Firewall
&lt;/h2&gt;

&lt;p&gt;Up to this point, I haven't replace Little Snitch that I use in macOS with anything else. There are potential alternatives that I haven't explore, such as &lt;a href="https://github.com/evilsocket/opensnitch"&gt;evilsocket/opensnitch&lt;/a&gt; and &lt;a href="https://douaneapp.com/"&gt;Douane&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Productivity
&lt;/h2&gt;

&lt;p&gt;Two apps that I use to automate tasks are &lt;a href="https://www.keyboardmaestro.com/main/"&gt;Keyboard Maestro&lt;/a&gt; and &lt;a href="https://www.noodlesoft.com/"&gt;Hazel&lt;/a&gt;. I haven't find a replacement for Keyboard Maestro, but &lt;a href="https://github.com/tfeldmann/organize"&gt;organize&lt;/a&gt; is a potential alternative for Hazel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Utility
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cleanmymac.com/"&gt;CleanMyMac X&lt;/a&gt; and &lt;a href="https://www.shimovpn.com/"&gt;Shimo&lt;/a&gt; are two others apps that I use. &lt;a href="https://github.com/oguzhaninan/Stacer"&gt;Stacer&lt;/a&gt; is a perfect replacement for CleanMyMac X, but I haven't invest any effort on finding a replacement for Shimo.&lt;/p&gt;

&lt;h1&gt;
  
  
  Misc
&lt;/h1&gt;

&lt;p&gt;My ThinkPad T480 comes with Windows 10 Pro 64bit. Upon arrival, I created a recovery USB disk, and then create an image out of it. Soon afterwards, I replace the installed spinning disk with 500 GB SSD, and replace 8 GB RAM stick with 2 sticks of 16 GB RAM.&lt;/p&gt;

&lt;p&gt;I decided to use &lt;a href="https://ubuntu.com/"&gt;Ubuntu&lt;/a&gt;, after spending quite a while on setting up &lt;a href="https://gentoo.org/"&gt;Gentoo&lt;/a&gt;. As much as I enjoy tinkering with Gentoo, I realized it's not something I need at that moment (even now). Installing Ubuntu and provisioning the machine according to my development needs took around 45-60 minutes; I can even automate the provisioning process. Everything works out of the box!&lt;/p&gt;

&lt;p&gt;The build is sturdy, and quite light considering its size. The keyboard is a pleasure to type on, I vouch for it! The only thing I'm missing is the superior touchpad experience on MBP/macOS. I'm not sure how far &lt;a href="https://github.com/JoseExposito/touchegg"&gt;touchegg&lt;/a&gt; can improve the touchpad experience on ThinkPad/Linux.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ubuntu</category>
    </item>
  </channel>
</rss>
