I’ve written an app is Swift, but I couldn’t claim to be much more than an advanced beginner. The question is though, “how much Swift do I need to understand to write good apps?” Secondarily, “how much Swift do I need to understand to get a job as a Swift developer?” These sound similar, but they are definitely two different things.

A Good App

I made a decent app (Triglotta 2) with my advanced beginner skills. It’s pretty basic and although there is some complex text processing a deep knowledge of Swift wasn’t needed. That being said, there is probably code that is not very idiomatic and considering the code base started from Swift 1.0, I’m sure there are unwrapped variables and control flows that look wrong if not problematic.

To make a good app, meaning robust, flexible, and extensible will take a deeper understanding of Swift. Table Talk Quiz should push me a great deal in that direction. My vision is to have the quiz portion be the foundation for multiple apps going forward and to be that foundation I want the code to be good. So to make a good app I have some idea about where I need to increase my skills.

A Swift Job

Now to get a job as a Swift developer, that’s another story. If you look at something like these swift interview questions there are concepts that, while technically useful, aren’t great predictors of whether someone who would be good at developing apps for your team. This makes me recall the Java interviewers that always asked about double checked locking and pass by value vs pass by reference. I’ve seen a bunch of production code that has the double checked locking problem, but in practice I’ve never seen an error caused by it. I’ve also never seen a problem arise because of pass by value vs pass by reference confusion. Nobody I know tries to write code that complicated or tricky.

Where does that leave my thinking with Swift? I’m not sure how much I’m going to need to use functions and closures as arguments. I probably should know that they can. What about mapping and filtering? How deeply should I understand them? Once again, I’m not sure how much the type of apps I’m going to write will need them. Will that mean I couldn’t find a job as a Swift developer? I think it will depend on what the company and the role values. If they want someone who has a solid grasp of the fundamentals and can ship software then I think I can get to that point. If they want someone who has an intimate knowledge of the language and how to get the most out of it, I doubt I will get to that point. The types of apps that I conceptualize don’t require that depth of language knowledge and I need to make the decision to prioritize an understanding of Swift that will help me ship apps as opposed to understand the language.

As part of the process of building Table Talk Quiz, I want to try to adhere to BDD. What that means for me in practical terms is that I want to write application code only after I have a test that is failing. The failing test may need a functioning piece of code to pass, but it might also need a piece of UI. For example, the first thing Table Talk Quiz will need is a start button to start the game, and I want have a test that verifies that the start button exists.

Xcode UI Testing

In Xcode 7 UI Testing is natively supported. Previous to this version of Xcode you had to use an external tool like Frank or Kiwi. I tried these and other and while a diehard BDD practitioner might wrestle with them to build a project, the lack of integration into Xcode made sticking to them too much of a hassle. But now Xcode supports a UI Testing target with APIs for testing and driving your app. Yay, sort of. The first thing you will notice is that there is no documentation. There are the headers and someone has run the doc scripts on them and posted them, but there are no official guide or API documentation. Apple’s support of testing is like its support of gaming; it throws little bones, but never gives you all the tools to make you feel like a first class citizen.

From watching the WWDC UI Testing video I wrote this as my first test:

func testStartButtonExists() {
    let app = XCUIApplication()
    let startButton = app.buttons["start"]
    XCTAssertTrue(startButton.exists)
}

I have a failing test, yay! Now on to making that test pass.

Xcode Project Template Looks like Table Talk Quiz is a going to be a game.

Xcode Project Options That uses Swift and SpriteKit and includes unit and UI tests.

A new project is similar to a blank canvas or page for other creative people. It’s the place where the actual work of creating happens. It can be exciting and overwhelming at the same time. The possibility of greatness, failure, or mediocrity. The endless possibilities of what could be created.

Sometimes I actual talk and think the way I wrote the previous paragraph. I’ve exposed myself to various books and movies that have caused that type of writing and speaking to creep into who I am. It can sound lofty and fake even to me, but it comes out at times and that’s just who I am. I’m not a good enough writer or communicator to stick to one coherent style so I just have this jumbled mess. One of the reasons I fail at blogging is that I see this mix of styles, try to clean it up, and then just kill the whole thing because I’ve lost focus on the subject matter because of stylistic mattters.

The Deal

I’ve tried to write iOS quiz games at least 5 times. I have the projects sitting on my drive in various stages of incompletion. I even shipped one (Table Talk Radio) about 5 years ago, but I never iterated on it and I consider it incomplete. After building some momentum with the development of Triglotta 2, I think I found a rhythm that I can sustain and get me to final make the quiz game that I can ship and maintain.

What’s the game going to be like? Do I have a design? How am I going to make money from it? These are all questions that I’d like to answer, but 1) I don’t have all the questions answered and 2) I’m going to use the technique I used to sustain my work on Triglotta 2 and apply it to blogging which is to say I’m going to do a little every day. So I’m not going to attempt to answer all the questions in this post. As I hash various aspects of the project out I will post my thoughts and internal debates.

Pax

I just finished the majority of the development for Triglotta 2 which will be released on Reformation Day. This means it’s time to start the next side project. For the umpteenth time I’m going back to working on a quiz game. I’ve gone back and forth so many times about the pros and cons of educational games and the pros and cons of the types of games within that subgenre. I’m finally just going to try to build one and learn from the experience. This project will be a rewrite and reimagining of the Table Talk Radio app with new games and a simpler format to allow for more frequent content updates. I may not be able to include as many soundbites, but I will try to keep them as best as I can as that was a major feature, at least in my mind.

Multiple Learning Paths

As with all my side projects, one of my goals is to learn and improve various development skills. My major focuses will be on really understanding Swift, improving my use of Xcode, and learning about the new UI Test feature.

Blogging the Process

The other major component of this side project is my plan to blog about the progress or lack there of. My plan is to write lightly filtered thoughts about my thoughts, what’s working, what’s not, what I’m learning, what I need to learn, where I’m falling short, what’s hard, and really what ever comes to mind that I can look at later and see where my processes worked and where I can improve.

I don’t know if this will be useful for me or anyone else, but I want to take the time to examine what I’m doing instead of just plowing ahead without some introspection.

I hope to build a full-time business making tech products that confess, teach, and defend the Faith once delivered to the saints. With that in mind, I have been building a couple of apps and trying to figure out what to charge for them so that I can progress toward this goal. And now those apps have stagnated. One is mostly in a good state, but it doesn’t have the features I would make money from and has been stagnant for a couple of months. The other app is about ready to be user tested, but it’s been in that state for about a month. Both have stagnated for the same reason: fear.

Root of Multiple Fears

There are multiple fears in play hear. Fear of not being good enough, offending people, failure, etc. Most of these fears would be alleviated if I weren’t planning on charging for the apps. I think there is value in the work I’ve done, but I’m not sure how much or if anyone else will perceive that value and if a person makes a purchase will my work meet or exceed the value that was paid for?

I’m missing out on several things at this point. I’m not learning anything about pricing or running a profitable business, and I’m also not learning about what is valuable to people and how to ship a great product. The thing I’m considering is not charging for the apps and giving people value for free. The Lord has blessed me with a wonderful job and I don’t need to make money from my apps at this point. The value for me of learning from shipping, building a reputation, and learning about what people are interested in is good enough for me right now. My hope is that these experiences will guide me into the time when I can feel comfortable in switching things into a business.

What’s Next

My plan is to focus on cleaning up the apps and getting them into shape based on not charging for them. I’ll take the summer to do testing and actually try to do some experimental marketing in hopes of a Reformation Day release.