Going Indie

A complete guide to becoming an independent software developer

From starting a company and staying motivated, to designing, building, and launching your first product and beyond.

Various Goings On

I've been a little scatter-brained over the past few weeks. I've started lots of little projects and finished almost none of them. Hopefully, they'll all start to wrap up soon. I mentioned on a previous Indie Dev Life that I was working on an update to the Pine.blog iOS app, and that is still true. It's coming along nicely. I think I'm about 80% done with it, but I've reached the infamous second 80% and it's become a bit of a slog, so I did what a usually do in this situation: literally anything else.

To that end, I've been experimenting with a few other projects. I've started the process of adding a dark mode to Pine.blog's Web UI, which is coming along nicely. I've also started building out Micropub support for Pine.blog. Both are features I've wanted for a long time, but never gotten to. Hopefully they'll be done around the same time as the iOS refresh. I've always struggled with putting together a coherent design for the Pine.blog web UI, and it shows. With the newest refactor of Pine.blog for iOS though, I've finally developed a coherent design and I've started using the same layout and components on both iOS and the web. It's looking really good, and hopefully this new design will last a while and bring Pine.blog up to modern standards.

On Monday the holidays are officially over and I'll force myself to finish the iOS release for Pine.blog. Usually I try to keep myself pretty focused, but for now I'll keep tinkering — it's a nice thing to do every once in a while.

Breadcrumbs and Pinboard

I use Pinboard, and I have for some time. For years, I've dumped the occasional interesting article there and then largely forgotten about it. Recently though, I've decided to really dive in and start using the service to solve a problem I routinely have.

I read a lot of articles, as I'm sure many of you do, and I often refer to them in conversation or in a blog post. When I do reference an article I like to cite it, even in conversation, but I often can't find the article anymore nor can I remember enough about it to effectively search for it. I think it's important to cite your sources, even casually, because it helps you recognize your own filter bubble, and it helps to ground you in the realm of facts. It also helps the other people you're conversing with better understand and counter your argument if they can tell where you're getting your information from. Plus, if you can find the original source, you can always verify that you're remembering the information correctly.

In an effort to forever solve this problem, I've started archiving essentially every article I read in Pinboard, and I do this whether or not I think the article was any good. This effectively turns Pinboard into a breadcrumb trail that I can use to retrace my path on the Web and hopefully dig up and verify any information that I half-remember.

A while back, I started taking notes when I read books so I can more easily remember and refer back to information I may need, but I don't want to keep a notebook for everything I read online. Enter Pinboard.

There are a few things that my system is lacking so far. Most importantly, I'm still having trouble finding some articles when I know that I've bookmarked them. It seems that either Pinboard's search isn't working how I'd expect or I'm not giving it enough metadata to search through when bookmarking articles.

Hopefully, as I get more accustomed to this new way of using Pinboard I'll drastically increase the frequency when I can recall some useful fact and also produce a worthy citation.

History, Myth, and Talking Cows

I started reading The Early History Of Rome by Livy a little over two years ago, but today I finally finished it. It's a good book and a fun and illustrative read, but there's a reason it took me so long to get through.

Livy, or Titus Livius, as he was actually known, was a Roman writer born in 64 or 59 BC, so his writing style is... strange by modern standards. I would often have to re-read multiple pages after realizing that I had no idea who was doing what. This is compounded by the fact that there are literally hundreds of names and, in a very Roman tradition, they are all incredibly similar. I'm also a fairly slow reader, so between the constant re-reading, my overall slow reading speed, and huge reading backlog, I could only finish 20 pages before getting distracted with another easier book.

That said, Livy's work is certainly worth reading if only for some of the truly amazing stories he tells. Sometimes the stories are so completely outlandish that I have to stop and remind myself that this isn't a fantasy story, it's history. Now, obviously there is myth and legend interspersed with it, and in these early histories they're effectively inseparable. After all, it's claimed —by multiple Roman authors— that the city was founded by two children nursed by a wolf, before the oldest kills the youngest, becomes king, and ascends to heaven in a cloud. It's an interesting read.

I'd like to share just one passage that I earmarked early on in the book. For context, know that the Romans were incredibly superstitious. They were constantly on the lookout for signs from the gods and they rarely did anything without performing some sacred ritual and seeking approval from the gods (see the story of the Sacred Chickens). In this passage, the consuls for the year (461 BC) had just been elected, and war would soon come to the Romans though they didn't know it yet.

The year was marked by ominous signs: fires blazed in the sky, there was a violent earthquake, and a cow talked — there was a rumor that a cow had talked the previous year, but nobody believed it: this year they did. Nor was this all: it rained lumps of meat. Thousands of birds (we are told) seized and devoured the pieces in mid-air, while what fell to the ground lay scattered about for several days without going putrid. The Sibylline Books were consulted by two officials, who found them in them the prediction that danger threatened, from 'a concourse of alien men' who might attack 'the high places of the City, with the shedding of blood'. There was also found, amongst other things, a warning to avoid factious politics.

– Livy, History of Rome, 3.10

There is so much that I love about this passage, but my absolute favorite thing is that Livy reports that a cow talked, but for some reason the first time this happened it was dismissed, and that a cow talking is apparently a warning to avoid factious politics. If that's the case, then I kinda wish a cow would talk today.

I've already purchased the second volume of Livy's work and it's on my shelf ready to go. Hopefully I can get through this one a bit quicker.

Arbitrary Achievement Unlocked

Today marks the 10th episode of my podcast Indie Dev Life, and while that might not seem like a huge milestone, it's an important one because I decided it was. When I decided to start a podcast I, arbitrarily, set a goal for myself to publish at least ten episodes. After that I would decide if I liked doing it and if I would continue. Today I achieved my arbitrary goal.

I do plan to continue the podcast. I like doing it, and it's fun to both record and edit. So far, I like both the format and the length. As is hopefully apparent, I'm trying to model IDL on _davidsmith's Developing Perspective podcast. I enjoyed that show (and it's casual format) a lot and I think a short show works well for the kind of show I'm trying to create. So, if you like the show, don't worry there's going to be more of it.

Arbitrary Deadlines & Achievements

I'm a procrastinator by nature, so I have to set, what are often completely arbitrary and unnecessary, deadlines for myself if I want to accomplish basically anything, plus I have a terrible memory. So, I tend to create task lists for myself and assign tight due dates so that I can remember what I need to do and ensure that I actually get it done. And whenever possible, I try to stick to my arbitrary deadlines no matter the work involved. If I decided something will launch tomorrow, then it will. I do the same with arbitrary goals.

I'm not sure why my brain finds it so much easier to work under a deadline, but it does. Even when I know the deadline is meaningless, simply having one is enough to trick my brain into thinking it's real. The procrastinator in me will always put off work until the last minute (unless it's something I enjoy playing with) so I often make my self-imposed deadlines tighter than they probably should be.

I do the same thing with setting achievements for myself. When I released Going Indie, I set a series of goals for what I'd consider a successful release. My expectations being what they are, I tend to make my first goal incredibly low so that I'm basically guaranteed to hit it. For Going Indie, my first goal was to sell 10 copies, and thanks to you all, I sold many more than that. After the first goal, the rest follow a pretty simple format:

  • What is the bare minimum I'd consider successful?
  • What would I be happy with?
  • What would I want to have happen?
  • What would I dream of happening?
  • What is basically impossible?

This tiered structure helps me understand myself and my own expectations. It also keeps me motivated. If I say I'd be happy with something, and set my expectations accordingly, then when I achieve it, I feel good. Without this structure, I tend to trap myself into believing that my wildest dream scenario is just as likely as the rest and then I'm disappointed when that dream doesn't come true.

I say this in Going Indie, but managing your own expectations is incredibly important, not only to your own motivation, but to your mental health. If you constantly convince yourself that an idea or project is going to make it big, and then it doesn't, you're going to get discouraged. But if you set reasonable goals, and learn to manage your own expectations (of yourself, your capabilities, and your results) then it's a lot easier to appreciate the successes you do achieve and keep going to bigger and better things.

tl;dr I made 10 episodes of my podcast, and I want to make more.

A False Dichotomy

An editorial of mine was published today in a local paper. It's the first in a short series about America's future and how we can work together to solve our most pressing problems, and like most things these days this first essay is about the COVID-19 pandemic.

COVID-19 has disrupted our entire way of life and it seems like that will continue for longer than we would like or hope. The race to a vaccine and mass inoculation is ongoing, but it will take time to see the fruits of that labor. In the meantime, we are not helpless...our current situation is not unsalvageable.

The article ends with a phrase I've repeated over and over again since March.

In short, the current choice between a forced reopening during a pandemic or a safe but devastating shutdown is a false dichotomy — one created by a refusal to help fellow Americans during a crisis.

So far, aside from modest measures (one-time checks, boosting UI insurance, and SBA loans) the federal government has yet to fully respond to the pandemic. Many other nations shut down their economies, but they've also provided aid to individuals and businesses so that they can weather those shutdowns and emerge, raring to go, when they're over. Instead of doing that, our federal government has refused to help states and local governments with revenue shortfalls, failed to provide adequate financial aid to individuals and businesses in need, and overall acted as if the pandemic is nothing to worry about even though, at time of writing almost 300,000 Americans have died of the disease. Instead, the President and Senate Republicans have simply insisted that their hands are tied, that the incredible capabilities of the most powerful nation on earth simply can't be used to help its people.

A lot of this disfunction lies at the feet of Republicans in the Senate. To it's credit, the House passed a new round of pandemic relief months ago, but the Senate never even considered it, and Joe Biden's sizable pandemic plan is probably subject to the same fate.

In an Op-Ed for the New York Times this week, David Brooks wrote about the most recent coronavirus aid talks and Senate Majority Leader Mitch McConnell's efforts to curtail them.

To their great credit, Pelosi and Chuck Schumer embraced the bipartisan framework. Mitch McConnell went on the Senate floor Thursday, pretended to soften, ignored the compromise and did not move an inch.

If [we don’t see a Covid-19 relief measure pass in the next week or two], McConnell should spend Christmas with people thrown out of work and witness the suffering he has caused.

This is what has infuriated me for months. We have a solution to this pandemic. We know how to curtail its spread: shutdown, pay people to shutdown, and encourage masks and distancing. Then and only then: reopen safely. We could open schools while keeping bars and restaurants closed if those businesses could afford it, and we can make sure they could. Instead we choose not to. This dichotomy: reopen unsafely or suffer safely is a false choice. There are plenty of better options, but we won't take them. Instead we chose this route.

I'll leave you with an excerpt from an article I wrote but never published.

..we can't control the virus, we can only mitigate its spread. We can, however, directly effect the economy. We could have built up our institutions, we could have helped those that lost their jobs, we could have woven a net to catch those who fall. We chose not to, but we still can.

Why I Don't Retweet Anything

I still read Twitter (despite my efforts to quit entirely), but I've stopped retweeting. My last retweet was on July 17th and it was of a tweet I wrote for a company I co-own. And if things continue as planned, that will be the last retweet I ever do.

Why No Retweets?

Retweets are Twitter's original sin. Akin to Facebook's Share, or Tumblr's Re-blog, the Retweet is what allows content on Twitter to spread virally. It allows for users to effortlessly spread false or misleading information with impunity and encourages readers to never go past the title of an article (despite Twitter's admittedly laudable attempts to address this issue). Retweets allow users to easily dunk on each other and act as super-spreaders of identity-reenforcing and tribalistic memes that only serve to make Twitter a worse platform.

Quote retweets are a little better (at least they require the user to express some opinion about the content they're spreading), but they still allow for the easy dunking that's a mainstay of the platform.

To their credit, Twitter has long known that the retweet button causes problems on their platform. The original designer of the feature has even said as much.

Chris Wetherell:

“We might have just handed a 4-year-old a loaded weapon,” Wetherell recalled thinking as he watched the first Twitter mob use the tool he created. “That’s what I think we actually did.”

Both Pine.blog and Micro.blog don't have retweets, and Manton does a great job explaining why (I used the same reasoning for Pine.blog).1

Manton Reece:

When you have to put a little work into posting, you take it more seriously. I wonder if fake news would have spread so quickly on Facebook if it was a little more difficult to share an article before you’ve read more than the headline.

Putting in the extra effort to actually articulate an intelligible thought helps me better understand the content myself and it helps me gauge whether or not the given post is even worth sharing. On more than one occasion, I've stopped myself from sharing something because I realized that it just wasn't all that interesting.

How I (Still) Use Twitter

While I still read Twitter, the vast majority of my posts are cross-posted from my microblog. I still favorite posts (because my favorites are automatically saved to Pinboard so I can find them later), but for the most part, my interactions are read-only.

Because I spend most of my "social media time" either reading articles on Pine.blog or browsing Micro.blog, reading Twitter now feels like wading through a nuance-lacking, toxic cesspit rather than acccessing the real-time information platform I once knew and loved, which in turn drives me further away from the platform. I see people I follow there cooking amazing meals, telling fanciful stories, sharing hilarious memes, but all of that is drowned out by the hate and vitriol in every next post.

With all that said though, I do still share stuff on the Web. I just do it by writing a post.

A sample pseudo-retweet
I'd love a browser plugin that removes the Retweet button and hides all retweets. It seems like a few exist, but none that I tried worked. Presumably Twitter tries to circumvent them.

Virality is a fact of life on the Web; neither innately good nor bad. For too long we've seen it as something to be harnessed, to utilize. But a virus is incredibly difficult to control and, like with today's real-world troubles, a pandemic of memes and satire does enormous harm to our individual health and to the health of our society.2

tl;dr Pandemics are bad. Both online and in meatspace. We should limit their spread and stop retweeting.

1 Pine.blog will show you when someone retweets or re-posts your blog posts if you allow for Webmentions, though I'm considering letting users configure this behavior. Retweets also poison the mind of the poster, not just the reader.
2 In an effort to be transparent, I have asked others to retweet my posts before an an attempt to gain some traction outside my bubble. I'm going to stop doing that too.

Programming Misconceptions

Along the lines of my post about assumptions and variable names, here's a list of a few common programming misconceptions that I often run into (with other people's code and with my own).

What you think the code does is often not the same as what it actually does.

There is a big difference between: intended, expected, and desired. Something can be both intended and expected, but undesired; but it can also be intended and desired, but unexpected.

And my personal favorite:

What the method/function name says it does is not the same as what it actually does.

Naming is hard.

Going Indie is Out! 📚🚀

I never get tired of saying this

Going Indie Cover Art

Today I'm thrilled to announce that my book, Going Indie: A Complete Guide to becoming an Independent Software Developer, is out and available to purchase! The book has been in pre-order for a few weeks, but today is the official launch!

Writing and publishing a book has been a crazy endeavor, and I've learned a lot during the process, both about myself and my capabilities, and about the process and work involved in book publishing.

Thank you to everyone who proof-read the book and who contributed to making it a reality. Like it says in the acknowledgements, a special thanks must go to my editor and friend, Jenn Sardina, who helped me wrangle the book from the rambling that it was into the sleek product it became. Thanks to my proof-readers, to my designer, and to all of my friends and family for their support during this process.

There's a lot of improvements I'd like to make to the book, and perhaps there's a second edition on the horizon someday. For now, to all of those who've purchased a copy of Going Indie, I say thank you. I hope you enjoy the book and I hope that it helps convince you to go indie yourselves.

Announcing: Hewell Public Beta 🎉

Today I'm happy to announce the public beta for my newest app Hewell: A Virtual Tour Guide. I've wanted to build something like Hewell for years, and I finally got around to it. The app is in Public Beta on iOS, so you won't find it in the App Store just yet, but you're free to try it out and give feedback via TestFlight.

Hewell Logo

Hewell is a virtual tour guide that automatically finds interesting things around you whether you're in a new city or your home town.

The world around us is full of awesome things and so many of them go unnoticed and unappreciated. Hewell helps you uncover the interesting and fascinating places in the world, whether you're on a trip, or just wanding around your home town.

Hewell is a privacy-respecting, open-data powered app that uses the power of Wikidata and Wikipedia to tell you more about the world around you. You could of course get all the benefits of Hewell by simply searching Wikipedia for everything interesting around you, but who does that? Hewell brings the enormous potential of open data to you right when you need it.

With Hewell you can discover cool spots, learn about their history, listen to a narrated guide for each place, vote and recommend great spots for other Hewell users, and earn badges for your efforts. I have a lot more great stuff planned for Hewell in the coming updates, but I wanted to get something out relatively quickly and get feedback.

If you're interested, please give the app a try and let me know what interesting things are in your area.

Check out Hewell →

The overview in Hewell A listing in Hewell

House Judiciary Committee recommends Interoperable Social Media

Today the House Judiciary Committee released its report detailing the numerous anti-competitive practices employed by the big tech firms: Apple, Amazon, Facebook, and Google. The report details why these firms are under investigation, what role they play in their respective markets, and whether they have achieved monopoly status in those markets (spoiler, it says they have). The report looks at the web search, web advertising, social media, e-commerce, and mobile software distribution markets, their history, and their future. It's a long read, but you should check it out, at least through the Executive Summary section.

Importantly, the authors also make a number of recommendations aimed at fixing the problems they identified in the report. This is where things get interesting. The report recommends a lot of what open web folks (like myself) have been wanting for years. Here's a few of the most relevant recommendations (emphasis mine):

  • Structural separations and prohibitions of certain dominant platforms from operating in adjacent lines of business;
  • Nondiscrimination requirements, prohibiting dominant platforms from engaging in self-preferencing, and requiring them to offer equal terms for equal products and services;
  • Interoperability and data portability, requiring dominant platforms to make their services compatible with various networks and to make content and information easily portable between them;
  • Safe harbor for news publishers in order to safeguard a free and diverse press;
  • Prohibitions on abuses of superior bargaining power, proscribing dominant platforms from engaging in contracting practices that derive from their dominant market position, and requiring due process protections for individuals and businesses dependent on the dominant platforms;
  • Strengthening private enforcement, through eliminating obstacles such as forced arbitration clauses, limits on class action formation, judicially created standards constraining what constitutes an antitrust injury, and unduly high pleading standards.

p. 20-12

This is great news! These reforms would, in my opinion, do a lot to level the playing field that currently tilts towards benefitting these large incumbents. Each and every one of these companies benefitted by taking advantage of the power of the Open Web in their early days and most still do in some form, but they contribute nothing back and they actively work to undermine the things that make the Web and the Internet great. The report explicitly calls out Facebook's lack of interoperability and recommends that social media companies be forced to interoperate and provide data portability in the same way that phone carriers are currently required to do.

As a result, these markets are no longer contestable by new entrants, the competitive process shifts from “competition in the market to competition for the market.”

This dynamic is particularly evident in the social networking market...

In response to these concerns, Subcommittee staff recommends that Congress consider data interoperability and portability to encourage competition by lowering entry barriers for competitors and switching costs by consumers. These reforms would complement vigorous antitrust enforcement by spurring competitive entry.

a. Interoperability

Interoperability is fundamental to the open internet. It is present in email, which is an open, interoperable protocol for communicating online regardless of a person’s email service or the type of the device they use to send the email.

An interoperability requirement would allow competing social networking platforms to interconnect with dominant firms to ensure that users can communicate across services. Foremost, interoperability “breaks the power of network effects”...

p. 384

Open Web folks won't be surprised by any of these recommendations. We've been wanting them for years, but it appears that Congress is finally paying attention. There's a lot more in this report than just social media market reforms, but in my opinion these reforms are the most exciting and the most impactful to our discourse on the Web. Hopefully now that the wheels of government are turning, they move to enact some of these long-awaited and way-overdue reforms and give us back the Open Web we want.