The 1-Day App
Today is Sunday. Today is the day I do weird single-day projects like “finish a book,” “make a dumb/fun video,” or in today’s case “build and publish an app in a day.”
I read this Medium story this morning in bed and here we are. You call me easily distracted, I call me easily inspired.
It’s been several years since I touched XCode.
I’ve never written in swift, but I’m comfortable in Objective-C. Naturally, I’ll be doing this in swift.
Should go well.
I’m gonna mock up the app in Photoshop now so when I tell you what I’m building it’ll make sense.
— Steve, 9:51 AM
Funny side note, after typing that I hummed the jeopardy theme to myself and then double clicked “King Kunta” by Kendrick Lamar in Spotify during the last few notes, and was really surprised when it was in both the same tempo and key. #accidentalAcappellaCrossfades
Consider this my formal apology for the forthcoming terminology and jargon storm. From here on out (if not already) there will be words whose meaning neither you nor I actually understand. Just nod and smile.
Less funny but still relevant dev/design side note: It’s really nice that the iPhone 6S Plus is 1080x1920 that’s so much easier to remember than last time I did XCode development and everything was 320x640 or something ridiculous like that.
Okay here’s the mockup:
Okay it’s noon now. But the “design” (which I say with some hesitation knowing that actual designers and developers might read this if I’m especially unlucky) of the app is done, the icon is done. That’s the part I know how to do (again, take that with a grain of salt) and it’s done. I have just under 12 hours to write and publish this baby, and all my assets are in order. Happy day.
The worst part of that process was picking a gear icon.
The idea is pretty straight forward: Reminders to post on Insta during an optimal time for likes/engagement, or to make a snap story throughout your day instead of just at the end of it.
I forget to post on Instagram until like 8pm every day and then I know I’m going to get zero likes and it sucks. And I totally don’t think to make a snapchat story throughout my day, who does that?
Having built several apps (sometimes solo, sometimes in collaboration with others) over the course of my life that each took between 4 hours and 2 years to make, this seems like an ideal single-day app to me.
You’re still reading this post because you hope I’ll eat my words.
I hope you’re wrong. *nervous laughter*
Also, I’m pretty psyched about the in-app purchase thing where you can pay me a dollar and you get to make your own freakin’ notification times. I’m not too sure about the final design for those pages, I mocked it up super quickly and I don’t think I picked the easiest layout.
- I’m lazy.
- I just needed the objects and styles, the data structuring comes later.
- I have to do this in one day. Time to move on.
— 12:14 PM
Okay now I’m watching youtube tutorials like this one:
This small boy is astoundingly helpful. You go Tanmay Bakshi. Also, this video is about push notifications and I’ll be using local notifications, so this isn’t helpful at all.
Here’s a better one:
The man in this video has a VERY pleasant voice and his video ends with him saying “very nice” and it made me crack up.
Here’s a quick “user story.” For the uninitiated, a user story is basically a totally made up, hypothetical, and very-boring narrative about what happens as you use the app. Since I need to think through what the actual app will do when you touch it, I’ll just write it all out here:
First, Jim opens the app for the first time. Good job, Jim.
After the load screen, a screen saying “Hey this app is for reminding you to post to Instagram and snapchat! Welcome.”
There are two buttons that say “Oh, okay. Cool!” and “I already knew that.”
They both do the same thing. Once you click them, you’re on the main screen of the app, which was the first mockup you saw above. Cool.
Now the user will click either the Snapchat or Instagram bars. If they don’t in 5 seconds a little hand animation will show up and insist that they click on one.
When the Insta or Snap detail screen shows up, none of the options will be selected. They’ll click on one. This will trigger an explanation screen:
“Oh hey, you did it. You want reminders, and we’re gonna give you reminders. But to do this, we have to get your permission to send you push notifications. You’ll get to control exactly when you get these notifications, but first we need permission to send them. When the dialogue box comes up, click “allow” or else the whole app won’t work and everything will be ruined.”
That’s a lot of text for a single screen. It probably won’t say all that. Maybe I can have it be a snapchat video of me saying that. That would be silly.
Then they’re set! The notifications they selected will be registered to the local notifications roster (still not sure how this all works, as you can tell if you’re a developer) and then the user is free to do their own thing from here on out.
Tapping the active selection again will deactivate the notifications. Tapping another one will select that instead.
When the user finally gets the long-awaited notification, tapping it will take the user directly (though through my app probably, due to the limitations of iOS, *sigh*) to either Instagram or Snapchat.
There will also be options to delay by “15 mins” or “1 hour” in the notification buttons. You can also just close the notification or ignore it. Whatever floats your boat. Note that this gives users 5 things they can do when they get a notification (I LOVE iOS 9!):
- Tap it, go directly to the app they wanna post in.
- Swipe it up or ignore it and it’ll just chill in their notification center until further notice.
- Double tap the X thing (or hard press on the apple watch, or swipe right to get to the x on the lock screen — this is ridiculous Apple) to ignore it or clear it or whatever that’s called.
- Delay by 15 minutes and go through all this again.
- Delay by an hour and go through all this again.
That’s a lot of sweet functionality for a lil’ ‘ol one-day app! Hooray for local notifications.
Okay now I’m actually building things. First challenge is setting the nice gradient background. I know how to do this with an image, but I want to build a light app that’s not full of PNG backgrounds (made that mistake before) so this seems like a pretty easy first challenge.
Here’s where I’m at. Exactly NOTHING is going on in XCode. Everything is so fresh and so clean clean.
OKAY EVERYTHING IS SO DIFFERENT WITH SWIFT. Also I haven’t done iOS development since before storyboards were a thing, so I’m totally lost.
Thankfully I happen to have a full time iOS developer software engineer who works for MartianCraft downstairs. I call him “Dad” — one moment while I go bother him.
Dad’s a helpful one. But help from dad comes with a caveat: we’re no longer developing in Swift. We’re developing in Objective C, dammit. This is probably for the best because I’m way more comfortable with good ‘ol Objective C anyway so I don’t know why I even thought I was gonna switch in the first place.
Anyway, it’s 3pm and here’s where we’re at:
Okay ain’t nobody got time to write and code at the same time.
It’s 5pm and here’s where we’re at:
Update: Dad has gotten way more involved in this than I expected him to be. I figured he’d be like “oh, cool, yeah sure here’s what’s changed since iOS 5!” and then be on his way.
He did that, and then he helped me figure out the overall structure and nav scheme for the app, and now he’s completely taken over my computer for a moment to explain a few more things:
Okay now it’s 7:30pm and I’m finally going to take a break to write.
Here’s what’s up:
I’m definitely DEFINITELY not going to build this whole app today good lord that would be a feat.
I am going to build the 10 AM daily Instagram local notification (and MAYBE the thrice daily snapchat one), the Snapchat and Instagram screens, the settings screen (just icons for now, no FAQ, no legal, no nothing), make the final look for all four screens nice, and release it to the app store.
That should actually be doable by midnight, but to make that happen I gotta go. So far so good things are AWESOME.
The issue I’m dealing with at the moment is that I haven’t bothered to figure out how to get the back button working on the navigation controller (which means I have to re-build the entire app every time I want to go back a page, very casual), and I have nothing even close to the final visual design (as you can see in the screenshots above), and basically nothing does anything yet.
AND AND I haven’t even BEGUN looking at plugging in local notifications.
But that’s not to say my day isn’t without results. Not only have I mocked up an entire app in a few hours, I have built almost the entire interface for that app in code! It has all the pages (including the custom reminder-stuff after you do in-app purchases). All it needs now is a some real functionality and probably a lot of debugging and we’ll be golden.
Oh boy. I just got a call from dad. He’s kind enough to have offered to hunt down why I can’t get navigation (back buttons) working properly. He just says “You gotta come down here, it’s too weird,” and then laughed and hung up.
And with that, Off I go to his office!
Update 1: He changed the color of the nav bars and now everything works. Why? Who knows.
Update 2: Much more predictable solution — revert to using more reliable, depricated methods until I decide to dedicate more than one day to building an app.
Update 3: Mom made tacos. This has turned into such a fun family activity. Today is a success regardless of how this app turns out!
Guys it’s 10PM and it looks SO GOOD and navigation works and I’m putting the final graphics elements in and ready to hook the last bits together.
It doesn’t quite do what I need it to yet. (which is to say I haven’t even started implementing in-app purchases or local notifications. Heh. Oops.) But it looks good, and it moves and stuff, so as a designer I feel way closer than I am. So close, in fact. Gonna try to come in under the line. It’s not gonna happen.
But if you believe in yourself,
✨ anything can happen ✨
— — — — — — — — —
Okay yeah there’s no way I’m finishing on time.
For those of you with keen eyes, I moved the gear because I decided I didn’t want to hit it with my palm ALL THE TIME.
It’s now 10:11pm.
As you can imagine, none of the walk-through features I made up in the app story will be there. None of them.
Also, it’s worth noting that having my friendly neighborhood software engineer help structure things this morning completely destroyed my willingness to solve problems on my own. It’s so much easier to ask him.
The moral of the story, friends, is to find a developer and stay close to them when you’re learning. Make them lunch and treat them real nice. Having a human to parse your questions makes things so much easier than googling every issue you run into.
Side note that has nothing to do with anything:
I got the second set of screens all perfectly laid out and implemented in XCode.
Working even.…And then completely changed/destroyed everything in the name of making things “work better” — so now none of it works for a little bit, but it also looks like that’s where I’m calling it quits tonight.
I made this huge change before getting a screenshot, and as the night is winding down I now don’t have any screenshots of that part of my progress and it’s essentially very, very sad.
Okay. Development time is over.
It’s late now (in the last few minutes before my deadline) and Dad and I are having an extended discussion regarding the implimentability (that’s not a word) of the user interfaces I designed in a rush this morning.
I mean, that’s not to say that they aren’t implimentable, strictly speaking. It’s more like OH GOD WHY WOULD YOU WANT TO DO THAT!? — Just poor design decisions because I didn’t remember the limitations of XCode, basically.
As with all aspects of life, some things are easier in Photoshop than they are in the real world.
It’s just that I’m making way more work than I need for myself in an app that’s meant to be a single day project. This is mostly a result of a lack of self-evaluation after my initial design phase. A little reflection at around noon would have gone a long way for making the next 12 hours make more sense.
If I could start now at noon, I would sit down, prioritize the features I want to put in, prohibit myself from exporting any graphics from Photoshop until the main functionality of the app was working, and then sit down and start building only the most valuable features that would be used in the smallest version of the app I could imagine.
I mean this is pretty standard minimum-viable-product practice, I just completely ignored what I already knew because I was wayyyyy too excited to be doing this.
Remember, no matter how excited you are, the brute force approach to elegant app design does not work.
So the local software engineer and I did some exploring and arguing and discussing and found some fun ways to cut down on the visual and conceptual complication, while keeping the code light, and still providing the basic functionality I first imagined.
I think I like the simplicity of the approach in these mockups much more:
As you may have seen coming ...It’s 1:50 AM. I’ve learned a great many things, and I will not be publishing an app tonight. Aren’t you glad you stuck it out and got to see me fall flat on my face? Me too.
So the good news is we got here.
There’s an app on my screen, I can launch it. It does some stuff, but it doesn’t do the important stuff. For example, it will not remind me to post an Instagram tomorrow.
It isn’t on the app store either, so I would say that strictly speaking the One-Day-App is most assuredly a complete failure.
Here’s what I learned:
Just kidding, I have some useful suggestions based on what amounted to a really cool learning experience and some much-needed family time:
- Plan the whole thing out. Like I said in the beginning, 90% planning, 10% execution. Not 40% planning, 60% wishing you knew enough to execute (as was demonstrated for you today).
- Part of that “90% planning” should be mentally spending (at least as much time as you spend designing, which would have been noon ‘till 4pm for me) doing your best to switch between the design and development styles of thinking and critique your chosen user interface approach. There is no right answer, only a hopefully-close-to-optimal compromise between efficient code and usable interaction design.
- Your review time should focus on establishing which designs need to be simplified for the sake of writing less code, and which data structures need to be simplified to make the design intuitive and generally user friendly.
- Decide whether you’re working on your own or with a team beforehand. Having my solo-project unexpectedly become a team, even if it was a pleasant surprise, ultimately spelled the doom of my one-day-project because suddenly the requirements for effective action became much more involved. Communication is hard. You’ve got to plan intentionally for effective team coordination. Today this didn’t happen until about 10pm.
- The note-taking, styles of collaboration, and other important elements of how you will spend your development time depend hugely on who you’re working with and what domains of the development process they’ll be contributing to! Plan accordingly. Plan plan plan.
- Make sure every new addition to the team has a full understanding of the goal you are working toward. Walk through the app design together in simulation before trying to build anything together.
- Do not — under any circumstances, no matter how dire— try to make an app in 12 hours if you have’t written a line of code in half a decade. The curve is too steep. Your time estimations will be terribly inaccurate. Everything will be disorienting and awful.
I’m kidding with that last point, again, of course. This was an absolutely positive experience. With these socks how could it not be?
Check this out:
I’m pleased as heck about seeing an app on my home screen that I made on a whim today.
And lest I focus only on what I did wrong, here are some things I did right:
- I kept the concept comfortable, small, and easy. It solves a simple problem, and it does so in a way that doesn’t create more questions than it answers or invent more problems than it solves. This is the central difficulty of functional design.
- Note that I said functional design, not pretty design or good design. I think another thing I did right was not sweating making the app look good. I just focused on making something that was usable and obvious at first glance. Every function in the app is naturally discoverable, especially with the latest redesign. No secret double taps or swipe-in-from-the-side gestures.
- I wasn’t afraid to story board before implementing. It would have been easy to say “I only have one day, I’ll wing it.” — even with as little thought as I put into the initial design, the project at least got half-way built because I didn’t wing it and I knew where I was going. It was easy to measure success.
- I wasn’t too resistant to changing plans based on new information. Switched to Objective C, changed some layouts and designs. Re-thought which things would be graphics and which could be rendered by code. Asked for help when I needed it. Didn’t waste any time trying to solve intractable problems or going in circles. All of those are easy mistakes to make early on in a project, so those all count as small wins.
I’m most pleased that if I actually had my wits about me (or more precisely, if I had actually been a developer like the guy who wrote the article that inspired me this morning), I would have had a pretty well-estimated one-day-app on my hands. That’s pretty exciting.
Overall, not a total loss as Sundays go. I’m a newly minted iOS 9 developer!
As it stands, this app will probably take several 2-hour blocks over the course of the next week to complete, and maybe next Sunday as well. I will be able to finish and publish it if I decide that’s worth doing, but I’m giving up on the binge approach.
I’m so pleased to have had an entire free day to throw at diving back into an old passion like app building. There are several parts of the software development experience that I miss, and many that I don’t miss at all. I got to see more than I bargained for of both sides of that coin today.
Not sure whether I’m going to continue documenting this process from here on out. If not, thanks for reading! This has been a wild ride. I’ll update this post with the app store link when it’s up!
Steve Moraco is not a developer, but he does occasionally write things. Not code, mind you, but articles like this one!
In fact, he has an entire blog over at SteveMoraco.com - and an about page, too. You should check it out.
And if you like this thing and you want more things like this thing, click the thing-proliferation-button (it's shaped like a small green heart, and it's right below this, just keep scrolling!) - Click it immediately.
While you're at it, click "follow," too. The follow button doesn't do anything. Just click it because it's pretty. Try it. Go ahead.