<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Jeff Whelpley on Medium]]></title>
        <description><![CDATA[Stories by Jeff Whelpley on Medium]]></description>
        <link>https://medium.com/@jeffwhelpley?source=rss-d1d326dd6a28------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*VstosRMcyeeTFeXh.jpg</url>
            <title>Stories by Jeff Whelpley on Medium</title>
            <link>https://medium.com/@jeffwhelpley?source=rss-d1d326dd6a28------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 22:10:26 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@jeffwhelpley/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[The Customer Service Software Industry is Fundamentally Broken]]></title>
            <link>https://medium.com/@jeffwhelpley/the-customer-service-software-industry-is-fundamentally-broken-d60ef5e4bd2f?source=rss-d1d326dd6a28------2</link>
            <guid isPermaLink="false">https://medium.com/p/d60ef5e4bd2f</guid>
            <category><![CDATA[software]]></category>
            <category><![CDATA[customer-service]]></category>
            <category><![CDATA[consumer]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[entrepreneurship]]></category>
            <dc:creator><![CDATA[Jeff Whelpley]]></dc:creator>
            <pubDate>Fri, 08 Mar 2019 16:41:00 GMT</pubDate>
            <atom:updated>2019-03-08T16:41:00.983Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Fbbe-3eX0hal8RdyWRQRRQ.jpeg" /></figure><p>Over the past 6 years as the co-founder and CTO of <a href="https://gethuman.com/">GetHuman</a>, I’ve spent a significant portion of my time thinking about how software can be used to help improve customer service. While there have no doubt been recent innovations across the industry that have greatly improved the efficiency of customer service from the company’s point of view, the sad fact is:</p><blockquote>Despite some technical innovations, most customer service still stinks (from the consumer’s point of view)</blockquote><p>Why is that?</p><p>In this 4-part blog post series, I will make the argument that there are actually two fundamental problems at play here:</p><ol><li>Customer service software built <strong>for</strong> <strong>companies</strong> only helps consumers insofar as companies perceive that it’s in their own self interest.</li><li>Customer service software built<strong> for consumers </strong>tries to do what is in the best interest of the consumer, but that effort is often compromised by the need to make money and/or their relationship with companies.</li></ol><p>After we go over both of these issues in depth, I will present a few thoughts on how these issues can potentially be overcome in the future and what we can do to improve the state of customer service as a whole for everyone across the board.</p><h3>Up Next…</h3><p>In <a href="https://medium.com/@jeffwhelpley/customer-service-software-economics-dbd766337c96">Part 2</a> of this 4-part series, I will explain how the economic incentives behind customer service software can adversely affect customers.</p><ol><li>The Customer Service Software Industry is Fundamentally Broken</li><li><a href="https://medium.com/@jeffwhelpley/customer-service-software-economics-dbd766337c96">Customer Service Software Economics</a></li><li><a href="https://medium.com/@jeffwhelpley/categories-of-customer-service-software-built-for-consumers-1c717142f7a">Categories of Customer Service Software Built for Consumers</a></li><li><a href="https://medium.com/@jeffwhelpley/un-breaking-customer-service-a39b0d9d2e6d">Un-breaking Customer Service</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d60ef5e4bd2f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Customer Service Software Economics]]></title>
            <link>https://medium.com/@jeffwhelpley/customer-service-software-economics-dbd766337c96?source=rss-d1d326dd6a28------2</link>
            <guid isPermaLink="false">https://medium.com/p/dbd766337c96</guid>
            <category><![CDATA[consumer]]></category>
            <category><![CDATA[saas]]></category>
            <category><![CDATA[customer-service]]></category>
            <category><![CDATA[entrepeneurship]]></category>
            <category><![CDATA[software]]></category>
            <dc:creator><![CDATA[Jeff Whelpley]]></dc:creator>
            <pubDate>Fri, 08 Mar 2019 16:41:00 GMT</pubDate>
            <atom:updated>2019-03-08T16:41:00.801Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Cky_giNKwgztox4xjzv71g.jpeg" /></figure><p><em>This is Part 2 of a 4-part series about what is wrong with the customer service software industry and what we can do about it.</em></p><ol><li><a href="https://medium.com/@jeffwhelpley/the-customer-service-software-industry-is-fundamentally-broken-d60ef5e4bd2f"><em>The Customer Service Software Industry is Fundamentally Broken</em></a></li><li><strong><em>Customer Service Software Economics</em></strong></li><li><a href="https://medium.com/@jeffwhelpley/categories-of-customer-service-software-built-for-consumers-1c717142f7a"><em>Categories of Customer Service Software Built for Consumers</em></a></li><li><a href="https://medium.com/@jeffwhelpley/un-breaking-customer-service-a39b0d9d2e6d"><em>Un-breaking Customer Service</em></a></li></ol><p>In the first part of this series, I explained why <a href="https://medium.com/@jeffwhelpley/the-customer-service-software-industry-is-fundamentally-broken-d60ef5e4bd2f">The Customer Service Software Industry is Fundamentally Broken</a>. In this post, I will go into a little more detail and explain how the economic incentives behind customer service software can adversely affect customers.</p><p>The incentives are different depending on whether the software is geared toward companies or consumers. Let’s talk about each in turn.</p><h3>Customer Service Software for Companies</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/358/1*3weCKZkC696q38AoKjm7rw.png" /></figure><p>There are many different reasons why customers get frustrated by the customer service provided by companies. For the purpose of this article, however, it’s important to distinguish between issues the company is incentivized to improve (i.e. customer and company incentives aligned) versus frustrations purposely caused by the company (i.e. incentives NOT aligned).</p><h4>Types of Customer Service Issues</h4><ol><li>Customer needs information — incentives aligned</li><li>Customer reports a bug — incentives aligned</li><li>Customer makes standard operational request — incentives aligned</li><li>Customer wants to cancel service, reduce rate or perform any action that goes against standard policy — incentives not aligned</li></ol><h4>Aligned Issues</h4><p>I’m not saying there aren’t challenges today with fulfilling customer service requests in the first three categories. There are. I’m just saying that it’s in the best interest of the company to resolve those challenges and therefore customer service software vendors will likely continue to innovate here.</p><h4>Non-aligned Issues</h4><p>The much more problematic area in the long term is #4.</p><blockquote>Customer service software built for companies will never make it easy for customers to do something the company doesn’t want them to do.</blockquote><p>Any significant improvement for this category of customer service issues will have to come from the other side of the fence (i.e. software built for consumers).</p><h3>Customer Service Software for Consumers</h3><p>In theory, consumer software should be built to favor the consumer at all times. In reality, however, this largely depends on answers to the following questions:</p><h4>What‘s the relationship between the software and the company?</h4><p>A customer service issue is by definition an issue between a consumer and a company. In order for consumer software to help resolve that issue, the software product has to jump in the middle of that interaction. When that happens, the software has one of two choices:</p><ol><li>Remain 100% completely independent from the company to ensure the consumer’s interest is always favored.</li><li>Establish integrations/relationships with the company in order to enable certain features and/or solve certain types of customer service issues.</li></ol><p>These options are, in most cases, mutually exclusive. The tighter the relationship with the company, the more the independence and integrity of the consumer software is compromised. However, in many cases, some sort of relationship with the company is needed in order to service the customer.</p><p>In short, there is no perfect answer here and most consumer software is forced to walk a fine line between the customer’s interest and the requirements needed to integrate with the company.</p><h4>How does the software product make money?</h4><p>Nothing in life is truly free. Consumer software has to make money at some point in some way. That means consumer software is faced with a second difficult choice:</p><ol><li>Charge the consumer</li><li>Charge the company</li><li>Charge a third party (i.e. ads)</li></ol><p>Each of these options have advantages and disadvantages.</p><p>Charging the consumer ensures the highest likelihood the interest of the consumer is prioritized, but as I have (painfully) learned during my 6 years at <a href="https://gethuman.com/">GetHuman</a>:</p><blockquote>Most consumers will not pay for customer service</blockquote><p>Charging the company is usually the most profitable option, but it has the obvious strings attached.</p><p>Charging a third party that is not involved in the customer service transaction (i.e. in most cases, ads) seems like the most viable option except that you often need to attract a A LOT of users in order to make significant revenue.</p><p>For example, with ads my general rule of thumb is that you need 1m+ monthly users to have any chance. Even then, the software won’t be much more than a side lifestyle business unless you can continue to increase one or two orders of magnitude (i.e. 100m+ monthly users) beyond that.</p><h3>Up Next…</h3><p>So, consumer software is clearly a better candidate to fix the fundamentally broken part of customer service. However, as alluded to earlier in this article, consumer software can be tricky. <a href="https://medium.com/@jeffwhelpley/categories-of-customer-service-software-built-for-consumers-1c717142f7a">Part 3</a> of this 4-part series goes a little deeper into the different categories of consumers software.</p><ol><li><a href="https://medium.com/@jeffwhelpley/the-customer-service-software-industry-is-fundamentally-broken-d60ef5e4bd2f">The Customer Service Software Industry is Fundamentally Broken</a></li><li>Customer Service Software Economics</li><li><a href="https://medium.com/@jeffwhelpley/categories-of-customer-service-software-built-for-consumers-1c717142f7a">Categories of Customer Service Software Built for Consumers</a></li><li><a href="https://medium.com/@jeffwhelpley/un-breaking-customer-service-a39b0d9d2e6d">Un-breaking Customer Service</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dbd766337c96" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Categories of Customer Service Software Built for Consumers]]></title>
            <link>https://medium.com/@jeffwhelpley/categories-of-customer-service-software-built-for-consumers-1c717142f7a?source=rss-d1d326dd6a28------2</link>
            <guid isPermaLink="false">https://medium.com/p/1c717142f7a</guid>
            <category><![CDATA[software]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[entrepreneurship]]></category>
            <category><![CDATA[consumer]]></category>
            <category><![CDATA[customer-service]]></category>
            <dc:creator><![CDATA[Jeff Whelpley]]></dc:creator>
            <pubDate>Fri, 08 Mar 2019 16:41:00 GMT</pubDate>
            <atom:updated>2019-03-08T16:41:00.745Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/750/1*2eSKVEeGzeam5hBB9VKatg.jpeg" /></figure><p><em>This is Part 3 of a 4-part series about what is wrong with the customer service software industry and what we can do about it.</em></p><ol><li><a href="https://medium.com/@jeffwhelpley/the-customer-service-software-industry-is-fundamentally-broken-d60ef5e4bd2f"><em>The Customer Service Software Industry is Fundamentally Broken</em></a></li><li><a href="https://medium.com/@jeffwhelpley/customer-service-software-economics-dbd766337c96"><em>Customer Service Software Economics</em></a></li><li><strong><em>Categories of Customer Service Software Built for Consumers</em></strong></li><li><a href="https://medium.com/@jeffwhelpley/un-breaking-customer-service-a39b0d9d2e6d"><em>Un-breaking Customer Service</em></a></li></ol><p>Part 1 of this blog post series provided an overview of why <a href="https://medium.com/@jeffwhelpley/the-customer-service-software-industry-is-fundamentally-broken-d60ef5e4bd2f">The Customer Service Software Industry is Fundamentally Broken</a>. Part 2 explained how the <a href="https://medium.com/@jeffwhelpley/customer-service-software-economics-dbd766337c96">economic incentives for customer service software</a> makes it difficult at times to do what’s in the best interest of the consumer. The conclusion in that article was that consumer software is more capable of doing what is right for the consumer than commercial software.</p><p>So, let’s dive into the 4 different categories of customer service software available today for consumers. To be clear, nothing is perfect. If there were, then customer service would not be broken. The goal of here is to learn from what works and what doesn’t with existing software so we can start to envision a new bigger, better, more bad*ss solution in the future.</p><h3>Category: Content Website</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*E-s7CbmAgUFRXz1pvoIM7w.png" /></figure><ul><li>Example — <a href="https://gethuman.com/">GetHuman</a></li><li>Customer service need addressed — Information/troubleshooting</li><li>Business model — Ads/Referrals</li><li>Relationship to companies — Content curated by website and/or website community (i.e. so company usually not involved)</li><li>Advantages — Can give information that the company doesn’t want to reveal (ex. explaining how to cancel). Also, can provide cross-company and cross-product information (ex. comparing product features).</li><li>Challenges — Can be hard to keep information in sync with changes at each company. Incorrect and/or out of date information is often even worse than no information. FYI, GetHuman does a great job of this, but it takes a pretty massive effort behind the scenes.</li></ul><h3>Category: Dispute Management</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SP4E6noz2Y9vbdnNiUu3fg.png" /></figure><ul><li>Example — <a href="https://www.bbb.org/">Better Business Bureau</a></li><li>Customer service need addressed — Resolving dissatisfaction with the service provided by a company</li><li>Business model — Selling data and/or accreditation to companies</li><li>Relationship to companies — Often companies can get more favorable ratings/access if they pay more</li><li>Advantages — As trusted 3rd party, has leverage to demand more from companies for the customer.</li><li>Challenges — Since revenue comes from companies, dispute managers often need to walk a fine line. This can lead to more favorability on companies than they deserve in some cases.</li></ul><h3>Category: Service Optimizer</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CgOUv4p4Ptzxhl0T0wg1jA.png" /></figure><ul><li>Examples — <a href="https://www.billshark.com/">BillShark</a>, <a href="https://www.asktrim.com/">Trim</a></li><li>Customer service need addressed — Monitoring service usage and facilitating changes that are most favorable to consumer (ex. canceling service, switching service, lowering rate)</li><li>Business model — Charging customer (typically either flat fee or percentage of money saved)</li><li>Relationship to companies — Contacts company on your behalf, so usually no direct relationship to the company. There is always a fear, however, the company will make it harder for them to work on the customer’s behalf. That fear can at times indirectly push the company’s interest ahead of the consumer.</li><li>Advantages — Usually able to do what is best for the customer. In many cases, these services also help customer plan ahead of time to prevent potential issues in the future.</li><li>Challenges — Companies make it just as hard for these service providers as they do for the customer (if not harder). These services almost always involve manual, resource intensive work that is difficult to scale and optimize. Also, many consumers don’t like to pay for this type of service.</li></ul><h3>Category: Customer Service “Insurance”</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-jKd_jCmFWrghr9sPddsXg.png" /></figure><ul><li>Examples — <a href="https://getservice.com/">Service</a>, <a href="https://www.lola.com/">Lola</a></li><li>Customer service need addressed — Top tier concierge customer service that you get before you have any issues (i.e. just in case something happens down the road).</li><li>Business model — Charging customer (typically either monthly service fee or percentage of money saved)</li><li>Relationship to companies — Similar to Service Optimizers, these services often work on behalf of the customer when they contact a company.</li><li>Advantages — Regardless of how bad customer service is at the companies you deal with, you will always be treated like a rock star.</li><li>Challenges — All the same downsides as Service Optimizers. Also, it’s nearly impossible to provide top tier customer service for every company in every industry. That is why these service providers more often than not focus on just one industry or niche (ex. Travel).</li></ul><h3>Up Next…</h3><p>Now that we have a lay of the land, the <a href="https://medium.com/@jeffwhelpley/un-breaking-customer-service-a39b0d9d2e6d">last installment</a> of this blog post series will lay out some guidelines for what it will take to create a solution that can help un-break customer service and make life better for all of us.</p><ol><li><a href="https://medium.com/@jeffwhelpley/the-customer-service-software-industry-is-fundamentally-broken-d60ef5e4bd2f">The Customer Service Software Industry is Fundamentally Broken</a></li><li><a href="https://medium.com/@jeffwhelpley/customer-service-software-economics-dbd766337c96">Customer Service Software Economics</a></li><li>Categories of Customer Service Software Built for Consumers</li><li><a href="https://medium.com/@jeffwhelpley/un-breaking-customer-service-a39b0d9d2e6d">Un-breaking Customer Service</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1c717142f7a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Un-breaking Customer Service]]></title>
            <link>https://medium.com/@jeffwhelpley/un-breaking-customer-service-a39b0d9d2e6d?source=rss-d1d326dd6a28------2</link>
            <guid isPermaLink="false">https://medium.com/p/a39b0d9d2e6d</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[software]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[customer-service]]></category>
            <category><![CDATA[entrepeneurship]]></category>
            <dc:creator><![CDATA[Jeff Whelpley]]></dc:creator>
            <pubDate>Fri, 08 Mar 2019 16:41:00 GMT</pubDate>
            <atom:updated>2019-03-09T12:56:56.148Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VxMX0To1IPsprEK_l0qJGw.jpeg" /></figure><p><em>This is the final installment of a 4-part series about what is wrong with the customer service software industry and what we can do about it.</em></p><ol><li><a href="https://medium.com/@jeffwhelpley/the-customer-service-software-industry-is-fundamentally-broken-d60ef5e4bd2f"><em>The Customer Service Software Industry is Fundamentally Broken</em></a></li><li><a href="https://medium.com/@jeffwhelpley/customer-service-software-economics-dbd766337c96"><em>Customer Service Software Economics</em></a></li><li><a href="https://medium.com/@jeffwhelpley/categories-of-customer-service-software-built-for-consumers-1c717142f7a"><em>Categories of Customer Service Software Built for Consumers</em></a></li><li><strong><em>Un-breaking Customer Service</em></strong></li></ol><p>In the first three parts of this blog post series, we talked about why and how customer service software is fundamentally broken. The tl;dr is that it’s hard to navigate the fine line between the best interest of the consumer and features that require help from the company.</p><p>I’ve been one of the brave souls walking that fine line for the past 6 years as co-founder and CTO at <a href="https://gethuman.com/">GetHuman</a>. I would never claim that GetHuman is the ultimate answer (yet 😉), but our years of experimentation and exploration have lead me to believe that the following 6 characteristics are essential for any software that aims to dominate the industry and un-break customer service.</p><h3>1. Consumer Technology</h3><p>It should go without saying that the solution is going to have to be on the consumer side. Commercial software vendors <a href="https://medium.com/@jeffwhelpley/customer-service-software-economics-dbd766337c96">will never work against the best interest of companies</a>.</p><p>Sure, commercial vendors could try and convince companies that certain changes are in their best interest despite their reservations, but no salesman in their right mind is going to push that type of “controversial” conversation very far.</p><h3>2. Valuable Independent Behavior</h3><p>The consumer software needs to have features that are extremely valuable to consumer and which do not require any direct relationship with companies. This will ensure interests are aligned with the consumer.</p><p>For example, this could include high quality information about the company and/or their products curated from knowledgeable experts in the community.</p><h3>3. Leverage Over Companies</h3><p>The consumer software product needs to eventually gain some form of leverage over companies which will allow for more powerful features and services without any strings attached. More specifically, there needs to be a situation where there is huge upside for the company to interact with the product and no downside for the consumer software to NOT interact with the company. In other words:</p><blockquote>You need me. I don’t need you.</blockquote><p>The obvious example here is if a significant portion of a company’s customers was using a particular consumer customer service product. In that situation, the consumer product would have the power to make a significant positive or negative impact to the underlying company.</p><h3>4. High Growth Business Model</h3><p>Now, before you say “well, duh”, you should realize that most consumer software for customer service gets this wrong. Typically, one of two critical mistakes is made with their business model:</p><ol><li>Just focus on user growth and don’t worry about making money until later. This works with some consumer software, but I’ve never seen it work in the customer service space. At the end of the day, someone has to pay for the party.</li><li>Focus on low hanging fruit revenue with no clear path to high growth. This is VERY common and again doesn’t usually work with consumer customer service software. The typical result of this strategy is enough revenue for a lifestyle business, but nothing that could rapidly grow to capture the entire market and change the world (which is what we are aiming to achieve).</li></ol><p>The problem with both of these is that there is an assumption a high growth model can be “figured out later”. In reality, most high growth models require fundamental changes in the product that are really difficult to simply add on down the road.</p><p>An example of a more viable high growth business model for this situation is to have the customer service software also provide purchase suggestions (making money off referrals). This can be tricky to implement, but I believe if you’re able to earn the consumer’s trust dealing with customer service issues, you can parlay that trust into suggestions for net new purchases. Referrals make higher margins than ads right off the bat and your value per user should grow exponentially as you get more users and become more of a trusted source.</p><h3>5. Organic Search + {{ somethingElse }}</h3><p>Customer service is by nature a reactive experience. A problem happens (often seemingly out of nowhere) and people react to it by contacting customer service. They don’t plan for it and they often would rather not think about it if they didn’t have to.</p><blockquote>The reactive nature of customer service makes product marketing VERY difficult.</blockquote><p>Organic search is extremely useful as a customer acquisition channel since it fits in perfectly with a common process people use to resolve customer service issues (i.e. doing a Google search for their issue and/or contact information for the company). The only challenge with organic search as the only channel is that it is often unpredictable even for the most experienced SEO experts.</p><blockquote>Organic search is table stakes, but it’s not enough.</blockquote><p>In order to grow really big, really fast (i.e. exponential growth) and take over the industry, consumer software also needs a way to reliably acquire users on a more proactive basis. This could mean a second marketing channel such as <a href="https://en.wikipedia.org/wiki/Influencer_marketing">using influencers</a> or it could mean focusing on an acquisition loop like referral programs.</p><p>Regardless of what it is, the point is that you need to have more control over growth than provided by organic search. You need to know that if you pour money into marketing it will yield a positive result on a consistent basis.</p><h3>6. Sticky</h3><p>Customer service is by nature unpredictable, ephemeral and sporadic. Even if you build something that is able to find a consumer at the exact moment of a problem and you are able to successfully resolve that problem quickly, what are the chances that consumer will remember you the next time they have an issue?</p><p>Not bloody likely.</p><p>Well, at least not without some other reason for users to come back to your product on a regular basis. That’s why it’s critical to combine the core customer service resolution feature with at least one other high value retention loop feature (ex. a popular daily newsletter). Otherwise you would have to attract net new users every month and that is typically an unsustainable strategy.</p><h3>End Game</h3><p>Customer service is fundamentally broken because companies have a much greater influence on most of the software mediums used to facilitate communication and resolution. In order to un-break customer service, we need a new medium that is fully capable of resolving customer service issues while remaining largely independent from company influence.</p><p>Easier said than done.</p><p>There’s a graveyard of consumer startups out there that have tried and failed. Many of the ones I know failed because they were missing one or more of the 6 characteristics mentioned in this article. In my opinion (and from my experience), these characteristics are not just “nice to haves” but requirements for effectively resolving customer service issues in the best interest of the consumer at scale.</p><p>And THAT is the end game. Flip the script so the interest of the consumer is more valued and create an environment where companies are incentivized to do better. In other words, the consumer wins, the software vendor wins, and (in the long run) the companies with the best customer service win.</p><p>😊</p><h3>Call to Action</h3><p>We’re working hard at <a href="https://gethuman.com/">GetHuman</a> to try and fulfill the vision outlined in this article. We want to un-break customer service.</p><p>The only thing is, we can’t do it alone.</p><p>I am a firm believer that competition is good. There are many different paths to success and the learnings from someone on one path can help others on the way to the same goal. Some of the content in this article comes from what I have learned watching hundreds of other consumer products in our space. My hope is that though this 4-part blog post series and future articles I will be able to help inspire and guide more entrepreneurs toward this same vision.</p><p>More than anything, I want this problem solved. I want better customer service. Join me and let’s venture down this path together.</p><p>👊</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a39b0d9d2e6d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[“Write once, run everywhere” is an anti-pattern]]></title>
            <link>https://medium.com/hackernoon/write-once-run-everywhere-is-an-anti-pattern-2e32e1dd5b93?source=rss-d1d326dd6a28------2</link>
            <guid isPermaLink="false">https://medium.com/p/2e32e1dd5b93</guid>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[nativescript]]></category>
            <category><![CDATA[ionic]]></category>
            <category><![CDATA[angular]]></category>
            <category><![CDATA[cordova]]></category>
            <dc:creator><![CDATA[Jeff Whelpley]]></dc:creator>
            <pubDate>Wed, 14 Mar 2018 21:25:25 GMT</pubDate>
            <atom:updated>2018-03-25T23:32:25.809Z</atom:updated>
            <content:encoded><![CDATA[<h3>“Write once, use everywhere” is an anti-pattern</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cOC-7H3CrCuOoDxIO5AzNg.jpeg" /></figure><p><em>The content of this article comes from work I have been doing on three different projects: </em><a href="https://gethuman.com/"><em>GetHuman</em></a><em>, </em><a href="https://swish.com/?utm_source=hackernoon&amp;utm_content=writeonce"><em>Swish</em></a><em>, and a new secret app for my upcoming </em><a href="https://sketchpoints.io/ngconf2018"><em>ng-conf 2018</em></a><em> talk called </em><a href="https://sketchpoints.io/ngconf2018/super-powered-server-rendered-progressive-native-apps"><em>Super-Powered, Server-Rendered Progressive Native Apps</em></a><em>.</em></p><p>In an ideal world, you could build one application that works consistently and perfectly on all platforms (i.e. web, iOS, Android, etc.) without worrying about the unique details of any one individual platform. Just code it up in some generic way and it just magically works everywhere. Unfortunately, <strong>we don’t live in that world today</strong> and any attempt to build a large multi-platform app under any other impression will inevitably lead to a world of pain, anguish and frustration (and/or a low quality app).</p><p>The problem at its core is that each platform has its own unique strengths that are often diminished or even completely eliminated by heavy abstractions. That doesn’t mean multi-platform development is bad. It’s just that (in most cases) it makes more sense to follow a slightly different approach. One that focuses more on building <strong>multi-platform products instead of multi-platform apps</strong>.</p><p>Before we go over this solution, however, let’s first talk in a little more detail about the problem.</p><h3>The Problem: Heavy Abstractions</h3><p>As mentioned, the main problem with multi-platform development is when a higher level abstraction (i.e. a facade) is too heavy and ends up adversely affecting some of the strengths of the underlying platforms. The term “too heavy” in this context, however, is completely subjective and depends entirely on the requirements of whichever app is using a particular facade.</p><p>So, that begs the question: how do we determine whether or not a multi-platform facade is too heavy for an app?</p><h4>When Facades are Good</h4><p>Facades that abstract multiple platforms can be really useful and valuable AS LONG AS the following conditions are met:</p><ul><li>Key features available — All of the key features of underlying platforms that are needed by an app need to be easily available (i.e. without jumping through a lot of hoops).</li><li>Performance sufficient — The performance characteristics that matter for an app must be close enough between the facade and the underlying platforms.</li><li>Easy to implement and maintain — The facade needs to save you time and money by making development easier. Otherwise, why bother?</li></ul><h4>When Facades are Bad</h4><p>In general, facades are more likely to be a poor fit for more apps when:</p><ul><li>The facade tries to do too much — The more features in the facade and the more the it tries to do, the harder it is to get right. Conversely, the thinner the facade, the greater the chances of success.</li><li>The facade is too high level — A generic wrapper around low level utilities for different platforms is usually pretty easy to build and maintain. A generic frontend view that is meant to abstract different platform specific views is really hard to pull off well.</li><li>The facade is custom — This may seem counter intuitive at first. You may think that if a company builds a thing, they will ensure it meets all their own requirements. Perhaps this is true sometimes, but in my experience a more likely outcome is that custom multi-platform facades degrade quickly over time into a complex mess of delicate hacks that no one wants to touch for fear of breaking the entire system.</li></ul><h4>Why “write once, run everywhere” is an anti-pattern</h4><p>The idea of “write once, run everywhere” is an anti-pattern when you treat it as the goal instead of a means to an end. When your primary objective is to maximize code re-use, you are more likely to choose facades that are missing key features and/or have significant performance issues and/or are difficult to maintain.</p><blockquote>Your true goal should really be <strong>building the </strong>best possible version of your product. That may or may not involve multiple platforms and that may or may not involve different levels of code sharing.</blockquote><h3>The Solution: Multi-platform Product with Single Platform Apps</h3><p>This article uses a lot of terminology that likely has different meanings to different people. The solution I am proposing for multi-platform development requires that we are all have the same definition of a platform, a product and an app as well as how they should all fit together.</p><h4>What’s a Platform?</h4><blockquote>A “platform” for the purposes of this discussion is a software environment that provides a set of constraints and low level capabilities for visual rendering.</blockquote><p>One important thing to keep in mind is that there are different levels of platforms. Higher level platforms act as facades for lower level platforms. Here are some examples of different platform levels:</p><ul><li>Level 1— iOS, Android, web browser</li><li>Level 2 — NativeScript, React Native (abstractions on top of iOS and Android)</li><li>Level 3 — Ionic (an abstraction on top of Cordova which is itself an abstraction on top of iOS and Android)</li></ul><h4>What’s a Product?</h4><blockquote>A “product” for the purposes of this discussion is one or more frontend apps created with the same language, managed together and designed to satisfy the specific needs of a particular market segment or mission.</blockquote><p>The key point here is that a product is not just one app. In many cases, a product involves a number of different apps working together for a common goal. For example, one product could include both a NativeScript app and a separate Progressive Web App as well as an administrator console on the web and a static marketing website.</p><h4>What’s an App?</h4><blockquote>An “app” for the purposes of this discussion is the smallest possible deployable package of frontend views that solve a specific problem for a set of users on one platform.</blockquote><p>There is quite a bit to unpack here, but I would imagine that this definition doesn’t necessarily match up with your own. Most people jam way too many features and give way too much responsibility to individual apps. In general, it seems much easier to simply add another feature to an existing app rather than build a new one. That is why there is a tendency to build a large, custom multi-platform facade that eventually becomes an albatross around the neck of an organization.</p><p>So…let’s not do that.</p><p>Instead of creating one massive app, let’s create one product that consists of many small apps where each deployable app unit does one thing really well for one platform.</p><h4>How should all these pieces fit together?</h4><p>There are many different ways to configure a product with small, single platform apps. Here is an example of one way to to do it for a JavaScript-based product called foo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*l3cV4teGLJl12hJ3b7n6WA.png" /></figure><p>This folder structure here depicts the code in a <a href="https://www.youtube.com/watch?v=oW9AhP8l3aU">product monorepo</a> that has a “platform sandwich” architecture:</p><ol><li>apps — A thin, platform-specific set of apps at the very top. In this example, there is a “viewer” app for NativeScript (called nativescript-viewer) and a separate “viewer” app for the web (called web-viewer). The functionality for each viewer app is similar, but the code is unique to the target platform.</li><li>libs — All the platform-agnostic, shared code in the middle. This layer has business logic and utilities that can be shared among all apps.</li><li>xplat — A thin, platform-specific set of low level libraries at the bottom. This layer contains shared code that can be used by all apps for a given platform as well as platform-specific adapters that can override generic stubs in libs (ex. uploadFile() in xplat/NativeScript can override the no-op uploadFile() stub in libs).</li></ol><p>Again, this is just an example of how to set up your product code. It is not the only way.</p><h4>Benefits of this Approach</h4><p>At a high level, the goal with this approach is to get the best of both worlds: easy access to the full capabilities of any given platform while still maximizing code reuse. Specific benefits include:</p><ul><li>Platform-App Fit — You can choose the appropriate platform level for your app. Sometimes it makes sense to go with Ionic. Other times it makes more sense to have separate iOS and Android apps.</li><li>Apps are Lightweight and Disposable — It’s soooooooo nice to be able to quickly build a new frontend quickly for an existing product. The world of frontend tech moves quickly and keeping your apps thin gives you a lot of flexibility to refactor/replace as needed.</li><li>Easier to Scale Team — As your team grows larger, it gets harder and harder to avoid team members stepping on each other toes. Using this approach, team members can work on separate apps and are much less likely to inadvertently block each other.</li><li>Easier to Understand — I have been using a version of this approach with my team at <a href="https://swish.com/?utm_source=hackernoon&amp;utm_content=writeonce">Swish</a> for the past few months and it has been amazing how quickly new developers can get productive and how few bugs slip into production. A huge win.</li></ul><h3>Closing Thoughts</h3><h4>The Future</h4><p>I started this article with the premise that almost any non-trivial, multi-platform app cannot be built in a completely generic way (i.e. the app will inevitably have logic for the underlying platforms somewhere).</p><p>But…things can change.</p><p>10 years ago, web developers often had to write code that specifically targeted Internet Explorer. Perhaps in 10 years from now, the web will make another huge leap to become a true first class citizen on all devices.</p><p>Who knows if that will happen, but if it does, then building for just one platform (i.e. the web) may actually become viable one day.</p><h4>More on This Topic</h4><p>As I mentioned earlier, we use the techniques described in this article for our <a href="https://swish.com/?utm_source=hackernoon&amp;utm_content=writeonce">spending tracker app</a> at Swish, but I also have some other related upcoming events:</p><ul><li><a href="https://twitter.com/wwwalkerrun">Nathan Walker</a> and I are building a new secret app with this approach that we are going to reveal during our talk at <a href="https://sketchpoints.io/ngconf2018">ng-conf 2018</a> called <a href="https://sketchpoints.io/ngconf2018/super-powered-server-rendered-progressive-native-apps">Super-Powered, Server-Rendered Progressive Native Apps</a>.</li><li>I am working on a blog post that will dive into the technical details of implementing all this with Angular. <a href="https://twitter.com/jeffwhelpley">Follow me on twitter</a> to hear about when that goes out.</li><li>I am also working on a blog post to specifically talk about SSR apps and how the approach outlined in this article plays really nicely with an <a href="https://www.ampproject.org/docs/integration/pwa-amp">AMP-to-PWA UX</a>.</li></ul><p>If you have thoughts on this topic, please post a comment here or reach out. I am doing a lot of work in this space and could use any and all feedback. Thanks!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2e32e1dd5b93" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hackernoon/write-once-run-everywhere-is-an-anti-pattern-2e32e1dd5b93">“Write once, run everywhere” is an anti-pattern</a> was originally published in <a href="https://medium.com/hackernoon">HackerNoon.com</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Isomorphic JavaScript is Dead… Long Live Isomorphic JavaScript!]]></title>
            <link>https://medium.com/hackernoon/isomorphic-javascript-is-dead-long-live-isomorphic-javascript-743e1b7b181c?source=rss-d1d326dd6a28------2</link>
            <guid isPermaLink="false">https://medium.com/p/743e1b7b181c</guid>
            <category><![CDATA[isomorphic-javascript]]></category>
            <category><![CDATA[dont-repeat-yourself]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[isomorphic]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Jeff Whelpley]]></dc:creator>
            <pubDate>Tue, 12 Dec 2017 17:12:10 GMT</pubDate>
            <atom:updated>2018-03-25T23:34:09.447Z</atom:updated>
            <content:encoded><![CDATA[<iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F2fx4F0tdvN0%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D2fx4F0tdvN0&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F2fx4F0tdvN0%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/704381454134990d5c6db847a54794fe/href">https://medium.com/media/704381454134990d5c6db847a54794fe/href</a></iframe><p>This video was me just 2 years ago at ng-conf talking about how Isomorphic JavaScript was going to take the world by fire. At that time, the idea of duplicating code in two places (i.e. once on the server for search engines and another on the client for rich user interfaces) made me sick. <a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself">DRY</a> rules!</p><p>Well…a lot has happened since then. Specifically, a few specific things have drastically affected the way I view the concept of Isomorphic JavaScript:</p><ul><li>I had to grow and maintain a large codebase over time. In many cases the “tricks” I used to make my code “Isomorphic” ended up causing more problems than they solved.</li><li>My team grew much larger and I began to realize that training someone to understand the subtleties of Isomorphic JavaScript development was nontrivial (and extremely prone to error).</li><li>The pace of shipping product features within my team grew exponentially. I eventually realized that ultra-DRY code often created tight dependencies that actually prevent fast iteration cycles (i.e. you can’t change one piece of code quickly for fear of adversely affecting many other dependent pieces of code)</li><li>Much better server rendering solutions came around (including one that I helped build as part of the <a href="https://github.com/angular/universal">Angular Universal</a> team)</li><li>Trying to optimize for BOTH initial load performance and content reading versus long lived usage and rich interfaces is…well, frankly, impossible. Sure, you can sort of do an OK job at both, but they are very much at odds for when you want to have the absolute best possible experience.</li></ul><p>I talk a little about all of this in one of my latest talks on code management at AngularConnect:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FoW9AhP8l3aU%3Fstart%3D17%26feature%3Doembed%26start%3D17&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DoW9AhP8l3aU&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FoW9AhP8l3aU%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/d21c275b1f666d8ae556696fa307fcf3/href">https://medium.com/media/d21c275b1f666d8ae556696fa307fcf3/href</a></iframe><p>For all of these reasons, I truly believe that Isomorphic JavaScript is dead. Well…at the very least the concept of Isomorphic JavaScript where you could just take an app build for the client and then just let it magically work on the server. I don’t buy into that at all anymore.</p><h3>The New “Isomorphic”</h3><p>Instead, I believe the future is all about <strong>authoring</strong> your platform-specific code in one place (i.e. you can have your SEO code together with your rich client code in the same repo), but then having different parts of your app specialized for only one or the other. In other words:</p><ul><li><strong>Landing Pages</strong> — Only server rendered with little to no client side JavaScript. Focused on maximum initial load performance and content delivery.</li><li><strong>App Pages</strong> — Only client rendered with perhaps just an app shell on the server side. Focused on the best possible rich user experience.</li></ul><p>These two can live on the same domain with the same website (and in many cases should). For example, check out the <a href="https://gethuman.com/phone-number/United-Airlines">United Airlines Phone Number</a> page on GetHuman.com. It is only server rendered with no client side JavaScript. However, if you click on a link (for example, the “Skip Waiting on Hold Button”) you will start to interact with a series of pages that are client loaded and have some rich features.</p><h3>Final Word on AMP</h3><p>Oh, and one more thing…when you start to go down this path there is an added bonus. The server-only landing pages you create should be very close to <a href="https://www.ampproject.org/docs/reference/spec">the AMP specification</a>. It shouldn’t take you too much work to “AMPify” you pages which should yield even more benefits for the user experience during initial load. I am going to be talking a lot more about this at <a href="https://sketchpoints.io/ngconf2018">ng-conf 2018</a> with my talk, <a href="https://sketchpoints.io/ngconf2018/super-powered-server-rendered-progressive-native-apps">Super-Powered, Server-Rendered Progressive Native Apps</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=743e1b7b181c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hackernoon/isomorphic-javascript-is-dead-long-live-isomorphic-javascript-743e1b7b181c">Isomorphic JavaScript is Dead… Long Live Isomorphic JavaScript!</a> was originally published in <a href="https://medium.com/hackernoon">HackerNoon.com</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Budget Burn Down]]></title>
            <link>https://medium.com/swishmoney/budget-burn-down-696f4d1faddc?source=rss-d1d326dd6a28------2</link>
            <guid isPermaLink="false">https://medium.com/p/696f4d1faddc</guid>
            <category><![CDATA[budgeting]]></category>
            <category><![CDATA[fintech]]></category>
            <category><![CDATA[money]]></category>
            <category><![CDATA[saving-money]]></category>
            <category><![CDATA[apps]]></category>
            <dc:creator><![CDATA[Jeff Whelpley]]></dc:creator>
            <pubDate>Wed, 01 Nov 2017 17:54:07 GMT</pubDate>
            <atom:updated>2018-03-25T23:37:21.338Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*t66QcxvMVOVOgi8pwrN7mw.png" /></figure><p><em>This article describes a relatively new budgeting technique called Budget Burn Down which has already helped hundreds of thousands of people save money and achieve their financial goals.</em></p><h3>Story Time</h3><p>It was a dark and stormy night. Beads of sweat began to roll down Roger’s forehead as his eyes darted nervously back and forth between the pitch black forrest road ahead and the red warning light on his dingy, old gas gauge.</p><p>Roger was lost. Completely, utterly, hopelessly lost.</p><p>“Shit.”</p><p>Roger’s anxiety turned into full blown panic as he felt the car go dead. He frantically started pressing the gas pedal harder and harder. No go. He looked at his phone again. Still no bars.</p><p>“Shit!”</p><p>Roger managed to guide his car over to the side of the road as it slowly rolled to a stop. For a full minute, Roger couldn’t move. He sat frozen with fear staring straight ahead while his mind raced through his worst nightmares.</p><p>“How could I have been so stupid?”</p><h3>Turning our Fear into Power</h3><p>Make no mistake. Running out of gas sucks. Perhaps the worst part about it is that in most cases it is a fairly avoidable mistake. So, let me ask you:</p><blockquote>When’s the last time you ran out of gas?</blockquote><p>Don’t worry, I’m not asking you a deep philosophical question about your life or anything like that. I am literally asking, “When is the last time you were driving a motor vehicle and it stopped moving because you ran out of gas?”.</p><p>Chances are, you can count the number of times this has happened throughout your entire life on one hand. Sure, when it happens it really sucks, but objectively speaking it almost never happens. Why is that?</p><p>In most cases, it is because of the following three factors:</p><ol><li>Gas costs money and is not always easily available</li><li>It would really, really suck to completely run out of gas (especially alone in a dark forest in the middle of the night)</li><li>We know how much gas we have left at any moment by quickly glancing at the gas gauge</li></ol><p>Or, from a more general sense:</p><ol><li>There is a valuable, <strong>diminishing resource</strong></li><li>There are <strong>significant consequences</strong> if that resource is ever fully depleted</li><li>A simple, <strong>intuitive monitoring</strong> <strong>system</strong> exists to see how much of that resource is left at any given time</li></ol><p>Whenever you can set up a situation in your life where these three conditions exist, you have the opportunity to create a powerful force for driving positive change.</p><h3>The Cash Envelope System</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/675/1*uAcc7bz6dRhph5tCDwcEYw.jpeg" /></figure><p>One example of how some of this can be applied to saving money is <em>The Cash Envelope System</em> which has been touted for years by finance gurus like <a href="https://www.daveramsey.com/blog/envelope-system-explained">Dave Ramsey</a> and blogs like <a href="http://www.abowlfulloflemons.net/2016/09/the-cash-envelope-system.html">A Bowl Full of Lemons</a>. As explained in <a href="https://en.wikipedia.org/wiki/Envelope_system">wikipedia</a>:</p><blockquote>The key idea is to store the cash to meet separate categories of household expenses in physically separate envelopes.</blockquote><p>At the beginning of each time period (usually a week) you put cash in the appropriate envelopes. Once an envelope is empty, you can’t buy any more items from that category until the next period.</p><p>This system works really well for a lot of people because (just like with the gas gauge example) there is a clear and straightforward way to see how much money you have left to spend for a particular category (i.e. how much cash is left in the envelope). However, this system has several flaws:</p><ul><li><strong>Time &amp; Effort</strong> — Setting up and maintaining this system is non-trivial. For some people this is a feature, not a flaw. The extra effort gets them more emotionally involved in the process. For many others, however, this is too much work and prevents them from sticking with this system.</li><li><strong>Categorization Craziness</strong> — At first it may seem like separate envelopes for separate categories makes sense. But…what about when you have an expense for a category that doesn’t exist? What if an expense covers multiple categories? What happens if half way through a period you realize that one category should be split into two? It can get complicated.</li><li><strong>Unnecessarily Restrictive </strong>— The ultimate goal is to save money. Does it matter that you go over hundreds of dollars in one category if you are actually way under budget overall? If anything the categories are a means to an end.</li><li><strong>Non-intuitive Monitoring</strong> — One envelope is easy to monitor. A dozen envelopes? Not so much. It can take several minutes to determine your financial health at any given moment and that is way too long.</li><li><strong>Cash is Not Always King</strong> — Yes, there are a number of <a href="https://www.psychologytoday.com/blog/the-science-behind-behavior/201607/does-it-matter-whether-you-pay-cash-or-credit-card">psychological benefits to using cash instead of credit cards</a>. However, for many people (including me) those benefits are not worth the pain of dealing with cash. I would much rather get rid of my wallet altogether and use my phone to pay for everything if possible.</li></ul><p>What some of us really need is a much simpler form of the Cash Envelope System that addresses some of these issues. That is where Budget Burn Down comes in.</p><h3>The Budget Burn Down System</h3><p>The best way to explain Budget Burn Down is to go back to those three conditions for driving positive change (i.e. Diminishing Resource, Significant Consequence and Intuitive Monitoring).</p><h4>1) Diminishing Resource: Free Spend</h4><p>What is the one primary resource we care about when it comes to saving money? Your bank balance by itself will not help here because that number only helps describe the current state. It does not capture anything related to the future which is needed for planning purposes. What we really need is something more like this:</p><ul><li>Expected income (or budget if no income) for a given month</li><li>Minus expected bills during that month</li><li>Minus desired savings goal for that month</li><li>Minus expenses to date through the month</li></ul><p>The resulting number from this equation is called <em>Free Spend</em> and it is the single most important financial metric to help you save money. This one number is more simple and can be more powerful than the many different category cash amounts used with the Cash Envelope System.</p><h4>2) Significant Consequence: Spending Bankruptcy</h4><p>What consequence do you think is more impactful to your daily behavior?</p><ul><li>Once you run out of your clothes budget you can’t buy any more clothes</li><li>Once you run out of money you can’t buy <em>anything</em></li></ul><p>It is true that the first option can be more effective at curbing a specific bad spending habit. For example, if you were generally a frugal spender but the amazingly delicious ham and cheese croissants at <a href="https://flourbakery.com/">Flour Bakery</a> puts you over budget every month, then something like Cash Envelope could be really effective.</p><p>In most cases, however, saving more money requires behavioral changes across the board. Thinking in terms of individual categories can create unnecessary distractions and almost certainly waters down the potential consequences of not hitting your goal.</p><h4>3) Intuitive Monitoring: Realtime Free Spend</h4><p>The more simple and focused the monitoring, the easier it will be for you to understand where you stand at any given point in time and enable you to adjust your behavior accordingly. For example:</p><blockquote>$173.53 left for 2 days this week</blockquote><p>All you have to worry about each and every day is making sure this number is not going to drop down to zero. Forget about trying to budget for dozens of different categories or do any mental arithmetic. Just keep an eye on this one number.</p><h3>The Psychology Behind Budget Burn Down</h3><p>Back in 2003, authorities in city of Garden Grove, California were <a href="https://www.wired.com/2011/06/ff_feedbackloop/">grappling with a big problem</a>. Too many people were speeding through school zones. They tried a number of different tactics to curb this behavior but speeding cars continued to hit bicyclists and pedestrians in the school zones with depressing regularity.</p><p>Then, they tried something that was quite unique at that time:</p><blockquote>“…they put up what are known as dynamic speed displays, or driver feedback signs: a speed limit posting coupled with a radar sensor attached to a huge digital readout announcing YOUR SPEED”</blockquote><p>This experiment proved wildly successful with the average speed dipping below the posted speed limit at all Garden Grove schools. Motor vehicle accidents involving bicyclists and pedestrians dropped dramatically. The use of these dynamic displays quickly expanded throughout the state and then, ultimately, the entire nation.</p><p>The reason for this success (and the reason for the success of the Budget Burn Down system) can be explained by the idea of <a href="https://www.wired.com/2011/06/ff_feedbackloop/">Feedback Loops</a>:</p><blockquote>“The signs leverage what’s called a <strong>feedback loop</strong>, a profoundly effective tool for changing behavior. The basic premise is simple. Provide people with information about their actions in real time (or something close to it), then give them an opportunity to change those actions, pushing them toward better behaviors. Action, information, reaction.”</blockquote><p>I love how succinctly this captures the essence of the Budget Burn Down system.</p><p>Action. Information. Reaction.</p><h3>Final Thoughts</h3><p>Budget Burn Down is most definitely NOT for everyone. Some people simply prefer Cash Envelope or some other budgeting technique (or nothing at all).</p><p>However, as proved by <a href="https://techcrunch.com/2017/08/04/level-money-shutting-down/">the former Level app</a>, it can be amazingly effective for people that want something simple and who are highly motivated by a good financial feedback loop.</p><p><em>Ready to get started? We just launched a new app that automates Budget Burn Down by showing your Free Spend in realtime. It’s called Swish and it’s available today on </em><a href="https://swish.com/"><em>the web</em></a><em>, </em><a href="https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=1299859852&amp;mt=8"><em>iOS</em></a><em> or </em><a href="https://play.google.com/store/apps/details?id=com.gethuman.swish&amp;hl=en"><em>Android</em></a><em>.</em></p><p><em>Also, if you like hearing more from Jeff, keep an eye out for his upomcing </em><a href="https://sketchpoints.io/ngconf2018"><em>ng-conf 2018</em></a><em> talk entitled, </em><a href="https://sketchpoints.io/ngconf2018/super-powered-server-rendered-progressive-native-apps"><em>Super-Powered, Server-Rendered Progressive Native Apps</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=696f4d1faddc" width="1" height="1" alt=""><hr><p><a href="https://medium.com/swishmoney/budget-burn-down-696f4d1faddc">Budget Burn Down</a> was originally published in <a href="https://medium.com/swishmoney">SwishMoney</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Problem with Shared Code]]></title>
            <link>https://medium.com/@jeffwhelpley/the-problem-with-shared-code-124a20fc3d3b?source=rss-d1d326dd6a28------2</link>
            <guid isPermaLink="false">https://medium.com/p/124a20fc3d3b</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[github]]></category>
            <category><![CDATA[monorepo]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[software]]></category>
            <dc:creator><![CDATA[Jeff Whelpley]]></dc:creator>
            <pubDate>Tue, 15 Aug 2017 15:40:04 GMT</pubDate>
            <atom:updated>2017-08-22T10:30:03.709Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/778/1*NJF7lpGTkoxYYCPwuXGuOA.png" /></figure><p>This is the first of a 4-part series on the best practices for organizing code repositories.</p><ul><li>Part 1: The Problem with Shared Code (this article)</li><li>Part 2: How the Best Tech Companies Organize Code (coming soon)</li><li>Part 3: Monorepo vs Multirepo Survey Results (coming soon, but <a href="http://whlp.ly/survey-repo">fill out the survey here</a>)</li><li>Part 4: Repo Decision Framework (coming soon)</li></ul><p>In this first article we define the problem and understand the challenges involved with sharing code.</p><p>Earlier this year, my company <a href="https://gethuman.com/">GetHuman</a> raised money and grew from 2 engineers to 8. The good thing about this is that we were able to start writing a lot more code. The bad thing about this is that we started writing a lot more code.</p><h3>The Problem</h3><p>Back when it was just my co-founder and me, there were very few formal development processes. We just hacked away and pushed into production at will. It worked because we both knew every line of code. It was easy to coordinate changes because we were essentially single threaded on most projects.</p><p>That all changed after we hired 6 more developers and the new team started cranking. Not only were there more commits on a daily basis, but the types of commits became more diverse and complex. The interesting thing is that while our overall output increased, the productivity of each individual developer actually decreased. The primary reason for this can be boiled down to one simple statement:</p><blockquote>Sharing code efficiently at scale is hard.</blockquote><p>To be clear, sharing code is not hard. There are many different ways to share code in general and most of them are relatively easy to implement. The hard part is doing it <em>efficiently at scale</em> which means:</p><ol><li>Multiple code modules (that share some code)</li><li>Multiple team members</li><li>High rate of change</li><li>Little to no loss of individual productivity</li></ol><p>When your goal is to have all four of these conditions exist at the same time, you will almost certainly run into some challenges.</p><h3>Scalability Challenges</h3><p>Over the past year, most of the issues we had scaling our codebase fall into one of the following categories:</p><ul><li>Refactoring</li><li>Versioning</li><li>Testing</li><li>Reviewing</li><li>Consistency</li><li>Deploying</li><li>Size</li></ul><p>Each category is described in more length below.</p><h4>Refactoring</h4><p>Let’s say that we want to change a field in a shared data model from “isSubscriber” to “subscriberFlag”. You could just publish that one line code change and let any code using that data model break or you can try to update all references to “isSubscriber” at the same time throughout your code base. Many code editors are good at doing this, but all the code must be loaded in the editor at the same time.</p><p>This can be a major source of pain as your codebase grows larger. For example, at one point, we had 42 npm modules split among 15 different repos. It was nearly impossible to use Webstorm with all of this code (it would lock up on a regular basis to re-index). VS Code is better because it generally doesn’t lock up, but intellisense is often unavailable (I suspect because of a similar need to constantly re-index code in the background).</p><h4>Versioning</h4><p>Whenever a downstream dependency is updated, you have a choice:</p><ol><li>Let the upstream modules upgrade at some point in the future</li><li>Force all upstream modules to upgrade immediately</li></ol><p>In either case, there is some overhead. With option 1, you must maintain multiple versions of the downstream dependency. With option 2, you need to update and test all upstream modules right away.</p><p>Perhaps an even bigger issue with versioning, however, is when you need to go back in time. This can be a huge (i.e. nearly impossible) challenge if your codebase is split among dozens of different repos and you need to figure out where and when a bug was introduced into the system.</p><h4>Testing (for JavaScript)</h4><p>In general, integration and end-to-end (e2e) tests can be tricky. For JavaScript, the challenge with testing multiple local dependencies can be best summarized by this well known JavaScript adage:</p><blockquote>“npm linking sucks, yo”</blockquote><p>Theoretically you should be able to npm link all your local dependencies while you make changes. In practice, however, this rarely works well when you have a large number of interdependent npm modules. The overhead involved is non-trivial (ex. see how long it takes you to npm link 3+ modules together) and a wide variety of tricky issues crop up on a seemingly regular basis (i.e. like <a href="https://github.com/Microsoft/TypeScript/issues/6496">this nasty TypeScript issue</a> or <a href="https://github.com/angular/angular/issues/13005">this annoying Angular issue</a> or <a href="https://github.com/babel/babel-loader/issues/149">this Babel issue</a> or <a href="https://github.com/webpack/webpack/issues/985">this Webpack issue</a> or <a href="https://github.com/webpack/webpack/issues/784">this other Webpack issue</a>…you get the point).</p><h4>Reviewing</h4><p>We always try to keep each <a href="https://yangsu.github.io/pull-request-tutorial/">Pull Request</a> (PR) as small and specific as possible. However, sometimes even small, targeted updates require changes across several different repos. Each repo involved requires the overhead of another PR. On top of that, it is hard for reviewers to understand the full scope of the change since they have to look across all the PRs involved.</p><p>There is also a question of ownership. Who is responsible for reviewing a particular PR? At scale it is not feasible to have everyone review every PR. There are actually two levels of issues here.</p><ol><li>First, how do you set up a system where the right people can review the right PRs at the right time?</li><li>Second, how do you ensure that whatever system you setup to answer the first question doesn’t create an untenable matrix of gatekeepers who grind productivity to a halt?</li></ol><p>Individual repo owners acting as gatekeepers can be a real problem in some organizations. When I worked at Wells Fargo, the overhead involved with convincing another team to allow us to make a particular change in “their” repo often made us think twice about making the change in the first place.</p><h4>Consistency</h4><p>Somewhat related to the review process is how to best keep a consistent set of standards across the entire code base. This is pretty easy with 2 or 3 developers when everyone can review every change, but what about when there are dozens of developers (or more) and they push in hundreds of changes (or more) every day?</p><h4>Deploying</h4><p>While we started off with many different smaller repos, we experienced some of the issues described above and at one point we tried to consolidate everything into one larger repo. We quickly ran into a major issue, however. It turns out that a large majority of the most popular deployment tools are completely incapable of effectively handling multiple disparate deployment configurations. They all expect exactly one configuration file. For example:</p><p><a href="https://circleci.com/integrations/github/">CircleCI</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/959/1*byDhbEpeCTqQzfYHHwvR0Q.png" /></figure><p><a href="https://docs.travis-ci.com/user/getting-started/">TravisCI</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/482/1*4qL1LByWWsLUokuuLxmnMA.png" /></figure><p><a href="https://documentation.codeship.com/pro/builds-and-configuration/steps/">Codeship</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/839/1*F6W-jWfw94CnSnJcj3jpZw.png" /></figure><p>You can, of course, deploy multiple packages, but they must all be part of the same configuration. This is a problem if you want to independently manage different deployable projects in one repo.</p><h4>Size</h4><p>Another major challenge with trying to use one repo for everything is size. The common wisdom with hardware is that it is generally easier in the short term to scale vertically (i.e. add more memory or more CPU), but it is better in the long term to scale horizontally (i.e. add more machines). This same logic holds true for code repositories as well.</p><p>The size of any given repo does not generally matter until you get to the point where day-to-day operations are affected. Some of the signs that your repo may be getting to big include:</p><ul><li>Cloning taking minutes to complete and sometimes fails</li><li>Merging taking too long</li><li>Repo not able to fit on some developer laptops</li></ul><p>In general, dealing with a large repo can be troublesome at best and will only get worse over time unless steps are taken to deal with the size (more on that in Part 2 of this series).</p><h3>OK, so what do we do about all this?</h3><p>I am fairly certain that almost all professional software developers have encountered at least some of the issues described in this article at some point in their careers. Many of these developers do truly care about finding good solutions so that they can share code efficiently at scale.</p><p>The weird thing, however, is that as important and prevalent as this issue is, there are not a lot of great resources out there. There are no doubt many articles written about specific solutions at specific companies, but I have found almost all of them lacking in the detail and flexibility needed to implement the solution I need for my current situation.</p><p>So, I have two very specific goals for this 4 part blog post series:</p><ol><li>Create a decision framework that anyone and everyone can use to help them figure out which solution(s) would work best for their current situation.</li><li>Identify specific tooling and implementation details for each potential solution.</li></ol><p>I don’t think that there is one perfect solution that will work for everyone, but I do think that many different companies have figured out solutions that work well for them. The key is to coalesce this knowledge into one cohesive and digestible package. That is exactly what I hope to accomplish with the next part in this blog post series, “How the Best Tech Companies Organize Code”.</p><p>I haven’t published the other 3 articles yet, but once I do, I will update this article with links:</p><ul><li>Part 1: The Problem with Shared Code (this article)</li><li>Part 2: How the Best Tech Companies Organize Code (coming soon)</li><li>Part 3: Monorepo vs Multirepo Survey Results (coming soon, but <a href="http://whlp.ly/survey-repo">fill out the survey here</a>)</li><li>Part 4: Repo Decision Framework (coming soon)</li></ul><p>In the meantime, please add comments below and/or <a href="https://twitter.com/jeffwhelpley">hit me up on Twitter</a> with your thoughts and opinions on this topic.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=124a20fc3d3b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Angular Nation]]></title>
            <link>https://medium.com/angular-nation/angular-nation-74556dc9ddc5?source=rss-d1d326dd6a28------2</link>
            <guid isPermaLink="false">https://medium.com/p/74556dc9ddc5</guid>
            <category><![CDATA[angular2]]></category>
            <category><![CDATA[angularnation]]></category>
            <category><![CDATA[angularjs]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Jeff Whelpley]]></dc:creator>
            <pubDate>Mon, 19 Sep 2016 19:51:34 GMT</pubDate>
            <atom:updated>2018-03-25T23:40:29.955Z</atom:updated>
            <content:encoded><![CDATA[<h3>What is Angular Nation?</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IvsM_8sWfe4a7QNckZ4cKw.jpeg" /></figure><p><em>Note that this article is pretty old by this point, but is still relevant. It’s April, 2018 and I am about to speak at </em><a href="https://sketchpoints.io/ngconf2018"><em>ng-conf 2018</em></a><em> about </em><a href="https://sketchpoints.io/ngconf2018/super-powered-server-rendered-progressive-native-apps"><em>Super-Powered, Server-Rendered Progressive Native Apps</em></a><em> so definitely check that out once it goes live.</em></p><p>Angular Nation is the idea that all of us in the Angular community are connected together by a common set of goals and ideals including:</p><ol><li><strong>Be a bridge builder </strong>— Respect everyone inside and outside the Angular community. Help others learn from your experiences.</li><li><strong>Think at scale</strong> — Value things that allow you to scale both in terms of developers and end users.</li><li><strong>All-in-one</strong> — One unified set of tools for app development that can be used on nearly every platform (i.e. browser, web server, mobile, desktop, etc.)</li></ol><p>This website is dedicated to all the kindred spirits across the globe who believe in these ideals and want to see the Angular community grow and prosper.</p><p>Here is how it works:</p><ol><li><a href="http://bit.ly/ng-story">Tell us about your experience using Angular at work</a></li><li>We may email you back to ask you questions about your experience</li><li>Periodically (about once a month) we will create a high-quality blog post that highlights important points and/or themes from the all the stories submitted by the community.</li></ol><p>The goal is to have content that is entertaining, educational, inspiring and will help bring all of us in Angular Nation closer together.</p><h3>FAQs</h3><h4>How is this different than any other Angular blog?</h4><p>There are plenty of ways to get technical content about Angular. The difference here is that blog posts will focus more on people and organizations. For example, a typical technical article may explain how to best utilize TypeScript with Angular or the step-by-step details of how to use the CLI. An Angular Nation article, on the other hand, will focus (for example) on a story about how an organization initially struggled to get buy in from developers into TypeScript or the process another organization went through to decided between Angular Native, Angular Ionic and other mobile options.</p><h4>Why should I submit my story to AngularNation.org?</h4><p>The biggest and most important reason is that your submission will be used to help the Angular community. Other people can learn from your experience and we can start to identify Angular DX issues that need to be addressed.</p><p>A secondary benefit of your submission is that we will (at your request) promote a company and/or product that is related to your story. This is not a commercial, though. It will be a mention and a link back to whatever you want.</p><h4>What if my story contains private information?</h4><p>We will respect any request for privacy. Also, if your story is mentioned in a blog post you will be able to review the post before it goes live.</p><h4>What do I get out of writing for AngularNation.org?</h4><p>Similar to why someone would submit a story, writers should get satisfaction from knowing they are helping others in the community and there is recognition in terms of promotion for a company/product and a link.</p><p>Oh, and also you get to work with me (Jeff) and other editors who will help you generate an amazing post that draws a large audience.</p><p><a href="https://docs.google.com/forms/d/e/1FAIpQLSe5qXdL-UDQ865OwzcGyLuPGmtQrRTEfc0_9ri1Gaxc69XiwA/viewform">Let us know</a> if you would like to write for Angular Nation.</p><h4>What else can I do for my fellow citizens of Angular Nation?</h4><p>So glad you asked. There is so much you can do to help others, but here are a couple ideas:</p><ul><li>Participate in conversations on the <a href="https://gitter.im/angular/angular">Angular gitter</a> channel</li><li>Help fix <a href="https://github.com/angular/angular/issues">GitHub issues</a></li><li><a href="https://docs.google.com/forms/d/e/1FAIpQLSdNfCEgxg4bxqidfa5Z4dzjxFsuMKT9TZqibW_EAjJTs_qgMA/viewform">Sign up as a volunteer</a></li></ul><p>Note that if you sign up as a volunteer, the short term process will involve a simple email back with some ideas. Eventually, though, we will refine this process and start automatically matching you up with specific areas of need.</p><p><em>The author, Jeff Whelpley is the CTO of GetHuman. GetHuman is the place you go for things like finding the </em><a href="https://gethuman.com/phone-number/United-Airlines"><em>United Airlines phone number</em></a><em>. Also check out his latest project, a simple </em><a href="https://gethuman.com/phone-number/United-Airlines"><em>spending tracker</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=74556dc9ddc5" width="1" height="1" alt=""><hr><p><a href="https://medium.com/angular-nation/angular-nation-74556dc9ddc5">Angular Nation</a> was originally published in <a href="https://medium.com/angular-nation">Angular Nation</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Angular Native]]></title>
            <link>https://medium.com/@jeffwhelpley/angular-native-77e82687c579?source=rss-d1d326dd6a28------2</link>
            <guid isPermaLink="false">https://medium.com/p/77e82687c579</guid>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[nativescript]]></category>
            <category><![CDATA[angular2]]></category>
            <dc:creator><![CDATA[Jeff Whelpley]]></dc:creator>
            <pubDate>Sun, 18 Sep 2016 10:26:15 GMT</pubDate>
            <atom:updated>2016-09-18T19:45:51.714Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>NOTE: In this article wherever I say “Angular”, I am referring to “Angular 2”. When I am talking about Angular 1.x, I explicitly say “Angular 1”</blockquote><p>I am just starting to dive deep into NativeScript with Angular and I realized the one thing that really bothers me about it. No, it is not the single thread limitation (that will be <a href="https://github.com/NativeScript/NativeScript/issues/85">resolved very shortly</a>). It’s the name. I know this may sound silly, but despite <a href="https://twitter.com/toddanglin/status/776455709651267584">recent growth</a>, I just think it would greatly benefit the adoption of both NativeScript and Angular if the integration between the two was renamed “Angular Native”.</p><p>Here are my reasons for suggesting this change:</p><ol><li><strong>Short and sweet</strong> — “NativeScript with Angular 2” is a mouthful and not necessarily intuitive. I know this is non-scientific, but “Angular Native” just sounds and feels better to me. After some quick polling of the community, many others seem to feel the same way.</li><li><strong>Juxtaposes React Native</strong> — Let’s be honest here. NativeScript is not competing that much for mindshare with <a href="http://ionic.io/">Ionic</a> or other Cordova-based technology. Ionic has a completely different approach, feature set and goals (perhaps the subject of a separate blog post). NativeScript is, however, going directly head-to-head with React Native. As such, why not just simplify things for developers. React Native is to React as Angular Native is to Angular. See? Simple.</li><li><strong>Helps NativeScript adoption</strong> — Did you notice how much bigger the TypeScript community got when it became the de facto language of choice for Angular moving forward? The name “Angular Native” implies a similar de facto choice and would likely lead to the same uptick in NativeScript adoption.</li><li><strong>Helps Angular adoption </strong>— There a number of local organizations I know of in Boston that initially chose to adopt React because of React Native. They wanted to build a native mobile app with JavaScript and React Native seemed like the only viable choice. Once they started using React Native, then it made sense to start using React in other places as well. I have no problem whatsoever with anyone using React. I really like React. The thing I don’t like is when developers or organizations make decisions based on hype. The reality is that NativeScript is just as good as React Native. The difference between them (just like the different between Angular and React) is more a matter of philosophy and approach than capabilities. By using the term “Angular Native” what we are implying is that you can do the same type of thing with Angular as you can with React. This focuses the decision of React vs Angular more on what fits in best with their team rather than whether or not one capability exists. When that happens, it is my belief that Angular adoption increases (another topic for its own blog post in the future).</li></ol><p>In one sense, it’s just a silly name. Who cares? It is my experience, however, that names really do matter when it comes to perception and the ease at which ideas can be spread. The impetus for this article really came from my desire to have an easier way to convey what I am talking about to other developers. I have already started reaching out to people on the NativeScript and Angular sides to see if we can gain consensus about this so we can do an official re-brand. However, even if that doesn’t work for whatever reason, I am going to just start unofficially calling it “Angular Native” and I encourage you to do the same.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=77e82687c579" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>