Exercises For Programmers: Exercise One-Saying Hello

A couple of months ago I bought Exercises for Programmers by my friend Brian Hogan. I was trying to find some mini challenges for myself like I had when I was a student when I would just work on a small, solvable problem.

When I think about programing, I usually get really overwhelmed by thinking about all of the components I need to make a minimum viable product. I start thinking about having to learn everything I have to do in order to put together a whole application. I wind up not doing anything because I feel like I have to learn twenty things before I can start coding rather than just diving in.

I have worked on other people’s projects and been given some rather explicit functionality that I have to have that is divorced from thinking about how to construct an actual program.

When I initially looked through this, I was disappointed because I felt like this was more targeted at people learning programming. There were tip calculators and Hello, World. So I got all sulky and emo teenager and decided this was not for me.

I was wrong.

I am planning to go through each exercise in this book and treat each exercise as a complete project. I am going to write unit tests for all of my code, make sure that the auto layout works, and try to think about what constraints I need rather than just trying to get something that works under specific circumstances.

User Interface and Autolayout

The first exercise in the book is a play on the usual “Hello world!” application. In this, you take user input and you output it to the screen.

To get user input from a user in iOS, you need to set up a bunch of UI elements: a label asking for your name, a text field for your name, a button to enter your name, and another label to display the message.

goodAutoLayout

This is a slightly embarrassing thing for me to admit, but I do not work much with user interface stuff. For the last two years I have worked exclusively on things like unit tests and network programming. The last time I worked a lot with user interfaces was around the time Storyboards were introduced. I have not mastered the Zen of Auto Layout.

Initially, I thought I had all of my elements laid out properly, but they didn’t show up where I wanted them to. I realized I had to go in and figure out a bunch of constraints to see what I wanted to on my screen.

autoLayoutFail

The top and bottom labels were easier because I knew I wanted them to be centered. The button and the text field were harder because I wanted them next to one another and I couldn’t center them the same way I did the labels.

autoLayoutFail2

I thought about giving up and just putting them on their own lines, but that kind of defeats the purpose of doing these exercises. I vaguely remembered that I can line things up by the leading or trailing edge. I liked the text field up with the leading edge of the top label and the button to the trailing edge of the top label. The text field rendered out to be about two characters wide, so I added one more constraint to maintain the spacing between the text field and the button.

HelloDelia

Programming Logic

Now that I have the layout working properly, I needed to think about what my failure cases are. Back when I was a student, I would just pull out whatever was entered in the text field and print it out on the screen. Since I want to write unit tests for this, I needed to put more thought into what would be a “bad” input.

The two that I could think about were either not entering anything at all, or entering in a number.

Since the text field is an optional, I needed to wrap it in an if-let. I thought about using a guard statement, but I didn’t feel like it would work in this case because I didn’t just want the result to be nil if you didn’t enter anything. I wanted to actually do something if it was nil, so I stuck with the if-let.

I thought that if there was nothing in the text field when you clicked on the button that it would be nil, so I had an else statement to state that if you just clicked on the button. That did not work because the text field returns an empty string. So that became a case I needed to check.

The last one was trying to figure out how check if the string contains a number. The ability to check a string for a number has changed a bit over the last two years in Swift. There used to be a toInt() function on the String class, but that was replaced with an initializer on the Int class. You pass a string into the Int initializer and if it can be converted to an int then you will have a value, otherwise, you get a nil.

Testing and Decoupling

I did my own testing on my application and I was able to trigger all three possible string outputs. But I want to get in the habit of writing unit tests for all of my personal applications. When I worked for Brad Larson, the main component of my job was to write unit tests for our code.

One way we were able to do that is because we made things very functional. We had very few classes. We had a lot of stand alone functions that could be tested thoroughly on their own. We created fake hardware objects in code.

That was harder to do with the view controller. I could make a function within the view controller to process the input from the text field, but I couldn’t do things as functionally as I wanted to.

Then I realized I could break my function up. Initially, I had this:

@IBAction func enterName(sender: AnyObject) {
    if let name = nameField.text {

        let myInt: Int? = Int(name)

        if name.characters.count == 0 {
            helloLabel.text = "You need to enter your name"
        } else if myInt != nil {
            helloLabel.text = "You entered numbers, not a name"
        } else {
            helloLabel.text = "Hello (name), how are you?"
        }
    }
}

This coupled the code in such a way that it was impossible to pull that code out and make it testable. Everything in this function was talking to parts of the class, so I couldn’t pull it out and make it stand alone.

So I rethought was I was trying to do. This function needed to do one thing: Set the helloLabel. I was making it do two things. I was also making it determine what the helloLabel was set to.

I realized I could make the output from the text field into a parameter that could be passed into a stand alone function.

I changed that function from what I had to this:

@IBAction func enterName(sender: AnyObject) {
        if let name = nameField.text {
            let nameString:String = nameFunction(name)
            helloLabel.text = nameString
        }
}

func nameFunction(name:String) -> String {
    
    let myInt: Int? = Int(name)
    
    if name.characters.count == 0 {
        return "You need to enter your name"
    } else if myInt != nil {
        return "You entered numbers, not a name"
    } else {
        return "Hello (name), how are you?"
    }
    
}

I pulled the nameFunction out of the View Controller and I put it in a Helper Function file. This function is the only part of this program that I need to unit test and I pulled it out from everything else. This makes testing my programming logic a snap.

    func testLabelOutput() {
        let emptyString = ""
        let numberString = "42"
        let normalString = "Delia"
        
        let firstTest = nameFunction(emptyString)
        let secondTest = nameFunction(numberString)
        let thirdTest = nameFunction(normalString)
        
        XCTAssertEqual(firstTest, "You need to enter your name")
        XCTAssertEqual(secondTest, "You entered numbers, not a name")
        XCTAssertEqual(thirdTest, "Hello (normalString), how are you?")
    }

Conclusions

I am a little embarrassed that this took me longer than I thought it would. I have my name on a few programming books and I “know” this stuff. The Apple ecosystem is an incredibly vast and complex system of knowledge. If you don’t work with something for a while, it takes a while to remember how to do things and shake the cobwebs off.

There are a lot of considerations I put into this exercise that I would not have bothered with when I was a student. I would have been like, why bother making this testable? It works. No one is going to be stupid enough to post numbers and if they do, who cares?

That isn’t a good way to think.

It doesn’t matter what kind of application you are doing. You should try to make everything you code the best that it can be.

This was a good exercise for me to think about this differently than I would have, especially knowing I was going to write unit tests. I rewrote that function a few times and almost thought I couldn’t decouple it until I thought about it for like an hour.

I could have had this working in ten minutes, but the UI would have been screwed up and it would not have been safe.

I am still not happy with the final version of my code, but I feel better about it than I did before. I hope that someone will code review this and tell me how I could have done it better.

All in all, this was a really interesting thought experiment. There are lots of dark corner in my brain of things that I don’t know I don’t know. Shining some light into those corners and airing them out is a good thing to do every once and a while.

I am making a GitHub repository for my exercise if people have any interest in looking them over and comparing notes.

Catch you next time!

Also, if anyone can give me some suggestions about how to get code to format reliably in WordPress I would appreciate it. Sometimes it works and sometimes all of my formatting is gone.

Minimum Viable iOS Engineer

Parable of the Shrew

My father works at the Botany Department at UW-Madison. When he was a graduate student he worked as a naturalist at a state park in South Carolina. When I was growing up he told me a lot of stories about this park. One story that he told me in particular has stuck with me most of my life. I have been meaning to write a blog post about it, and I feel like now is the time.

One day while he was working at the state park, he found a shrew. A shrew is a small rodent that eats crickets. My dad captured it and took it back to the office with him. He knew it ate crickets, but wasn’t sure how many or how long it had been since the shrew had eaten. He wanted to be safe, so he put the shrew in an empty aquarium with a hundred crickets, figuring that would be enough.

He came back the next morning to find the shrew dead on its back with all four little furry feet in the air. It was surrounded by dead crickets. The shrew was so fixated on killing every cricket in the aquarium that it forgot to eat any of them and it starved to death surrounded by food.

Resist the Temptation to Be the Shrew!

Yesterday Apple had their announcement of the new tvOS, along with a lot of other new toys that made my head spin.

I noticed a lot of people dropping the watchOS stuff to pick up the new tvOS stuff because it was the new thing and they didn’t want to get behind.

I want to say something that is going to make you feel bad. Take a deep breath. Relax. Here goes.

We have reached a point with the platform where we can’t know everything.

When I started programming I figured I would learn a few languages to cover my bases and give me options for when I went looking for a job. I realized that this was a bad tactic so I picked the one I most wanted to work with. I have further specialized to more and more specific areas of Apple development.

Every time that something new and shiny is announced, I feel compelled to learn something about it. I have Ray Wenderlich’s WatchKit by Tutorial on one of my computers and I don’t know if I have ever opened it. I also have their Animations, Core Data, and several years of iOS By Tutorial in a folder on my computer unread. I feel an incredible amount of panic because no sooner do I hear an announcement about something, my Twitter feed explodes with people who have dug into the docs and are sharing what they read. I have barely processed that something new has come out and already people are doing something with it. It gives me tremendous anxiety and makes my head spin.

I have been working myself into a tizzy just trying to keep up with what I am doing at my job. I have not used the iOS frameworks in about a year. I have a book out on iOS development but I don’t use it every day and it’s basically gone from my memory. I know if I had to use it every day I would pick it back up again fairly quickly, but it still disturbs me that I just don’t remember this any more.

I keep feeling like I need to know Core Data and Networking to stay marketable. I have a list of things that I think I need to know because if I don’t know them then I am not a real developer and people will shun me when they find out. This fear leads me to work all the time. I regularly suffer from exhaustion. The last two weekends I spent two days in bed internally screaming at my body for giving up on me because I have deadlines I need to meet and I don’t want to let people down.

I can not continue this way. If you are going through this, you can’t do it either.

This year at 360iDev there were a lot of talks about the death of independent development. We’ve moved beyond the point where you can make an app in your free time on nights and weekends that is going to be a minimum viable product. Believe it or not, this is a good thing.

Back in 2009 when the platform was relatively new, you could know everything. It was possible. The reason it was possible was because the platform was incredibly limited. There were a lot of things you couldn’t do, or couldn’t do easily. Now we are living in an embarrassment of riches where almost everything is possible, which means YOU CAN’T KNOW EVERYTHING!! Stop trying!

What is the Bare Minimum You Need to Know

I celebrated my first work anniversary on Tuesday. Before that I worked at a start up for two months, worked on an OpenGL contract application for three months, coauthored a book, and did over a dozen conference talks. I have a shocking amount and diversity of experience for a developer who has less than two years of experience.

I don’t know Core Data. I don’t remember most of iOS. I haven’t worked with Interface Builder in a year even though I intended to specialize in graphics and design for iOS.

I think that the amount of things you need to know to be a beginning iOS developer is smaller than most people think.

I talk to students at the tech school I attended and all of them think they need to know a lot of stuff. I would argue that you don’t need to know a lot of stuff, but the stuff you do need to know you need to know well.

Here is my list of what I think you absolutely need to know to have an entry-level iOS job:

  • Some fundamental understanding of either Objective-C or Swift. Both of these languages have a lot of unique aspects and I would argue it is important to have enough of a grasp of one of these to understand why you don’t program them like Java or some other language.
  • The MVC design pattern. This is a fundamental pattern that permeates all of iOS. If you do not understand this pattern, you will not write good iOS code. It is vital to understand this.
  • Know how to use the Apple documentation to look up how the frameworks work. You can’t know everything, but you at least need to know how to learn what you need to know.

I think knowing Core Data or Networking or any of the other multitudes of things are nice career embellishments, but I think if you are looking to bring on an entry level person and train them, this is what they need to know.

I don’t know how to do Networking. I have never had to know it for any job I have had. Same with Core Data. I know a lot about things most people never need to use like how to connect to a FireWire camera and how to parse LibXML2. These are things I learned because I needed them for the job I have. If I were looking for another job I am sure knowing Core Data would make me more marketable, but I wanted to find the right job for me rather than being qualified for a lot of jobs that aren’t really a good fit.

I don’t think not knowing how to do NSURLSession or how to make an Apple Watch app makes me an impostor or a bad developer. They haven’t affected my ability to get a job yet and I don’t think they ever will. If I need to learn them for something I am doing, I know enough that I can teach them to myself and if I forget them again, then I wasn’t using them.

I worry about people spending so much time learning “superficial” stuff that lets them build an app but does not teach them how the app works so it can’t be applied to anything else. I think instead of creating an aura of fear at not knowing everything, we focus on what is the essential amount you must know and enable people to learn the things they need to know to specialize or that interest them.

Specialize

At 360iDev last year Saul Mora and I were discussing the possibility of setting up something like a co-op for developers. If you had an app idea where you needed to know something you didn’t know, you could post it on this message board and if someone knew how to do it, you could negotiate working with them on it. I don’t particularly want to learn a bunch of stuff I don’t care about to make something and I would love to work on someone else’s project only doing the things that I want to do.

Like all good ideas that are formed by committee, this got bogged down in a lot of implementation details and forgotten. I still think this is the only way for independent development to move forward.

If you have a group of four people with different technical skills working together, you can put out a really nice app in your spare time. The gold rush is over, but I would hope that some people are involved in app development because they enjoy it and have ideas they want to share with the world.

I feel that Ray Wenderlich has embraced this idea. He has a large team of people working together on the tutorials because it simply got to the point where he couldn’t do it alone. We have a large pool of knowledge and resources and we are able to accomplish more than any one person could. I think he’s a great example of what you can do if you start trying to think cooperatively rather than singularly.

I think we need to move away from the idea of the solitary developer working in their basement over a weekend and move towards the idea of having a team of friends you can work with and share ownership of a product with. Even if the app never earns a dime, the act of working with your friends to make something you are proud of is a goal in and of itself.

So, to everyone feeling shitty because you can’t keep up with the new and shiny, stop it. Go easy on yourself. We’re at a turning point where things are going to be different and you can’t hold yourself to those standards anymore. Focus on the fundamentals and what is important to you and you will be fine. The platform has matured and it’s a good thing.

Zen and the Art of Analog Synthesizer Maintenance

2014: The Year of Magical Thinking

You can take a picture of something you see
In the future where will I be?
You can climb a ladder up to the sun
Or write a song nobody has sung
Or do something that’s never been done

Last week I was in Atlanta for CocoaConf Atlanta. That conference was the cap on one of the craziest years I have ever had.

Exactly a year ago I had dropped out of school because I was having a nervous breakdown. I knew I needed to find a programming job but I had no idea where or how I would do so. I was completely broken and I had no hope that anything would get any better. The only thing that got me through that period of my life was the faith that something would happen.

I spent a lot of my time in 2013 sowing seeds, hoping one or two of them would take root. I attended several conferences and met a lot of people. Two of the people I met were Jonathan Penn and Chris Adamson. Jonathan mentioned he was writing a book and wanted to know if I would tech review it. Being a tech reviewer is an unpaid task, but I like and respect Jonathan, as evidenced from this blog post.

The editor for Jonathan’s book is Rebecca Gulick, who also happens to be the editor of my book with Chris. When he was looking for a coauthor and he mentioned me to Rebecca, she already knew who I was.

Before I was approached about writing the book, I reached out to Brad Larson about learning OpenGL. I knew I wanted to be a graphics programmer, but that it takes a long time to learn, especially for someone like me who didn’t have any programming experience until two years earlier. My reaching out to him resulted in me having the chance to work with him on a contract project for Digital World Biology. Even though we were working on this project, I hadn’t met Brad in person.

I happened to meet Brad in person a week after I signed the contract to work on the book with Chris. I didn’t know it at the time, but the book I was working on used to be the textbook used for the iOS programming class at MATC. That definitely made an impression.

Six months ago, I had a couple of conferences that I knew I would be speaking at. I wound up doing twice as many as I thought I would. My first conference talk was less than a year ago. This year I spoke at ten conferences total.

Between writing a book, traveling all over the United States, and getting a job with one of the best programmers in the world working on robots, my head is spinning. There are so many things I thought I might get to do a few years down the road. I just wanted a job to get some experience so that maybe one day in like five years I would be able to work with someone of Brad’s caliber. I hoped that maybe I would be able to work on a book in three years.

I looked back at the goals I set for myself at the beginning of the year. No, I didn’t wind up starting a podcast or buying my MIDI wind controller (however that is on the horizon). I set out six long-term goals that I wanted to do in the next 3-5 years. I have knocked half of those off in 2014.

Depression

Oh brother I can’t, I can’t get through
I’ve been trying hard to reach you, cause I don’t know what to do
Oh brother I can’t believe it’s true
I’m so scared about the future and I wanna talk to you
Oh I wanna talk to you

I am going to be honest. I had absolutely no idea how to proceed from here. Part of being alive is to strive to go further and do better. Once you get to where you want to be, what do you do? I always feel a bit of a disappointment when I finish my cross stitching projects because I keep feeling like I will feel a sense of accomplishment, but it’s always a letdown. I enjoy the process of making the thing more than the joy of accomplishing them.

Part of my excitement about these long term projects was the anticipation of all the neat things I would get to do between then and now. I was really looking forward to all the neat stuff I would get to do and all the time I would get to spend working on my craft.

None of that happened.

Things happened so fast that I haven’t had a chance to enjoy anything I have been doing. I haven’t had a chance to stabilize the ground under my feet. I haven’t had a chance to really dig deep into something than interests me because I am running around like a chicken with my head cut off rushing to the next thing.

I have honestly been depressed. I feel like I shouldn’t be depressed and that I am a terrible and ungrateful human being because I got everything I ever wanted. Not only did I get everything I ever wanted, I got it way faster than anyone else. I have it made and I have no idea how to get up each day and deal with my life. Plus I feel like I can’t talk about it because I know that there is absolutely no reason for me to be unhappy.

I had a lot of conference talks lined up for 2015 and I was thinking about doing a lot more stuff because I feel like I worked my ass off sowing these seeds. I hoped that one or two would take root but twenty did. Last year I had nothing but my stubbornness and refusal to quit and now I have the situation of having too much. It feels wasteful to me to squander opportunities I would have killed for a year ago.

But I have to.

It has been a tremendously difficult decision, but I am not doing any conference talks for at least six months. I do not plan to attend any conferences during that time either.

I love this community. I have made so many friends in so many places. I spent a lot of my life feeling like a freak who never fit in anywhere. Being welcomed into this community and treated with respect has meant more to me than I can ever express. One reason it took me so long to make this decision is because this community means so much to me and I want to make sure other people like myself have a chance to join and be welcomed as well. The Klein family has changed my life and I can never express to them what their kindness has meant to me.

I feel like my life is moving too fast and I need to take a step back. I need to focus on getting my feet back under me. I need to focus on doing my job well. I need to focus on sharpening my tools. I need to find something that gives me back the joy and meaning I had in my life back when I was struggling to break through.

The Zen of Sound

Are you lost or incomplete?
Do you feel like a puzzle, you can’t find your missing piece?
Tell me how do you feel?
Well, I feel like they’re talking in a language I don’t speak
And they’re talking it to me

Last year I felt like I had to spread a wide net to catch one opportunity. I spread myself very thin doing a lot of different things to try and get myself enough exposure to find a job. I am pulling back on a lot of these things.

Looking back at my long-term goals, the half that were not fulfilled all had to do with audio programming. I love sound. I wanted to be a sound designer before I became a programmer. Last year I wanted to write a synthesizer app as a portfolio project, but I had too much noise in my life that I couldn’t focus the way I needed to for this project.

Now that I can pull back on a lot of the things that are taking up my time, I can focus my free time on projects that personally interest me without worrying if they will get me a job.

I spoke to Brad when I began to feel overwhelmed about what I should focus on for the next year or so. He advised me to think of something that doesn’t exist and to try and make it happen. He talked to me about taking an impossible task and breaking it down into small, discreet parts that can each be accomplished individually.

Audio affords me a lot of opportunities to explore things that interest me. I became interested in electronics after I began working with physical hardware at my job. I also became interested in math after I started working with GLSL. Additionally, Apple introduced not only Swift, but AVAudioEngine. There have been audio programmers on Twitter who do not think you can do audio programming in Swift because Swift is not built on C.

When I tried to tackle this last year, I had no idea what I was getting into. I also placed a lot of chips on me being able to pull this thing off that caused me a tremendous amount of anxiety.

I am not going to make that mistake again.

I know it isn’t necessary, but I want to build a physical synthesizer before I tackle a software one. I want to get a feel for how all of the pieces fit together.

I also want to spend more time making music with my tools. You can’t really create a piece of software for a group of people if you don’t understand how they are going to use it. I used to play around with this stuff all the time years ago, but it’s been too painful to work with until recently.

I am not going to disappear. I am going to catalog my journey here on my blog. I hope that I can figure out how to do some things that will be helpful to the community at large. I plan to take everything I am learning over this time and present it at NSScotland, which I am still going to speak at. I could not let down Alan Francis again.

I hope that anyone reading this can understand and respect my decision. I hope that I am not the only person who has felt this way and that reading about my depression can help someone else. I am in this career for the long haul. 2014 was a sprint. The journey is a marathon. I can’t keep going the way I am because I won’t make it to the end. I am going to miss all of the amazing people I have met over the last year, but I need to take care of myself and focus.

Thank you everyone for an unbelievable 2014. I am looking forward to coming out of my self-imposed isolation a happier and healthier person. God bless and keep all of you. Don’t have too much fun without me.

iOS 7: The Year that Was

iOS 7 was the first new iOS that I remember having to learn. I started around the time iOS 6 lifted its NDA, so all the books I was reading were out of date with Modern Objective-C.

Since iOS 6 was sort of my first one, I don’t really remember anything “new” from it. Everything was new and I was simply in a panic to try to learn the basics before everything up and changed on me again.

That was different with iOS 7. I had enough of a grasp on iOS programming to be able to grok the differences between it and iOS 7. The fact that there were a multitude of changes stylistically helped things tremendously.

With WWDC just around the corner, I have been talking to some people about iOS 7. Specifically, what worked and what didn’t. There were a lot of new APIs and technologies that were supposed to revolutionize how people created and designed their apps. Some of these technologies were the focus of several WWDC talks. How many of them were actually implemented and have changed the way we design our apps?

  • Borderless Buttons: Borderless buttons are among the most despised changes that I have heard people openly complain about. I can’t find anyone who likes the borderless buttons. Everyone I am encountering is trying as hard as humanly possible to ignore that part of the HIG. I haven’t looked recently, but I think that in Xcode 5 they removed the ability to give a button a border in IB. It seemed to me that this was something Apple really wanted people to be doing, but so far everyone I talk to is avoiding it like the plague. Will be interested to see if Apple backs down on this or if no one is actually going to give a crap about it.
  • UIKit Dynamics: So, Apple wanted developers to add motion effects to their apps? UIKit Dynamics was kind of cool, but it looked very much like a stripped down Sprite Kit. I think it might have been possible to find something new and unique to do with dynamics, but it just seemed like those obnoxious JavaScript effects you used to use on your Geocities site back in 1995. I would love to see someone figure out a neat and innovated way to use these, but generally speaking they don’t really contribute anything to the functionality of most people’s apps.
  • Translucency: This one confused me tremendously. I think that having the interface be layered with translucency could have been a really cool thing to do, but to the best of my knowledge, Apple did not provide built-in functionality for this. If you wanted a blur effect you had to roll your own. If Apple wanted this to be the preferred way of doing things, I wonder why they didn’t make it easier for developers to adopt.
  • Text Kit: Text Kit was the subject of at least three different WWDC 2013 sessions. It seemed like it was an API that Apple was promoting and pushing very strongly. I know that there were some easy implementations of Text Kit to make the text responsive to the user’s font size settings, but I haven’t really heard anyone talking about Text Kit.

    I know of one person doing a talk on it at CocoaConf, but my impression was that this experienced developer was having trouble using it.

    It’s possible that people have done the easy implementation of Text Kit into their apps, but again, not really seeing people getting excited over it and not seeing people evangelizing it, at least not to the extent that I thought they would.

  • Sprite Kit: Again, this surprised me. I know when this was announced that it was a very popular subject with students in my iOS classes. There was a lot of genuine excitement around Sprite Kit.

    I have seen a couple of books about it, but I am not really seeing a lot of people advocating it. I am wondering if it because people already know another engine like Cocos2D that would allow them to port to other systems or if it is because people are not enthused about making game for the iOS platform anymore or what is going on with this.

  • Auto Layout and Animated Transitions: Going along with some of the other style changes from iOS 7, this was another thing I don’t see people doing much with. I have been trying to learn Core Animation, but with the renewed emphasis on Auto Layout, it has been tremendously difficult trying to reconcile those two battling pieces of technology. Auto Layout wants to keep everything in one place while Core Animation wants to make things move. We are supposed to utilize both of these APIs, yet again Apple does not make it easy to reconcile them.

Where Do We Go From Here?

I am wondering what impact iOS 8 is going to have on developers. I am wondering if, since there was such a radical change to the UI, people have simply not had time to explore any of these new APIs.

I am very interested in graphics and a lot of these APIs excite me a lot. Talking to other developers, many are not as focused on these things as I am. They focus on things like Core Data and table views and networking APIs.

So far not utilizing these new APIs hasn’t prevented anyone from putting an app out on the store.

I hope that in the new few years people become more comfortable with things like Text Kit and we see some real innovations in how people create apps. I don’t know if that will happen.

At CocoaConf Chicago, Justin Williams made the knowing joke about every iOS developer waking up in the morning deciding to make a weather app. I have observed that people want to do something that is easy or at least not particularly innovative.

When was the last time you saw a truly innovative app out on the store? I think we are stuck in a self-perpetuating cycle where app developers make something easy that already has a dozen instances on the store, doesn’t make money off of their app, then decides app development is a burst bubble and refuses to put any more effort into it.

I think there are a lot of possibilities out there for people willing to dig into these “new” APIs. I hope that in the next few years more people are willing to give this a shot and do something innovative. I would like to do something innovative (if I ever get any free time!!).

Again, this was the first year I saw a new iOS from beginning to end. I don’t know if any of these are going to be considered failures or what is going to happen in the coming few days, but I was very excited about a lot of what I saw last year and I hope that it is given some more time for people to get used to and to explore, along with all the other neat things we will see next week. I have faith.

Bartle’s Player Types

A few years ago I was introduced to The Sims 3. My then-fiancee and I were living with another couple and the male half of the couple bought the game. He recreated their living situation with characters based on all of us.

I was familiar with The Sims (I wasn’t living under a rock!) but I had never seen or played it before. I thought it was fascinating. Later that year for my birthday our roommates bought me a copy of the game and the World Adventures expansion.

I wound up accumulating a half dozen expansions for the game. I started really getting into programming and I stopped playing it because when I was on my computer I knew I should be coding and not playing games. I eventually deleted it off my machine because I needed the space.

Sims in College

Living la vida Sims

A few months ago my husband got bored and started playing with it. The way that he played the game was completely different than the way I played it.

When I played the game I would create a bunch of different games and characters so that I could do different professions and hobbies. Any expansion that included a new hobby or another set of professions was one I had to obtain. I really like the Supernatural one and I wanted to get the University one before I put my life on hold for programming.

My husband only created one game and one character based on himself. He chose the profession that made the most money, ate the Sims equivalent of ramen noodles, and set about taking over the town. He saved up money so he could buy a business. Then he bought another and another. He kept asking me how many expansions I had and for every one he asked, “Can I buy that business?”

After he went through every expansion I had, bought every business he could, and bought the biggest house he could buy, he stopped playing. I doubt he will ever pick it up again.

I thought his playing behavior was insane. Why on Earth would you play The Sims to go out and buy every business in the town? The money isn’t real. It isn’t a microcosm of what it would be like to actually own a business in the real world. Why bother with doing that when there are so many options to explore?

Last night I learned about Bartle’s Player Types. These types are named somewhat after the different playing card suits:
Card Suits
A) Diamonds/Achievers: These people are Diamonds because their objective is to accumulate riches. This can be game currency, reaching the top of the leader board, etc… All other parts of the game, like socialization and expanding the world exist only to find new sources of treasure.

B) Explorers/Spades: These people are Spades because they like to dig around in the environment to see what is there. Explorers don’t care about wealth accumulation, socialization, or killing unless doing those opens up options for the player to explore.

C) Socializers/Hearts: These people are Hearts because the act of human interaction is the draw for them. The game is just the medium that these people use to find other people to interact with. They will help others further their goals if it allows them an opportunity to socialize with that player.

D) Killers/Clubs: These people are called Clubs because they enjoy clubbing people. These would be the stereotypical First Person Shooters players whose only enjoyment in the game is imposing themselves on others and killing other players. So these guys are the sociopaths of the gaming world.

Most people don’t fall solely into one of these categories. They usually are strongly one and have a secondary trait of another.

I found it interesting that this theory explains the different ways my husband and I would play The Sims. The Sims appeals primarily to Spades and Hearts, but there was a component in there to appeal to Diamonds as well.

The Sims is a very well-designed game that accommodates a lot of different player types. I think that many times if you are designing a game you are creating something that appeals to your player type only without thinking about adding components that would appeal to the other types.

This was a revelation to me about how many different types of people can all play the same game and how my husband’s way of playing the game, while not the way that I would have played, was not wrong.

Adobe Creative Cloud Thoughts

A few years ago, my mother was organizing various things that were left behind by the school tech person who retired. One of the items was an unopened copy of Photoshop 3.0. My father told her that she should install it on the computer because it was a legally valid copy of Photoshop that had been paid for and the license was forever.

I know this topic has already been talked to death somewhat, but I wanted to put my perspective out there.

I am a pack rat. I am a few degrees away from being one of those people that appear on “Hoarders” on A & E. I can only get through my day knowing that I have access to every single thing that I might need during the course of the day. I have a bag containing aspirin, Sudafed, and a 42 oz. Thermos full of tea that I lug around to class even if I am not thirsty. I went to a conference where one of the speakers talked about living out of a backpack for several years and I almost had to lay on the floor in the fetal position breathing out of a paper bag.

Currently I own over 50 different kinds of tea. I justify it to myself in my brain by saying that if I went to Starbucks every day I would spend more on beverages (which is true, but only because it is terribly overpriced). I like knowing that if I feel like drinking a certain kind of tea, I have it at my disposal. When I get up in the morning I can pick anything I want and it feels luxuriant and amazing.

The biggest thing I hoard is sources of information. I have crates of books in the basement that I own because I want them around in case I feel like reading them at some point. I have a friend who is a beneficiary of my book hoarding because I will buy books multiple times not realizing I already own a copy.

My hunger for information was strong enough that I pay $43 a month to subscribe to Safari Books Online. I was using their limited subscription plan for a while, but I found limiting myself to ten books a month to be limiting. I like being able to know that I can look at anything I want. If I want to read a book on 3D animation, I can do it. If I want to read about how to do Storyboarding in iOS, it is at my fingertips.

One would think that I would be an example of a person who would love the Adobe Creative Cloud subscription, but I am not. I hate it. I will never use it unless I work for someone who will be paying for it.

Here, in my mind, is the difference between these services:

– I can own any book that I am currently renting if I want to. I can buy a paper version or an e-book version of any book I am subscribing to on Safari. I am actively choosing not to because if I buy a book a month on programming that will cost more than my subscription and the vast majority of those books will be worthless in a year or two. I do not need lots of phone book sized door stops cluttering up my house when I can just pay a fee each month to read the most current things.

– I do not use these programs every single day. I used to use these program every day, but I am heading in another direction and now I don’t.

A few years ago I got a graphic design and video editing degree. On the first day of Photoshop class, the teacher asked us who didn’t think they needed to take the class because they already knew Photoshop. I raised my hand. I have been using Photoshop since 1996. By the end of the first day we had already exceeded what I knew about Photoshop. That program is massive. It can do some extraordinary things.

I did a project utilizing both Photoshop and After Effects for a class and this is what I created. So I am someone who has delved somewhat deeply into these programs. I love using them. They can do great things.

But I want to own them. I want to have them on my computer where I can ignore them for six months and then play with them any time I feel like it.

The major difference, in my mind, between my Safari Books Online subscription and the Adobe Creative Cloud subscription is that Safari allows me to own the books I want. If I want to own the K & R “C Programming Language” book, I can do that. I can either just read it through my subscription or I can buy it.

Some of the knowledge is transitory and won’t be relevant in a year, but I have the option to own it if I want.

The Adobe files are not transitory. If I don’t pay for a subscription each month my files become dead weight. It is indentured servitude. You are obligated to pay every month to have access to your own work. That is not cool.

I hope that either Adobe rethinks their decision or else another company comes in and fills the void.

I own Adobe CS6 Design Premium. I got it for $250 on a daily deal site for educators and students. If I had not been able to get this deal, I would still be using my copy of CS3.

I am glad to know that my current version of Dreamweaver supports HTML5. I have not opened it yet, but it will work if I ever decide to.

I won’t pay $50 a month to use programs I only think about sporadically. I am happy to pay $300 every few years to have programs that live on my computer that I know I could use if I felt like it but usually don’t get used.

This is totally different from Netflix or Safari. Those have content. You watch a movie once and usually don’t care to watch it again. If you want to, you rent it. We have a basement full of DVDs that have been watched a few times but are gathering dust because it just isn’t necessary to own them.

It is necessary to own software that you dedicate time, energy, and file space to. You don’t use Photoshop once and then never look at it again. I truly hope that Adobe rethinks their decision or that open source solutions emerge to allow hobbyist artists and photographers to express themselves artistically.