Clash of the Coders: Day 0

One of the many interesting benefits I get working for Big Nerd Ranch is the opportunity to participate in many fun and unique events. One of the bigger ones is called Clash of the Coders.

Clash of the Coders is an annual coding competition, whereby Big Nerd Ranch effectively “shuts down” for a a few days to allow developers to flex their coding muscles in to build something (anything) that is both wizardly and useful.

This years edition of “Clash” starts at 6pm tonight, Wednesday March 30th. While people are encouraged to brainstorm ideas and form teams ahead of time, no code shall be written until the event starts.

During the event we are treated to full time catering, shoulder and neck massages as well as other free-form geek activities. (I hear Christian will have his new Oculus Rift around for testing.)

While remote nerds can choose to stay remote and participate, anyone who wants to come into the office can. Last year I was at home and didn’t really get into it. This year I’m working out of the office so I’m anxious to see how it all works out.

As for my project and team, I’m still working on it. I have an idea and if need be will work on it solo but am also hosting a meeting after lunch for ‘Clash Singles’ to see if we can form some last minute teams.

At the end of Clash (Saturday, 6pm) we have a nice BBQ dinner (spouses and kids welcome) and we run a science fair of sorts, where people demo their work and answer questions. People are judged on project complexity, presentation and other factors. Bonus points are awarded if your team was interdisciplinary (mixing people of different departments) and if you were able to integrate any of the emerging technologies on our watch list. Top prize allows you to choose from list of high end geeky toys (think drones and musical instruments) with second/third prizes getting some nice Amazon gift cards.

I’ll post more as Clash gets going. If you have any questions let me know.

Managing Remote Teams

Local company Wildbit has been nice enough to host a running series of meetup events focused on running a software business and all that it can entail. Last night we discussed Managing Remote Teams and as a remote employee myself I was interested to hear what others people had to share. Below are some of my notes.

Context

In attendance we had about 12 or so people. Many from Wildbit (many of their remote people were in town), but we also had a pair from another small (6+) local software company, one from a local company researching coworking and myself, whom works remotely for the Big Nerd Ranch, down in Atlanta.

General Observations

  • Running an all in-person office has unique organization challenges and benefits.
  • Running an all remote office has unique organization challenges and benefits.
  • Running a hybrid in-person and remote office has unique organization challenges and benefits.
  • Even still, things vary based on the size and work of your company.
  • No rules are true for everyone so be flexible.
  • Be prepared to spend time and energy on this.

Why Consider Remote Employees

  • Expands your potential hiring pool greatly.
  • Very helpful if you are using niche technologies where it can be hard to find experts (Closure, Rust, etc.).
  • Potential benefits in having time shifted work (but this can also introduce communication problems, lag).

How to Get Started

  • If you currently have a 100% in-person company, adding remote people will be a significant culture shift. Be prepared.
  • No one wants to be the first remote hire on a team.
  • Consider adding multiple remotes at once.
  • Consider offering work from home to current in-person staff to help the new culture work itself out.

Challenges

  • It can be hard for a remote employee to demonstrate what they are working on.
  • Being remote requires more thorough and regular communication than most people expect.
  • Lots of people romanticize remote work from DHH’s writings and don’t respect the real life challenges of it all.
  • Sometimes with a hybrid company, teams will be setup where you have two people “in office” and one person remote on a project. It can be real easy for the two people in office to share more face-to-face leaving the remote person feel left out.
  • If you have employees in different states / countries, you have to make sure you are following the approbate employment laws of those states / countries.
  • The whole “programming in your underwear” trope is really misguided. Most successful remote people have a schedule, take showers, get properly dressed and have a dedicated work spaces.

Face to Face Retreats

  • Everyone seemed to agree that it’s a bad idea for the remotes to never come together. Everyone benefits from real face to face time so plan for it early.
  • Wildbit has yearly company retreats, where they work, plan for the year ahead and otherwise define the goals and values that should guide all their decisions.
  • Other companies do more vacation oriented retreats to help connect people socially.
  • It was also suggested that depending on the size of the company it could benefit from have some company wide events and then some smaller more team focused events.

Things You Can Do to Help Remote Employees

  • Setup a Slack or HipChat for communication.
    • Additionally try to have people communicate what they are doing. “Starting feature X”, Reviewing PR Y”, “Stepping out to get some coffee”, “Breaking for an hour to watch a conference talk” — sharing these can help people better understand what’s going on.
  • Consider giving them an annual office stipend to improve their workspace; equivalent to the money you’d spend giving them an office in your building.
  • Make sure all in-office systems are available to remote folks. Things like file servers, whitelisted IP API access, etc.
  • Prefer video chat over audio chat. Seeing human faces helps communication and empathy.
  • When running a video chat, consider having even the in-office people stay at their desk and connect to give every “virtual head” its own space. (I’ve also had everyone use their laptop for the video and a shared phone for the voice.
  • If you are presenting and the video is going out to remote people, don’t forget to ask them for questions and check the chat room.
  • If you are a manager and are set up to have 1:1 monthly meetings with in-office people, consider offering bi-weekly for remotes — since they might be more out of sync.

Equipment

  • Some people were enjoying the HighFive video conferencing hardware — though they needed more seats than the current solution offers for their company wide stuff.
  • BNR’s recently been using the YouTube Live service to stream and capture video with fair success for our larger meetings / internal educational talks.
  • One AV tool BNR uses is a toss-able chat box that contains a microphone so after large meetings, during Q and A, the remote folks can hear the questions being asked.
  • The Double was brought up reguarding its use as a virtual presence. It’s cool stuff but of questionable return value.

Hope you enjoyed my notes. If you have anything to share about your own remote work let me know.

Xcode Shortcut: Quick Open in Assistant

This answer / revelation caused a bit of a stir in the Philly CocoaHeads Slack so I figured I’d share it here as well.

Lots of people know and live by Xcode’s Quick Open Menu. You hit Command-Shift-O and start typing the name of a file, a class or a method and have some very good options made available to you. Make a selection, hit return and bam, the file is now live in your editor.

But what about the assistant editor? Historically some of the best uses for the assistance editor was to view a file’s counterpart file, the header for an implementation file and visa-versa. With Swift’s lack of a header files, some people have come to put use the assistance editor of test files.

Regardless as to what you want in the assistant editor it’s always been a little clunky to pick the file. Well now you can use the Quick Open menu for this too, and it’s oh so simple.

Hit Command-Shift-O and make your selection as normal. Instead of hitting Return, hit Option-Return — the file will now open in the assistant editor pane, opening it if need be.

Quick Open in Assistant in Action GIF

That’s all there is to it. It’s a small feature but very handy for those trying to stick to their keyboard and avoid the mouse while moving around in Xcode.

For a handy Xcode 7 Shortcut Reference Card check out the Big Nerd Ranch iOS Course Resource repo for a PDF download. You can also get the card in print by ordering our latest edition of iOS Programming, 5th Edition — updated for Xcode 7 and Swift 2.

PS: Props to @lyricsboy for catching my typos!

Video: Consuming JSON in Swift

I gave a talk at Philly CocoaHeads last week reviewing various ways to consume JSON using Swift, including a preview a new open source project we have coming out soon™ from Big Nerd Ranch called Freddy.

Consuming JSON in Swift, Mike Zornek from Philly CocoaHeads on Vimeo.

JSON is a fundamental internet format and if you are building iOS apps the chance you need to download and consume JSON files is extremely high. Additionally, with the introduction of the statically typed Swift language it’s been a little more difficult to work with JSON properly. This talk will cover what JSON is, how one can work with it naturally in Swift, the limitations of doing so, a review of a few popular third party solutions and the introduction of a new JSON tool about to be open sourced by Big Nerd Ranch.

Slides: https://speakerdeck.com/zorn/consuming-json-in-swift

My Personal Computer History, How I Came to Work on the Mac

I’m working on some other posts to recount the history of our CocoaHeads chapter. While brainstorming for it I couldn’t help but start to capture my own history and how I came to work on the Mac so I figured I’d write it up and share.

The following post has a lot of “Way Back Machine” links to see sites as they used to be, a fun trip down memory lane.

I didn’t start learning computer stuff until high school (1995) and even then it was on a 286 using DOS for BASIC and PASCAL. Starting college (1997) I finally got to buy a computer of my own, it was a Windows machine but I didn’t really mind at the time. After my first year of college I got to take my co-op experience. Through it I ended up doing web design for a small company just outside Philly. I got to work with a former Apple employee and he was quick to saturate me in the ways of the Mac. Overall I was impressed and by the end of the co-op was considering a Mac of my own. Now being in college and just having bought a Windows computer I wasn’t in a financial position to change, but the seeds were planted.

By 2000 I was doing web design part time for Seybold, using a Mac at work and Windows at home. I was getting into the server side of web development, learning about UNIX, Apache, MySQL and the like. Around this time Mac OS X was announced. The idea of running Photoshop next to Apache pretty much sold me and I knew right then I wanted to participate on this platform.

I probably watched Steve introduce the Aqua UI over a dozen times.

With the 2001 Macworld Keynote came the release of the Titanium PowerBook G4. I got the high end 500 MHz model. I split the cost across two credit cards and some cash. I couldn’t afford this machine but I had to have it. It was the first personal Mac I ever owned.

Initially I ran Mac OS 9 on my TiBook, but on Saturday March 24, 2001 I drove out into the rain to my local UPS warehouse to pick up the copy of Mac OS X I had ordered (No way I was going to wait until Monday for delivery!). I came home, installed it and never went back.

Well, technically I did go back to OS 9 on occasion. Some apps like Final Cut Pro (which I was using for my film class) didn’t work in the Classic environment at all and other apps, well, just worked better booted into 9. That said, I really enjoyed working in OS X. Despite all of its performance issues and bugs I was too busy enjoying all the new stuff: the new UI and the new APIs (my first time programming for a native window UI).

Time moves on, it’s 2003 or so. By now I’m a total Apple geek. Regularly reading As the Apple Turns and Daring Fireball. I’m marking my calendar and listening to Your Mac Life’s live radio shows. I’m reading tons of books about the history of Apple.

I’m now also now looking to connect with other Mac users. I eventually come to join MacBUS a local Mac User Group focused on the business side of the Mac. I also visit other groups in the area from time to time such as the Main Line Mac User Group’s Programming Special Interest Group. A fun group but there was little coverage of Cocoa, it was mostly scripting languages like AppleScript and PHP.

It was however through these groups and connections I met Randy Zauhar, a professor at the University of the Science. He and some of his students were working in Cocoa and wanted to start a regular meetup. We called it PHAD, Philadelphia Apple Developers.

And that’s it for now. I’ll recount more of PHAD and how it eventually lead into Philly CocoaHeads in my next post.

How To Play WWDC Sessions at 2x Speed

Now that all the new bits of iOS 9 and OS X 10.11 are in the wild you might find yourself wanting to get up to speed on some of the changes. One great resource to help you get started is Apple’s WWDC videos.

The WWDC video library has a lot going for it: HD and SD video sizes, slide downloads and now even full text search! The only real negative thing is the sheer amount of content out there. It can get overwhelming and time consuming to watch all the stuff you are interested in. Here’s the hint. Like podcasts, WWDC videos are mostly single voices speaking one at a time and if you have the tools to double the playback speed you’ll find them still very comprehensible.

Now for the tools. For downloading you can of course use the Apple website. I like this WWDC Mac app as well. Once you have the video file on your hard drive you’ll unfortunately need to look for something beside the built-in QuickTime player to help. Even with all its enhancements it sadly doesn’t have this tool of QuickTime’s past. The good news is you can still download QuickTime 7 and it works great!

After you open your movie in QuickTime 7 (you’ll find it installed in the Utilities folder), use the Window menu and choose Show A/V Controls. In this panel you’ll see a slider that let’s you adjust the playback speed.

QuickTime 7

Now you can watch your chosen WWDC videos in half of the time! Enjoy!

UPDATE: My thanks to Paul Brown who let me know that the native QuickTime player can playback faster, even if it is a little hidden. To increase playback speed, bring up the controls with your mouse, then option-click on the fast-forward control. This will increment playback speed by 10% each time you click. You can keep clicking this up to 2.0x playback speed but sadly the audio does not work at 2.0x, you’ll have to limit yourself to 1.9x to retain the faster audio. Thanks again for the help Paul!

Quick Launching for Cocoa Unit Tests

I was doing some proofreading and research today regarding the latest testing features in Xcode 7. In the process I ended up rereading this article from Mark Dalrymple on code coverage. It’s a great article but it also reminded me of a little tip I wanted to share on the blog.

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...
    // bail out early if we're running as a test harness.
    if (NSClassFromString(@"XCTestCase")) return YES;

    // otherwise load the main storyboard.
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateInitialViewController];
    ...
}

Not only can this type of check help speed up your unit test times by a little bit, but, it also makes sure you aren’t loading things like crash log capture tools, performance monitoring injections, or other things that might otherwise interfere with your unit test logic or code coverage numbers. Now if you are doing the new UI testing you’ll probably have to use some other kind of flag to define this path, but regardless the core idea is the same.

CocoaLove 2015 Notes

This weekend was the second annual CocoaLove event here in Philadelphia.

A conference about people, not tech. CocoaLove highlights the iOS/Mac community’s passions, challenges, and triumphs.

From all accounts, people had a great time. My very heartfelt “thank you” to the speakers, attendees and organizers for making it such a blast.

Some of my own takeaways and notes:

  • Just Do It! and more specifically, don’t let your high taste of quality hold you hostage from creating and shipping. Get it out in the world and improve it over time.
  • Don’t let the negativity of the web infect you. Be positive; be constructive.
  • Make time to help people out. Mentor them, teach them, guide them. It’s probably the most import work you’ll ever do.
  • Embrace today; do what you love; don’t settle.
  • Don’t let other people define your life’s scope. Poke life.
  • The world is in desperate need of good managers. Managers need not be robots; the best managers can have a huge impact on their team and the product.
  • Don’t let imposter syndrome or other people hold you back.
  • Humanizing the customer support experience is extremely important. These people are calling out for help, treat them right.
  • The developer ecosystem is forever changing. Even today the wheels are in motion and a few years from now it’ll be different. Be prepared for change.
  • Embrace side projects. Start tons of things. Experiment. Do things outside your comfort zone.

While we wait for this years talks to be edited and published, consider stopping by the 2014 video collection. In particular I recommend Joe Cieplinski – The Back of the Fence.

Code Patterns Talk, Video Now Available

We’ve been trying to a better job of capturing our main talks at Philly CocoaHeads. You can find and subscribe to our small but growing collection of videos on Vimeo: https://vimeo.com/phillycocoa.

I did a talk last month reviewing a some iOS code patterns. The runtime is about 27 minutes. Feedback very welcome.

Some Code Patterns, Mike Zornek from Philly CocoaHeads on Vimeo.

This talk covers a handful of code patterns that were successful on my recent projects. Some of these patterns include Block Safety, "Tell, Don't Ask", Using DataSources for your network-based *Service objects.

Apologies the audience participation isn't well captured.

Know Your Role: Contractor or Consultant

I guess I could have use a more sophisticated reference in the title like Know Thyself but I can’t help quoting the most electrifying man in sports entertainment, The Rock.

The Rock

Know Your Role!

When trying to breakdown the relationship with your clients and to help define expectations you need to define your role. One high level way to do this is to decide if you are a contractor or a consultant.

A contractor is someone who comes on to a job site to execute. They are given all the specifications they need. They act in a professional manner. They produce.

A consultant may produce as well but their primary responsibility is help design the solution. They work with the client to understand, identify and document the problems and the pains. Then through their lens of their experience in the industry propose a solution. Usually they stick around to help build that solution.

If the client looks to you for help to build the product right, you are probably a contractor. If the client looks to you for help to build the right product, you are probably a consultant.


Personally, I consider myself a consultant. I love designing the solutions and while I can code, and continually strive to improve my craft, coding by itself is not truly fulfilling.

It’s been challenging over the last few years since leaving independent life and working for larger companies. These days I don’t have a lot of involvement in the sales process so by the time I’m working a project expectations are already set and a fair amount of time it feels like we are hired as contractors, which I have nothing against, but if I’m going to be a code mercenary you need to be really good about those specifications and more times than not, they fall short. They explain only the happy paths or they misuse platform norms at the cost of more engineering and two steps back in user experience.

I suspect this phenomena is not an isolated problem but discussion about that will have to wait for a future post.