This post is an appendix to my launch of the Codewerks Kickstarter campaign, which launched today! If you're interested in coding on an iPad, please take a look.
I've been thinking a lot about the kinds of applications that you see on different operating systems. One of the factors that makes Linux so appealing and elegant is the way that its applications are tiny, discrete, and interoperable. On the command line, composing a bunch of small apps to produce a powerful result is the core of what makes Linux great.
ls -al | grep Feb | grep -v '200' | more
This lists all log files in the current directory, shows all entries from February of the last three years, and then pages the results on the screen. This is three different apps being used together in ways that the authors of those apps never considered. They didn't have to: on Linux, everything accepts text as input, and everything outputs text. That's Linux's core advantage (and to my mind, helps explain its staying power).
Modern desktop operating systems like the Mac don't have the same “micro-app architecture”. They have larger, more robust applications that work with a variety of inputs. But there's a proliferation of standard data types that allow these apps to inter-operate: think of stuff like images, plain text, hyperlinks, contact cards, emails, etc. And the desktop environment is a place that invites cooperation among apps: windows can be managed arbitrarily, and data can literally be dragged and dropped between them.
Think of a developer's workflow. They put together a menagerie of apps to do their work. An IDE like Xcode for writing and compiling code; a documentation viewer like Dash for looking up methods and frameworks; various command line utilities (like Cocoapods or Carthage) for pulling in dependencies; HTTP proxy utilities like Charles, to view network calls; file transfer utilities like Transmit to move files onto a remote server. The list goes on. And the Mac is perfect for this kind of interaction, because it allows everyone to craft a package of utilities that works for them.
The iPad's Take
Since the iPad's introduction in 2010, it felt to me like a new take on computing, and it quickly became apparent that it favoured its own style of application. Rather than running a bunch of apps that interoperate, on iOS the pattern is to use a single app at a time. Further, working with multiple apps together, while possible, has and remains a task that's loaded with friction. I think John Gruber covered it pretty well a few weeks ago: Apple is trying to bolt a multi-tasking paradigm onto a uni-tasking operating system.
To my mind, that means that apps with any complexity need to ensure they provide all the features a user needs by itself; it can't rely on an ecosystem of apps to provide it with additional functionality.
This is the thinking that informed my approach to building Codewerks. Because coding on an iPad is complicated, it seemed to me that an application had to undertake a number of once-discrete features in order to be useful.
- There was no way to work with files (until Files came with iOS 11), so I needed a file management app.
- It should be tied closely to the code editor, so let's throw that in.
- Coders need a way to interact with their apps and configure their environment, so I added a Terminal app.
- And since many coders write for the web, it seemed like a no-brainer to add a web browser, fully integrated with the work they're doing.
So from the earliest computers to today, we've moved from micro-apps to macro-apps. I don't know if this is the best way to write an app for the iPad in the year 2020, but my time using Codewerks has shown it's more fluid and natural than I expected. Having everything in one place was more demanding of me as a developer, but the result is an app that has what I need, with plenty of room to improve.
On the iPad today, there are productivity apps that are designed to operate with other apps. I'm thinking of text editors like Kodex, which edits text files right out of the Files app. And there's Shortcuts, a way to make apps work together.
But I feel like these apps place a cognitive burden on the user. They're harder to use to piece together a fully-working solution. With Codewerks, there's no mental load because everything is there.
Codewerks is a macro app. I don't know if it's going to live or die by that classification. But I'll forgive you for thinking that there sure seems to be a lot going on inside this one app.