• Dropping SaaS

    The mantra in bootstrapping circles for the past while has been “charge more”. And the best way to charge more, over time, is a SaaS. So it’s natural that most bootstrapers default to a SaaS pricing model when starting their new projects and companies.

    I’m no different. I build web-apps professionally and have for the past 10 years. Web apps are my bread and butter.

    But when I compare my successful SaaS projects to my successful desktop app projects, no matter the metric, I’ve always made more when I charge less and charge it once.

    And since I’ve been so focused on SaaS and this charge more mentality, I’ve automatically dismissed ideas that I had that weren’t SaaS.

    After attempting to build a number of web apps independently I’ve mostly stopped midway through. The slog of getting the basics perfect, managing servers, dealing with recurring payments, it’s too much like my day-job.

    And so I find myself considering going back to my old bread and butter for side-projects: native apps for the Macintosh.

    So far I’ve got a few ideas for small utility apps. The ones I’m most interested in are the ones that fit in the open web and apps that can help increase privacy for its users.

    It’s been a breath of fresh air and I’m excited to be having fun making things again.

  • A Glimpse of the Future

    One of the common memes to come from covid19 is to post a before-after photo of a famous city or landmark. The before covid19 photo is the city as we’ve become accustomed to it: brown air full of smog. The after covid19 at the same location, but with naturally blue skies and clear air.

    With everyone social distancing and automobile/truck traffic near zero we have been given a rare opportunity. We no longer have to imagine what our air and cities could be like if we didn’t drive pollution emitting vehicles everywhere, we can see, taste, and smell it with our own eyes.

    Air pollution from cars and trucks have been suffocating our cities slowly, like one boil’s a frog, so we acclimate and brown air becomes “normal” and the way things have always been. With the burner temporary malfunctioning we can see just what a precarious position we’ve put ourselves in.

    When this is all done and our lungs have acclimated to clean air we’ll have a choice: do we go back to the way things were and forget what we’ve experienced, or do we the courage to demand a change.

    https://twitter.com/sistercelluloid/status/1249027255797460993

  • The Slow Web

    It's been almost 5 years since I wrote Slow is not a Dirty Word. Reflecting on the sentiment in that article, that the best things in life take time and we needn't rush as society tries to force us, didn't quite go far enough. The concept of Slow should also be applied to the web.

    The Slow Web


    What is the slow web? At it's core it's the idea that we shouldn't fill our mind with junk and we should connect with those around us. Social media is fast food for the mind. Consuming it feels in the moment, but when you look back you're not left with anything memorable. Moreover, because of the lack of nuance afforded by platforms, such as Twitter, it encourages behavior based on dopamine and adrenaline impulses.

    • The slow web is formulating your thoughts and expressing them fully. 
    • The slow web is about owning what you produce.
    • The slow web is open.
    • The slow web is yours.

    The Slow Web in Practice


    Most people the slow web is best manifested as a blog. This could be a simple Wordpress blog, a micro.blog, a bunch of static files on a server somewhere, anything that works for you. The important part is that you have control of your content. That you can control how and when it appears.

    Sharing


    So much of sharing on the web these days is based on these social media platforms. So how do you get the word out about your new latest pieces in the slow web?

    • Writing unique content that matters to you and like-minded people will find it via search
    • RSS Feeds (standard in most all blogging systems)
    • POSSE (Publish (on your) Own Site, Syndicate Elsewhere

    Ignore the Numbers


    Knowing the number of visits to your website or article only serves to feed disappointment when one article doesn't match your expectations. Avoiding that sense of failure will inevitability lead to a habit of not writing and only consuming.

    Privacy


    The common methods of tracking visits can not only break your site, it also invites an invasion of privacy for your readers. Are there more privacy-minded ways to collect visitor statistics? Yes. Do you even need to collect the information in the first place? Probably not.

    Don't Over Engineer


    As technologies it's often easy to get caught up in nuts and bolts. We're want to build our websites to handle all the traffic the world can throw at it, so we setup database servers, build servers, deploy servers, proxy servers, and CDN caches. And for what? A trickle of traffic? All of this could be easily served off a single server, reducing operational complexity and reducing the places where things can break when you really just want to publish a blog.

    Making the Jump


    Making the jump to the slow web doesn't mean you cannot participate in the social networks, you're just changing the terms of engagement. Instead of being the default place to collect your thoughts and ideas, it simply becomes another channel to link back to your site.

    Because you no longer tweet every clever thought you have into the void, you're able to slow down your mind, formulate your thoughts, and take back control.
  • Quality isn't an accident

    How many times have you tried to plug in a USB cable and failed on the first try? If you’re like me that number is nearly the number of times I’ve ever attempted to connect a USB device. How many times has this happened with a network cable?

    While most people have heard of the term kaizen, or continuous improvement, when talking about Toyota and it’s lean manufacturing principles, fewer have heard of kaizen’s unsung sibling poka-yoke, or mistake proofing. 

    The main idea of poka-yoke is to draw attention to human errors as they occur, so they can be corrected or prevented, reducing the number of defects in a product. After observing a defect, we identify the root cause of the mistake, and then apply a fix or change in process that attempts to prevent the same error from happening again. This learning can then be applied to improve the design and function products.

    Building your products with poka-yoke requires more initial effort, however the end result is a higher quality and more reliable product. As developers, our tool to poka-yoke our services are unit tests.

    Tests are small pieces of software that exercise a piece of code and verify that it’s behaving as intended. Writing tests are, however, many developers least favorite thing about creating software. We like to build new services and libraries because they’re fun and there is a sense of immediate gratification.

    While writing good tests is time consuming and not fun. Setting up the scaffolding, defining test cases, and setting the test data can feel like tedious grunt work without an end in sight. However boring tests may be, they are essential to quality software.

    With Kwoosh we’re aiming for high reliability, minimum regressions, and fast operations. Part of our testing strategy is to have “workflow” integration tests. These tests aim to help make certain that our tests are comprehensive while being easy to understand.

    Each test currently has a maximum of two tests named ‘test_get_workflow’ and ‘test_post_workflow’. Each test then calls a series of descriptively named helper functions to assert behavior.

    def test_get_workflow(self):
        # Make sure that anonymous users are redirected to login
        # and that users are denied access to data that's not theirs
        self.redirect_for_anon_get()
        self.not_found_for_wrong_account() 
        # Check that our filter interface is filtering data properly so
        # calls to "mine" only show tasks assigned to me and so forth.
        self.filters_response(self.sub_task_data['title'], 'all', [])
        self.filters_response(self.my_task_data['title'], 'mine',
            [self.sub_task_data['title'],
            self.completed_task_data['title']]
        )
        self.filters_response(self.completed_task_data['title'],
            'complete',
            [self.sub_task_data['title'],
            self.my_task_data['title']]
        )
    
    def test_post_workflow(self):
        # Make sure that all post requests are redirect
        # or return 405 and denied
        self.redirect_for_anon_post()
        self.post_not_allowed()

    As a lot of the tests will have some helpers in common (such as confirming anonymous users get redirected to login), we can bundle up these helper methods in small classes and include them into the tests, reducing the amount of code we need to maintain.


     Less code = Fewer places for bugs = Less maintenance

    Having descriptively named helper methods will allow future me to glance at the test I wrote today and identify exactly what’s being tested, without having to read through hundreds of lines of code.

    Quality isn’t many things. Quality isn’t free. It isn’t flashy. It isn’t fancy. And it sure as hell isn’t an accident.
  • Slow is not a dirty word

    When someone says the word “Slow”, what comes to mind? People driving 10 miles per hour below the speed limit for no discernible reason? Snails sliming their way across the street? Business?

    Probably not business. Business is supposed to be quick. We’re supposed to have gotten to market yesterday, rush around, be busy, work overtime, and grow forever.

    We’re constantly looking for things quicker. We lay miles upon miles of fiber optic cable to get a measly 1ms faster transfer rate. We want our photos developed in an hour or less. We only have 7 minutes to work out, 4 minutes for a video, 2 minutes to cook noodles, and and 3 seconds for a sound-bite.

    We bombard ourselves with pings from everything under the sun so we never miss an instant and we’re always on. For what?

    What’s the purpose of all of this? Usually we hear something about demanding customers and better service, but usually it’s ‘shareholder value’. We focus on the short-term and neglect the long-term.

    But is this the only way businesses are supposed to be run? Should we just accept it as the one true way? Does achieving all of this make us a success?

    No, it doesn’t. This fast-paced always-on life style blends our home-life and our work-life together. We can no longer leave the office and are always just a text or phone call away. This makes sense for mission critical launches or in times of crisis, but it has become the norm.

    There’s an alternative. It’s called Slow.


    • Slow is recognizing that we work to live, not live to work and creating a culture that embraces this.

    • Slow is growing at a considered and deliberate pace.

    • Slow is building a business that respects its customers, employees, and community.

    • Slow is quality craftsmanship and livable wages.

    • Slow is long-term thinking and continuous improvement.

    • Slow is sustainable and responsible.

    • Slow is waiting for a well articulated response.

    • Slow is cooking a healthy meal rather than going through the drive-thru.

    • Slow is enjoying a sunrise and not tweeting about it.

    • Slow is enjoying a moment for the moment that it is without needing to documenting it.

    The best things in life: lovers, friends, wine — do not come in an instant, an hour, or even a year. They come over time. Slowly.

    What can you Slow Down today?

Previous 4 of 4