You can turn a bunch of great ideas into a crappy product real fast by trying to do them all at once. You just can’t do everything you want to do and do it well.
Rework by Jason Fried and David Heinemeier Hansson
Half-assed products abound. Sometimes it’s simply a lack of quality. Often it’s something else.
When we think of a product, we usually think of it’s features. How many features? What features? Et cetera. If you haven’t built a product before, let’s do a quick thought experiment.
I tell you that you have two hours to clean the house. You have toddlers. That are home. And awake.
How much got done in that two hours?
Now I tell you that you have two hours to clean the kitchen. Same toddlers. Still awake.
How well did the kitchen get cleaned in each scenario? I bet the kitchen was a lot more clean in the second scenario.
Cut your ambition in half. You’re better off with a kick-ass half than a half-assed whole.
When we pare down our tasks, we do better at accomplishing them.
Same goes with product design. When I started building my chord finder app last year, the feature list was long. The competition had tuners, metronomes, and even song sheets. But those features never once hit my list. Because I couldn’t create a kick-ass chord finder if I was building a tuner. I’d end up with a half-assed chord finder. And a half-assed tuner.
But I did have other features on the list that didn’t ship with version 1.0. They didn’t ship with 1.1 either.
Most of your great ideas won’t seem all that great once you get some perspective, anyway. And if they truly are that fantastic, you can always do them later.
As you build, you will often get to a point that the product is complete. And sometimes it will surprise you. A feature you thought essential wasn’t. A feature you thought wasn’t essential was. If you prioritized your tasks well, you didn’t build the inessential features.
But the beauty is, you can always add them later.
Selah Chords will never have a tuner. That is a different product. Selah Chords is about chords. But coming to Selah Chords early this year is custom tunings, filtering, and more.
I build kick-ass half— not half-assed whole— products. Download Selah Chords today and see what a great, easy-to-use, hand-crafted chord finder can be.
Early this year I started playing with an app idea that became Selah Chords. I had a working prototype of the engine that would power it. I knew it could work. But what would differentiate it would be care for UI. Make it easy to do the things that needed to be easy. Instead of focusing on all the other tools that could be added— literally, the competition nearly includes the kitchen sink in their apps— I would focus on doing one thing really well.
A recently (at the time) published article from Michael Flarup had me encouraged to explore skeuomorphic design again, something I had been itching to do for years. To be honest, app design today is too bland. Most of us know that. It used to be full of texture and UI work, parts of the process that would take months. Each app had personality. Then iOS 7 happened. And all that work got thrown aside. Read that article.
I explored a number of paper, notebook, and other interface metaphors for Selah, trying to find a voice that could work. And in the end, I could not find a voice there. And the reason was because I wanted to rely on the screen, not the physical world’s physics.
I had one major interaction that needed to be nailed, in my opinion. Finding a chord. Seems easy, I know. But everyone makes the easy hard, for some reason.
This is a great app. I honestly use it quite a bit, as it supports chords that Selah Chords does not support. But finding a chord in Guitar Gravitas sucks. First, the root note selector is a slider. Second, the selected state is a dotted, 1px tall underline. This thing is horrible.
Then there is the scroll direction change in finding a chord. This app uses multiple panels that all scroll independently. This is not an iOS convention and instantly feels off. Mind you, on iPad, this is better because of the screen size.
The biggest reason that I use this app regularly, as opposed to others, is because of the chord charts. It shows me tons of voicings without the trouble that other apps make of that.
One of the most popular guitar apps, as it is a tuner— a pretty good one— that also provides other tools. Personally, if you want a good tuner, get Fine Tuner, but that is a different topic. The chord library tool is what we are focusing on here. Once again, sliding lists for root and chord, but made worse by the scroll for voicing. Guitar Tuna only provides a handful of voicings— standard movable shapes, essentially. But to see them, you have to flick one-by-one through them.
I do not use this app much. Mostly because the interface is less than ideal.
Another popular guitar app. Tuner? Check. Metronome? Check. Scales? Yup. And chords. That root note selector is better. All on one screen. No scrolling. But now to select a chord, you have to find it in a scrolling collection view— rows and columns— and expand it.
Wait, don’t tap— damn. It just played the chord. You wanted to see more voicings, didn’t you. Yeah, tap that small expand icon. And now, when the collection would have made since, you get this scrolling list of voicings and a guitar neck that takes up two-thirds of the screen.
Finding my Voice
As I looked to solve this one interaction, Jared Sinclair shipped ’Sodes. And boy. While not skeuomorphic, while super minimalist, it wasn’t boring. It wasn’t bland. Subtle gradients, sparse, well-thought our content layout design. The content was king, not the interface. But even without the interface being king, it didn’t get so far outta the way that you were confused. Buttons had borders. They looked like buttons.
So instead of making beautiful, meticulous textures, I started storyboarding animations. The first test of what I deemed gooey animation was built.
Instead of sharps getting their note name repeated, the sharp extended the preceding note button. The construction under the hood is fun, taking accessibility into consideration with an accessibilityLabel of the full name (“C#”).
And then the sliding selection. Clear selection state was important. At this point I was using Guitar Gravitas and that was my biggest grievance. Animating this allows for a fun, hand-crafted interaction, while not getting in your way. This is done by making the animation quick and informative.
The chord selector is brief. I didn’t need to support a hundred chords. Why? Because the most common chords can be summed down to a handful. I’m not looking to build the only chord finder you use, just your favorite.
Is Skeuomorphic Dead, Then?
I hope not. What I know is that it wasn’t right for Selah Chords. Which surprised me at first. I wanted it to be right. It might be for your app.
Banjo support is coming. Selah Chords started with guitar, ukulele, mandolin, and dulcimer. I am adding banjo. Also copying or dragging voicings out of Selah Chords is coming. And favorite voicings. And who knows what else.
Over the last year I have been learning both ukulele and mandolin, after 20 years of playing guitar. As I tweeted over the weekend, I bought a ukulele and looked for a chord app. I had a couple for guitar, but none of them supported ukulele. I found out pretty quickly that most of the apps suffered from similar issues. They were hard to use— bad UX/UI—, lacked iOS esthetic, and didn't have the features I needed most where they needed to be.
Now so much of that is subjective. Yes. True. When I am looking for a chord voicing, I am looking for where I can play it. The most popular apps show a single voicing at a time.
Take this app from The Ukulele Teacher. Are there other voicings? I will guess that the 1/32 up top indicates that there are. But how do I get to them. Swipe right to left? Nope. Maybe that next arrow in the bottom right? Crap! Now it's playing an audio clip of the voicing. Swipe up? There it is! But no scroll indicators, just a change of the fretted notes and the "1/32" changed to "2/32".
Now I want to switch to a D minor. How do I do it? Tap the C major "title" up top? No. The music note at the bottom?
Not the easiest thing to use. And to be hidden away behind an ambiguous button when it is an action I am going to use the most? Not good.
I have been playing guitar for 20 years and never learned basic music theory. I didn't know how chords were formed, just where they were. Sure, I knew that they were multiple notes being played, but I never cared or concerned myself with which notes aside from my root was being played.
So I started there. How is a C major chord formed? Well, it's based on the C major scale. I didn't know my scales. Or how they were formed. Guess I would start there.
A scale starts with the root note and then takes a certain number of whole and half steps between notes back around. A major scale, for instance goes 1, 1, 0.5, 1, 1, 1, 0.5. That C major scale? C, D, E, F, G, A, B, C.
So back to that C major chord. How is that chord formed? A chord is formed on intervals of a scale. The major chord is using the I, III, and V intervals of major scale. Roman numerals for some reason. There is likely a wiki page for that explanation, if you are interested. So we start at I, which is our C, go to III, our E, and end on V, our G.
To the programmer reading this, you might have noticed that this is math. I certainly did. And math I can do. I love math.
So I Built an App
Looking through the App Store for an app that scratched my itch made me sad. As a UX/UI engineer, I decided that if this was just math, I could design a better looking/working app and build a chord finder that didn't suck. But first I needed an engine. Take that math and turn it into an algorithm. An algorithm that I could hand a set of strings and tell it to find the C major voicings— different ways to play it across the neck of my ukulele.
This was, surprisingly, done on an iPad. I opened Swift Playgrounds and built the first prototype of the algo there. Even had it doing basic drawing of the chord chart.
The algo was straight-forward. Use the above math to find the notes of the requested chord, find all the notes on the set of strings given, then find all possible combinations of those notes on those strings. From there start narrowing it down to actual, playable chords.
It worked, so I started the design process.
Defining the App
What's in and what's out. So I had a powerful algorithm. I could give it 4 strings, and it'd find the voicings of a specific chord. I could give it 5 strings. Six strings. Seven. Ooo. I decided I wanted to support multiple instruments, obviously guitar and ukulele being the top of that list. But as I built the first working prototype app and had it running on my phone, I switched to mandolin strings and went to Guitar Center to play around. See how well it worked and if I could pick up another new instrument. And it was a success. One that went onto me buying a mandolin too.
The app was to stay simple. Prize simplicity, be willing to hold back functionality that other apps may have. No scales, no arpeggios, lots of noes.
So what was required?
A beautiful, clean interface. Easily scroll through a list of chord voicings. Big enough that you could read them comfortably, but small enough that you could see many at once.
A simple mechanic to switching between chords. That above ukulele app made it very difficult to switch chords. Others do as well. I wanted none of that. So my app would have two bars. Segmented controls. Easily switch between root notes and chords.
Multiple instruments/tunings and easy switching between them. This would be in a drop down. I wanted this to be quick to access, but you wouldn't be switching instruments as often as you switched chords, so a drop down was logical.
Removing Features and Narrowing in on Version One
I wanted banjo support in version one. And the ability to mark a voicing as a favorite. And support for adding custom tunings. But shipping is more important. I shifted from feature building to spit-shine mode in October, realizing that I had a perfectly usable app.
I always remind myself of 37signals's Rework book. Do I want a half-assed whole product or a kick-ass half product? I can ship a dozen features with bugs and no polish or ship a half-dozen features with delight and polish galore.
So I Spent My Year on an App
Like most programmers that decide to pick up a new hobby, instead of learning and mastering ukulele this year, I learned basic music theory, built, and launched an app.
Selah Chords has shipped. And the initial reviews are that it is beautiful, intuitive, easy-to-use, and extremely useful.
And coming soon, banjo and favorite voicings. And after that, custom tunings.
Truth matters. Words matter. Without meaning, words are pointless.
When you hear “school shooting”, yesterday is what comes to mind. And yesterday was terrible. Seventeen dead. And it took just minutes for the media to start talking about ways to prevent this, both sides having their piece, their take. Before the bodies are even buried, before most parents even knew their kid was one of the dead ones, we are calling half the country evil for supporting gun rights.
The statistic being quoted by many last night and this morning is that in 2018, a year that we are only some forty days into, has seen eighteen school shootings, referring to the reporting from a group called Everytown for Gun Safety. That is truly an appalling number. 18 school shootings. When you hear “school shooting”, yesterday is what comes to mind. And yesterday was terrible. Seventeen dead. But yesterday is not what Everytown is calling a school shooting. They are counting all shootings at schools or involving schools. Truth matters. Words matter. Without meaning, words are pointless.
So what does this reporting from Everytown mean? Eight of those eighteen resulted in no injuries or fatalities. Two were suicides, one in the parking lot and one in the bathroom at a school. One was a gun fired unintentionally, no one hurt. Of these eighteen incidents, three people were killed— not including the two suicides— and roughly 30-35 were injured, according to The Daily Wire.
We all wish that yesterday was one bad day out of a million good days. We all wish we had a billboard that counted the days from the last school shooting and it had been at 30 years. But when “we include suicides, accidental discharges, purposeful shootings without injuries, and purposeful shootings without only ‘superficial’ wounds” as school shootings on par with what happened yesterday our words lose meaning. We become numb. Yesterday was just another school shooting. That was the new normal. But it isn’t. It isn’t the new normal.
Truth matters. Words matter. I hope that you agree.
As Republicans defend President Trump's language once more, I stand over here as a conservative without a party. These fake, ambulance-chasing Republicans are trying to defend a sitting president using language we wouldn't want our children repeating. I said after the election that I couldn't vote for President Trump because "I couldn't explain that to my daughter". I can't agree with them. This language is inappropriate for a world leader to be using to describe our allies.
But the Left wants this— too— to be about racism. It has to be about one of their -isms or -phobias. It always has to be. Why? Is it because victim identity is the new sacred? Had he called Norway, a predominantly white nation, a shithole, would so many Leftists be offended? Would they think he's talking about race?
I don't agree that this is about race. No, I think this is a case of a man that lacks control of his tongue. He described a poor, third-world nation as a shithole. He described a nation, not the people. Yes, there are, to quote a tweet, brown-skinned people living there. But it's a nation that you see no one aside from missionaries choosing to spend their vacation days on.
So you might read the above and think I agree with the term as an adequate word to describe these nations, if one is not the President of the United States. And you might be right. But my church sends a lot of money to these nations, bringing food, water, and the Gospel of the Living God to these people. My God redeems prostitutes, dines with tax collectors, and makes the poor rich. The shitholes are just as much His as are the bastions of freedom and wealth.
In my opinion, is not our government's job to raise these people out of poverty, clothe them, feed them, and give them water. But, Christian, it is yours.
A young man was talking to me at church on Sunday about sports. He was bewildered that people pay to watch football when all the outcomes are planned ahead of time.
This got me thinking. Our Lord knows the outcome of every play in our life. Every misstep, every mistake, every error, every foul. Every success, every friendship made, every life saved, and every victory until time ends.
Roy Moore lost, not because Alabamans are stupid. Roy Moore lost because Roy Moore was a terrible candidate with child molestation allegations hanging round his neck. Moore should’ve been better vetted, one. But also abandoned when credible allegations came forth. Because it turns out some Republicans couldn’t stomach voting for a man accused of getting handsy with an underage girl. Yet this is somehow surprising to red-eyed morons convinced just being against the Democrats is a winning strategy. Roy Moore lost because too many egotistical Republicans in high places overestimated the power of tribalism: “Moore has an (R) after his name, ergo #MAGA and screw the libtards!”
Just “being against the other tribe” didn’t work in Alabama. It won’t work nationwide in 2018 either. Or 2020.
Conservatives, you had better hear this. I know many that voted for Roy Moore did so because of the two-party system, because of the “lesser of two evils”. But many more did so because he was a Republican. But running as a Republican shouldn’t be enough.
We are a party of ideas. We are a party of ideals. This man had heavy allegations hanging from his neck. Same with Trump. It’s why Trump was close to not winning. Literally anyone could have beat Hillary. But we picked the most polarizing, most offensive, worst candidate in recent history.
We need to learn to vet our candidates better and when shit comes out, we need to push them aside. Trump’s famous recording should have been that moment for him. These allegations, once credible, should have been the moment we pushed Roy aside.
We will lose in 2018 and 2020 if we do not get away from tribalism.
If you’re a conservative in tech, it is next to impossible to live in an echo chamber.
Over the last week, my Twitter timeline exploded with rage over the two big GOP topics of the week: net neutrality and the big tax bill. If I was to believe my timeline, these two items were doomsday-grade events. There was no way that a human could stand by this massive tax bill or against net neutrality. Not a single dissenting voice.
Sometimes this is a real sign that something is truly important and should be stood for or against. Sometimes this is a sign of a lack of diversity in thought or ideology in your news feed.
Seeing all these voices — voices that I greatly respect — freaking out over the tax bill, I started to wonder if the GOP had truly jumped the shark. So I went to a few major news sources and a few minor ones. I sought answers and tried to understand the facts from my worldview. And found myself agreeing with the majority of the included items, while also understanding how others would see these as bad.
Echo chambers exist when we surround ourselves with a homogeneous group of voices. As a conservative, it is next to impossible to live in an echo chamber. If you want to follow anyone in tech that matters, you’re going to hear opposing views on political matters.
What are you doing to stay away from echo chambers?
The web, at its best, should be resilient. Nothing warms my heart more than a 20 year old page that’s still kicking, a 10 year old link that redirects properly onto a completely new domain or platform or a modern site that can serve something useful to a 15 year old browser. To me, that’s the web at its best.
Someone replied to my big #bbd17 post yesterday about my advocating for sites that work in IE 6. To note, it’s the quote above that this is in reference to.
As a front-end web developer, I do not test regularly in IE 6. I haven’t tested in IE 6 in a very long time. However, I write structured HTML that can be displayed without CSS. I write JS that isn’t necessary for the display and functionality of the page. So these things gracefully degrade.
No, my pages are not pixel-perfect in 15 year old browsers. But the content is accessible.