Questions for Your Job Hunt

Jobbies

While looking for a new job last year I slowly built a list of questions I would ask the various companies to help better understand if they were a good fit for me. Some of these questions are ripped from other blog posts, like The Joel Test, but many of them were from personal brainstorming and soul searching about what I wanted.

Hopefully this list helps those out there looking for something new.

Culture

  • Pretend I know nothing about the company, how do you describe it?
  • Who owns the company? What are their interests?
  • How would you describe the company culture?
  • What are its core values?
  • How is this evident in everyday action?
  • There is a great TED talk by Simon Sinek that has a simple but powerful model for inspirational leadership all starting with a golden circle and the question “Why?” He describes a circle with the word Why? in the center and then moving outward, How? and then What? — Simon explains that most people can answer the What, what do they do? — some fewer still can answer the How — but the truly successful can answer the Why? Why do they do it? Why does your company do what it does? Why does this company sell paper towels instead?
  • What can I see / download as a public example of your work?
  • Name something the company is struggling with and how you are trying to fix it?
  • Name something the company excels at? What are the lessons to be learned?
  • What’s going to change at this company over the next year? three years? five years?

Process

  • How does upper management communicate with the company at large?
  • How are projects and/or teams organized?
  • How do teams communicate?
  • How do you plan and track work?
  • How do you estimate?
  • Do people work on multiple projects at the same time? If so, how is time broken up?
  • What is the process like from napkin idea to deployed feature / service? Where am I in this process?
  • Who decides what to work on?
  • Who is the designer? Do they work closely with the development team? How much to they appreciate, expand on norms of the various platforms?
  • Is there a standard process for the handing off assets, specs, motion simulations from the design team to the development team?
  • Do you ever do retrospectives? If so when? end of the sprint? end of the project?
  • Do you ever have internal projects? How do they work?
  • How would you split up my weekly hours between different responsibilities?
  • How is customer support handled?
  • Do I have any interaction with the customers?

Process (Client-based work)

  • If I’m working on a client project, what is my interaction with them?
  • How does pricing work for client projects? How is development involved in coming up with these figures? What would my responsibility be in this?

HR

  • How do you run employee reviews?
  • How do you gauge employee happiness?
  • Are there any company events? travel?
  • Would I be required to interview people?
  • Do you have an official interview process?
  • Do new candidates write code during their interview?
  • How does overtime work? Are people compensated for overtime?
  • How does vacation work?
  • Are there sick days? Long term sick days?
  • Can people work from home? Do they?
  • Is there a 401K?
  • Is there a health plan? Dental?
  • Is there on-site parking? Do I have to pay for it?
  • Is travel involved for this job?
  • Do you have a company manual? Can I have a copy?
  • Do you have an org chart? Can I have a copy?
  • How is the development group organized?
  • Who do I report to? Who reports to me (if any)?
  • How transparent is the company with regard to it’s goals, it’s plans, it’s money?

Education

  • How do you make sure the staff is continually learning?
  • Do people get a dedicated budget for things like attending conferences, purchasing books?
  • Do you allow people to travel to speak at conference during company time?
  • How do you track staff technical skills? Current abilities, wanted improvements?
  • Do you have an official mentoring system?

Tools

  • Do you use the best tools money can buy?
  • Do you have testers?
  • Do you do hallway usability testing?

Code

  • Do you use source control?
  • Can you make a build in one step?
  • Do you make daily builds?
  • Do you have a bug database?
  • Do you fix bugs before writing new code?
  • Do you have an up-to-date schedule?
  • Do you have a spec?
  • Do programmers have quiet working conditions?
  • Do you do code review?
  • Do you do pair programming?
  • Can I have a tour of an active project’s code base?
  • How many developers are there?
  • What is the proficiency ratio between senior level / mid level / junior level developers in the company?
  • Do you let people jump around from stack to stack or do most people stay focused on their specialty?

End of list. Best of luck with your job hunt!

On disappointment with clients who are prioritizing production over quality

A friend of mine emailed me, amongst a few others, asking for advice. He’s been working as a consultant for a little while now but has been unhappy about his recent clients. He says they haven’t been focused on the quality of things as much the general production speed and it disappoints him. My reply:

Without knowing the details of your current experiences I would encourage you to look within to improve the situation. I say this not to let the client off the hook but if you wait for other people to change to make YOUR life easier you are going to be waiting a long fucking time.

One of the huge problems is that most of the clients you will interact with have no experience producing software. It is your job to explain to them what a professional software development process looks like and if all the parties are in agreement, and contracts are signed, it is your job to execute that process.

When you were in the early talks with this client how did you teach them what your professional process was like? How did they react when you explained your core values?

If they agreed to your process and then changed the rules midway, shame on them, Walk away as soon as professionally possible, preferably under the comfort of a contract clause they are breaking.

If you never talked about this and just assumed they knew what was in your head about what the process was going to be like then shame on you.

Look inward. Figure out your core values, your development process. Make this part of the marketing of the consultant you. Make it clear to those interested in hiring you, this is how you work. This is how they will get the best value from your time, their money and in the long run, the code base they will own.

And to be clear, finding good clients is hard work. I think making your own expectations clear to them is half the battle, the other half is getting out there to market yourself to more and more people so that A) in the early days you have enough options to weed out the bad clients and then B) you get to a point that through word of mouth you get more and more clients looking for you because your process worked so well for their friends. If you aren’t turning away 4 projects for every 1 you work on, you probably aren’t marketing enough.

Have a question for me? Send me an email.

Enums and Switches

If you are one to use enum to define modes or types in your models or controllers, consider using switch statements to help branch the different behaviors. If you do so, the complier will help you when you have forgotten to implement behavior for a enum value.

Take for example a view controller that might have different behavior if we are in an editing mode, and even more so the editing is handled differently depending on the target device. For this, let’s create an enum like:

typedef enum ViewControllerMode : NSUInteger {
    ViewControllerModeDefault = 0,
    ViewControllerModeEditingiPhone,
    ViewControllerModeEditingiPad,
} ViewControllerMode;

Now if the tableView:didSelectRowAtIndexPath: method let’s use a switch statement to branch behavior depending on the behaviorMode.

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    switch (self.behaviorMode) {
        case ViewControllerModeDefault:
            [self showRecordAtIndexPath:indexPath];
            break;
        case ViewControllerModeEditingiPhone:
            [self editRecordAtIndexPath:indexPath];
            break;
        case ViewControllerModeEditingiPad:
            [self replaceRecordAtIndexPath:indexPath];
            break;
    }
}

Notice we are not using a switch default behavior here. Now let’s add a new enum type called ViewControllerModeEditingiWatch and compile. Tada! The complier has a warning for us.

Enumeration value 'ViewControllerModeEditingiWatch' not handled in switch

This pattern can be extremely helpful to make sure you are accounting for all needed behaviors. Please consider it next time you are working with enum. Thanks!

Setup Bots Status as a Screensaver

It’s time to turn off that family photo screensaver and switch to something that’s important, CI status screens!

Bots Big Screen

First up you’ll need this screensaver (or something similar), which can be configured to load a single or multiple websites up as a screensaver.

https://github.com/liquidx/webviewscreensaver

Sadly the screensaver bundle is not developer signed so if you are bit paranoid consider downloading, inspecting and building the thing from source. Or you could be like me and hit run inside of Security after the initial “can’t run, not signed” dialogue.

Next you’ll need some URLs. I run both Xcode Bots and Jenkins off my Mac mini named GLaDOS and for those you’ll want URLs like:

http://glados.local/xcode/bigscreen

http://glados.local:8080/view/Monitor/

For Jenkins I’m currently using the Build Monitor Plugin which is pretty basic but a nice start.

Here’s to hoping all your returns from coffee breaks are bathed in green and passing tests.

Xcode Bots and Branches

Just a little quick tip tonight. If you create a Bot from within Xcode 5 it will assume that the branch you want this Bot to run on is the branch you are currently on. To change this, use the Xcode Bot Web interface. Select your Bot and look for the settings gear in the upper right and then edit the Bot, defining which branch you want to bot to run on.

Xcode Bot Setting Gear

Xcode Bot Setting Details

I’m starting to revive an old side project of mine and it’s feeling good so far. I have Xcode Bots running tests and the static analyzer (all green baby!). I also have Jenkins deploying to HockeyApp when I merge development into my qa branch. Hope to share more details soon.

IBOutletCollection

Did a short show and tell at the last CocoaHeads meeting demoing something I learned at work and hadn’t known about before, that being IBOutletCollections.

For seasoned Cocoa developers we all know that an IBAction is typically how a button sends a message to the controller that something should happen. On the flip side there is IBOutlet which is a pointer to a view in the UI that let’s the controller have access, typically to update the view’s contents or attributes.

Well an IBOutletCollection lets you have access to a whole collection of views via a single connection. In code declaring an IBOutletCollection is going to look something like this:

@property (strong, nonatomic) IBOutletCollection(UITextField) NSSet *textFields;

When you declare the type of the outlet you can be specific such as UITextField or use higher level classes like UIView and connect to many different kinds of views. Technically you can use NSArray but since the order isn’t something I think is guaranteed best to stick to NSSet. Finally, while most outlets should be using weak references, these use strong since the view controller needs to own the array that contains the connections.

When you want to iterate over the collection just use fast enumeration like you normally would with an NSSet.

- (void)updateUI
{
    for (UITextField *textField in self.textFields) {
        textField.text = self.mainTextField.text;
        if (self.isBlue) {
            textField.textColor = self.view.window.tintColor;
        } else {
            textField.textColor = [UIColor redColor];
        }
    }
}

For a simple project demo see my OutletDemo project on GitHub.

Some real world use cases for IBOutletCollection might include theming (outlet collections for various styles, then making connections to view that should be styled) as well as form access and validation. IBOutletCollection was introduced in iOS 4 so theres no reason not to check it out. Enjoy.

Updating Homebrew’s “httpListenAddress” Default for Jenkins

I’ve setup some Jenkins servers in the past for Ruby on Rails apps but these days we are trying to get things running for iOS deployment and testing at work.

To experiment with some plugins and such I have my own Mac mini and installed Jenkins via Homebrew. Overall it’s working great though I was a bit stumped as to why I couldn’t load the Jenkins webpages outside of using localhost:8080 on the Mac mini itself. Worked fine last I did a clean install.

Turns out the Launch Agent settings Homebrew gives you (located at ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist for me) will launch with the following command line parameter --httpListenAddress=127.0.0.1. Edit this to 0.0.0.0 (the default) to allow all addresses.

I know this isn’t the most enjoyable blog post but wanted to post it as Google Food for others who might run into the issue.

Other related posts:

Video: Introduction to Objective-C Categories

I’m hoping to do some formal screencasting, educational videos for iOS and Rails, in the future so for practice I hacked together this little Introduction to Objective-C Categories to try some stuff out. It’s not the worst thing ever so I thought I’d share it and my notes.

Objective-C Categories from Mike Zornek on Vimeo.

A short introduction to Objective-C categories for iOS and Mac developers.

As far as what I was trying to learn through the process of making this…

What is a good resolution to shoot at?

Ended up trying 1920x1080 which in TV speak is 1080p. This I think worked well. There is enough screen real estate to show Xcode with all “widgets” open, plus enough room for a side app like the iPhone Simulator. Speaking of which, 1080p barely squeezes both portrait iPhone retina and portrait iPad non-retina. Finally, should this ever be pipped out to a TV it should be full screen with no scaling.

What I don’t like is how tiny the file browser and non-source text can be. I envision zooming in on occasion to have those read well when needed.

How is Vimeo these days?

I’ve put up a few videos in the past on Vimeo but for this new project I’m considering using their Pro service so I saw this as an opportunity to play around with their stuff.

Overall things seem good. They are really good about suggesting codec and bit-rate changes to get the most from their platform. They also provide a nice HTML 5 version of their player.

Why not YouTube? Long term I could see some of this content becoming pay-for or subscriber/membership-based and YouTube isn’t really good for that.

To record audio before video or with video?

For the majority of my previous screencast work my typical process included recording the audio on its own and then recording the video, matching everything up in editing. The result is a nice, tight video without any real hesitations or pauses.

For this video I did things more casual. I had a list of things I wanted to demonstrate and recorded my voice right with along the video. There are pros and cons to this.

Pros:

  • I do enjoy the personality that comes from this style. To hear the typing and a few ums makes a human connection.
  • If done well, it can shorten overall capture time.
  • It lends itself to camera shots of the speaker, which again can help create a human connection.

Cons:

  • Doing the video live with the audio is much, much harder to perform. It’s easy to miss things you intended to showoff (I did so in this video.)
  • I myself have bad allergies and tend to breath into the mic. If recording the audio on its own it’s easier to isolate this.
  • Some people will not like hearing the typing.
  • If the screencast is based off a fixed script I’ll be able to post a text version easier, which is extremely valuable (for Google-food as well as people who pref text over videos).

In the end I think I’ll be going back to audio only first, then screen recording but welcome your feedback.

Other random observations:

  • Probably want to hide the dock for more “Xcode space”.
  • Those early “title slides” were done in Keynote. Works great for this kind of stuff, especially animations to explain abstract concepts.
  • In the future I won’t be typing everything. Longer code will be uncommented in place or dragged in from snippets.
  • Could have done some some zooming to help visualize things like the new file Xcode sheet, schema editor.
  • Need to overlay URLs in large type when promoting a website.

Not sure how fast we’ll see real production start on these videos as I do have a few things already cooking but I don’t mind too much as it’s good to be busy. :)

Retweet Etiquette

I know I’ve done it. After months of working on a new project, I release it to the world and am extremely proud. I tweet about it and maybe even occasionally retweet some nice things people are saying.

Dave Winer recently release Fargo and while I haven’t had a chance to play with it yet I do follow Dave on Twitter and he’s been busy promoting his new baby.

I have nothing against this, but along with his own tweets he’s been retweeting other people talking about Fargo, and in my option excessively. The majority of these retweets could be summarized in “Dave made a new outline tool. It’s cool.”

I’ll call these ego tweets, and the problem with ego tweets is that they provide no value. I as a reader of your tweet stream gain no relevant information or resources from them. Their sole purpose is to promote the fact a certain person likes something you are invested in.

As a comparision, one of the retweets Dave sent was good. From Lawrence Lessig:

This is a good retweet. It still has a bit of an ego smell in that here is a well known person talking about my product but the value is present as it gives me something to do. Fargo sadly does require a Dropbox account to do anything so if you don’t have one or are antsy about linking up with a new app blind this is a great resource.

Normally maybe I’d keep this bit of “retweet etiquette” opinion to myself but I was kind of disappointed in how my feedback was taken.

Dave Winder feedback conversation

The lesson to be learned here is this:

If someone gives you feedback or criticism, just say thank you. If you want clarification or more information on their comment or disagreement feel free to have an adult conversation. Do not ever tell someone who has taken an interest in you or your products and is providing feedback to go away.