2015 Year In Review

It is good to sit back and reflect sometimes and with today being New Year’s Eve, I thought it would be good to look back on what I have been doing this past year in 2015.

My wife Monica and I had our seventh son, Mario! He is super cute and huggable. He and the other boys keep me grounded and humble. Bonus: the company I work for is pretty family-friendly, I got to take a few weeks of Paternity Leave.

At work, I transitioned from leading a single Android team to leading several iOS teams. We shipped brand new, redesigned and modernized versions of our Capital One Mobile for iPhone and Capital One for iPad apps plus several monthly updates afterwards. I’ve now become what Lara Hogan from Etsy calls a “meta-manager” and I hope to find some time to write about that more in 2016.

I also helped to find ways for Capital One to invest back into the developer community. I think the Mac and iOS developer community was already strong but I want to make it even better. So we sponsored:

  • CocoaPods
  • Women Who Code
  • James Dempsey and the Breakpoints Live at WWDC
  • WWDCGirls
  • Swift Summit San Francisco 2015

I also organized the seventh annual iOSDevCampDC, along with Natasha (the Robot) Murashev, Jimmy Sambuo and Toria Dacus. We had some awesome speakers, but probably the most unique thing about this year’s is that the majority of speakers were female. I’ll have to revisit this in a future blog post as it deserves more time and attention. Plus I promised Cate Huston that I’d write about it sometime.

I also had a lot of fun with my hobbies, mainly playing video games with my kids (aka father-son bonding time) and watching eSports. I participated in the Alpha and Beta of Heroes of the Storm (currently our favorite multiplayer game in the house) and attended the action-packed and eSports celebrity-filled StarCraft II archon mode championship held at Red Bull Battlegrounds DC with my oldest son Diego, Jimmy and another coworker Cary.

I also spoke at a few events, including iOSDevCampDC, ModevCon, Android+Glass Meetup, Modev Coders Only and some internal events. I presented on a variety of topics including Swift, Frameworks and Kotlin. I’m working to encourage others to present as well. I’m organizing Modev Coders Only now and and it’ll meet monthly in 2016.

Before I go, I thought I should mark some stats for the end of 2015:

  • StackOverflow rep: 8,055
  • Twitter followers: 1,588

Well that’s it. I had much more to say in my unabridged blog post, but I think I’ll spread out that content over several posts. Hope that everyone else had a good year and hopefully 2016 is even better! Happy New Year everyone!

Swift – 53 Days Later

The bomb dropped at WWDC. 5,000 of my fellow iOS and Mac Developers were sitting there at Moscone West when Craig Federighi said:

But we had to ask ourselves the question what would it be like if we had Objective-C without the baggage of C?

At that point, there erupted a mixture of nervous laughter, gasps and excitement. My Objective-C heart sank but my curious brain lit up at the opportunity to learn a shiny new language: Swift.

I’ve been fortunate enough to be able to use it almost daily in my work at Capital One. So what have I learned in these past 53 days?

First, Objective-C is not going away yet. We still have a majority of our codebase in Objective-C. All the popular third party libraries that are utilized via CocoaPods are in Objective-C. Fortunately, Apple has built really good interoperability between Swift and Objective-C and vice-versa. My coworker Jonathan Blocksom and I gave a talk about this at MoDev Coders Only, titled “Swift and Objective-C: Best Friends Forever?”

Second, Swift is a real pleasure to code in. It is a lot more succinct due to the lack of header files, square brackets replaced with dot syntax and parentheses, no semi-colons, etc. You do trade in some dynamicness but you gain safety by the compiler doing work for you, like checking that you have assigned variables before use.
There is definitely a transition / learning curve, but it is relatively shallow compared to the one I faced when learning Objective-C back in 2005. Especially since we had to do retain/release and I had come from a series of languages that had garbage collection like Smalltalk and Java.

Third, Xcode betas can be painful. I separate this out from Swift as a language even though they are intertwined. It seems like the Xcode betas are on a two week sprint cycle, so we are on beta 4 as of this writing. This is only a temporary problem though, but I think it has dissuaded a number of developers from jumping in headfirst. Yes, sometimes I do cry when SourceKitService terminates and I lose all syntax highlighting, but that is balanced out by being able to code in a modern language like Swift.

Fourth, Swift has injected a lot of energy into the Apple development community. It hasn’t been buzzing like this since when the iPad first came out. We’re devoting half of iOSDevCampDC to it. I’ve seen a lot of new developers start to come out with the promise of a new, modern language that is more familiar looking. And the allure of a level playing field, since everyone, from Objective-C greybeards to college graduates, have the same challenge and opportunity to learn Swift from scratch.

I’m personally still excited about Swift. I think we’ve barely scratched the surface. We’re entering a new, more modern age of iOS development.

Contributing to CocoaPods

If you’re an iOS Developer, you probably have heard of CocoaPods. More and more developers are using it. I’ve personally used it on many projects and I’m not sure I would want to go back to the old manual way of adding in libraries.

A few weekends ago, on March 29th-30th, they had the CocoaPods Bug Bash. I used to work a lot on the weekends when I ran my own iOS/Android consulting business, but now that I’m working at Capital One, my weekends are pretty wide open. Yay for work-life balance! (P.s. We’re hiring iOS Developers, just contact me.) But since I’m kind of nerdy, I thought what better way to spend my new-found free time than by writing some code.

I hopped onto the #cocoapods IRC channel, registered and then asked the CocoaPods bot to assign me a ticket. By the luck of the draw, I got issue #1489.

I set up my development environment by cloning the CocoaPods/CocoaPods repo, then initialized via rake bootstrap and ran the tests via rake spec.

At that point I realized, oh this is all in Ruby! For some reason I had thought it had more Objective-C in it, since it dealt with Xcode so heavily. Fortunately for me, before the iPhone SDK came out, I had made my living for a while creating Ruby on Rails apps. I quickly rediscovered my love for Ruby.

I loved it so much, I spent most of that weekend hacking away on CocoaPods and the weekend afterwards. At the end of it, I had touched not only the main CocoaPods repository, but also the internals of it in CocoaPods/Core and the high level tests in CocoaPods/cocoapods-integration-specs.

I’m now an contributor to all of those repositories and thus the CocoaPods project! I also got into the CHANGELOG twice:

0.32.0

An informative error message is presented when merge conflict is detected in a YAML file.
Luis de la Rosa #69 #100

0.31.0

Generated prefix header file will now have unique prefix_header_contents for Pods with subspecs.
Luis de la Rosa #1449

The most enjoyable aspect for me though is that it is fun to hang out with other developers from around the world. @orta, @irrationalfab and @alloy are pretty cool fellows and they are welcoming and helpful when they are around in IRC. They are definitely not shy about asking you to squash your commits, but they are also quite friendly with their emotes in pull request reviews.

I’m planning on doing some more hacking on CocoaPods. If you’re interested, I can help you get started with it if you’re in the DC area and come to NSCoderNightDC. Another good way to get started is to join the IRC room #cocoapods, set up your development environment and then just ask which issue might be good to work on. You might also want to follow the CocoaPods Twitter account and look for the “Simple open contribution of the day” which highlights simple issues to get you started.

iOSDevCampDC 2014 Coming in August!

Mark your calendars: the date for iOSDevCampDC 2014 will be Saturday August 2 Friday August 1, 2014. We’ve booked a big place this year for iOSDevCampDC 2014 – the new DIG space at Capital One in Tysons Corner. It will follow the same one-track format, although we’re thinking of having some more time in-between sessions so we can enjoy the game room. I hear foosball and air hockey are good for learning. :)

We’ve also issued a Call for Speakers, ending on March 28th, so if you’re interested in speaking, send us a talk proposal with what you want to present, a short bio and link to your Twitter (or other) profile to info@iosdevcampdc.com. We would love to have at least one female speaker especially. Natalia presented along with Keith and Kiril about Harbor Master back at iPhoneDevCampDC and she was well received.

If you are interested in attending, please stay tuned and follow @iosdevcampdc on Twitter. We’ll likely be opening up early bird ticket sales sometime in April.

Lagunitas – an iOS app inspection tool

If you make iOS apps, sometimes it is helpful to verify that the archive you made via Xcode has what you expected inside of it. Lagunitas is a tool to help you do that, courtesy of @soffes.

I just tried it out and it works great. Here are some usage notes:

I use rvm so I have a nice Ruby 2.0 environment on Mountain Lion, so I installed the Ruby Gem for Lagunitas like so:
rvm use 2.0
gem install lagunitas

After that, I changed to the directory that had an IPA I was interested in.

I fired up irb:
irb

Once in irb, I required (which is like an import) lagnuitas and tried to inspect the app inside the IPA:
require "rubygems"
require "lagunitas"
ipa = Lagunitas::IPA.new("myAwesome.ipa")
app = ipa.app

I was confronted with this error message:

NameError: uninitialized constant Lagunitas::IPA::SecureRandom

And so I guessed at the right require:
require "securerandom"

Voila – that fixed it and everything went well after that:
app = ipa.app
=> #<Lagunitas::App:0x007ff002905570 @path="tmp/lagunitas-e5c477f91f8777d76f2c9e79ececd358/Payload/myAwesome.app">
app.identifier
=> "com.luisdelarosa.myAwesomeApp"