Easy way to make more money

Yesterday I cancelled some insurance that I didn't need anymore. That's about $150 more in my bank account every month.

A couple of weeks ago I cancelled a few streaming services, that's another $25 per month.

A few months ago, I called my mobile carrier and managed to lower the price of my phone bill by $30.

If you add all of it, that's about $200 that I save every month compared to earlier this year. That's substantial.

You probably already know this, but these examples are a good reminder that the best way to increase our income is to cut expenses.

Bonus story: A couple of years ago, I had to be careful with my expenses, and tried to cut as many unnecessary things as possible. One of them was cookies, chips, sodas, and all other kinds of processed foods. I also reduced the size of my meals. Not only did I save money, but I also lost 15 pounds in 3 months!

I wake up when I wake up

One of the best things when I was freelancing was that I could wake up whenever I wanted. It doesn't mean I slept all mornings. I just stopped using an alarm clock. I'd naturally wake up at about the same time every day thanks to my body's internal clock rather than the dreading sound of an alarm.

One of the best things about working at Unsplash is that we manage our time however we want, as long as we complete our tasks in a reasonable time. So I can keep waking up without an alarm clock.

I use an alarm when I have something scheduled that I can't miss, but it's very occasional, no more than 10 times a year.

And in case you're wondering, I usually wake up between 6am and 7am.

10 years making iOS apps full time

This week I'm celebrating 10 years of making iOS apps. I don't know the exact day. I searched through my first projects, the oldest files date from March but I didn't use versioning back then and re-created projects from scratch quite often. The earliest 'proof' I have is a photo from February 13, 2009, when I created an account on the iPhone Developer Program.

I have been making apps full time since then. Just a couple of years after I started, people called me a senior developer, and it made me laugh because I didn't consider myself one. But I realized I was one of the few then who had worked full-time building apps when most developers were hobbyists, creating apps on their personal time while having different jobs.

It's been a fun 10 years, I worked on 31 apps, mostly as a freelance, and learned a ton from the many people. A big thank you to

  • Fred Brunel, for teaching me a ton about programming best practices, scoping projects, managing priorities, and shipping products.
  • Martin Dufort, for giving me a chance in the early days of iOS development, and for coining the term "Olislump."
  • Sam Vermette, for sharing your care for design and the awkward jokes, it was fun co-organizing CocoaHeads with you.
  • Hesam Hosseini, for the trust and respect you showed for me during the years we worked together.
  • Dan Robichaud, for showing me what it's like to work in a startup, and managing ever-changing priorities.
  • Luc Vandal, for your confidence in me, letting me work on your baby, Screens.
  • Adii Pienaar, I owe you more than you think, we still have a company together by the way.
  • John Mitchell, for showing me the business side of making apps, and how ruthless we should sometimes be.
  • Mikael Cho, Luke Chesser, and Steph Liverani for staying in touch all along my iOS developer career and giving me the opportunity to join the fantastic team at Unsplash.

Back on Ghost

This site is hosted on Ghost, a fantastic publishing platform, built by people with great values. I backed the project on Kickstarter almost 6 years ago and used it for several years. But I had to make budget cuts early 2017 and moved my site to a much cheaper DIY solution.

While that DIY solution was great for my wallet, it turned out to be quite complicated to write and publish content. So much that it discouraged me from writing. Many times, I thought about writing something, but the thought of going through this tedious process was enough just to give up.

I like to write and want to try more, and for the past couple of months, I considered moving the site back to Ghost. The price was what refrained me from moving forward. It's overpriced for my needs, but the thought of supporting this great team behind the project convinced me to pull the trigger yesterday.

It's changed a lot since the last time I used it, in a good way. The editor is a joy to use, and I'm very excited to be writing again!

We're all jerks sometimes

Yesterday I went with a friend in a neighbourhood I don’t know well. I parked the car in a snow-covered street, after we both checked the parking signage, and made sure it was okay to park there.

When we came back to the car, there was a ticket on the windshield; I was mad but pretty sure I would be able to contest it. As I was brushing off the snow from the car, I noticed I had parked in front of the driveway. I checked the ticket and yup, the description was right. I hadn’t seen that driveway when I parked, and clearly, I would have moved to another spot if I had.

I probably didn’t notice it because I was more focus on the signage (it’s a nightmare in Montreal), and it was all covered in snow, but these are not valid excuses, I should have paid attention. My friend told me she shared the blame, but while I appreciate the gesture, I drove the car, so I was in charge. It’s my job to pay attention, not hers.

I was quite angry at myself because I always to try to be nice to people and make it easy for everyone around me, but this time I was the jerk. I felt like this one wrong move on my part ruined all the moments I tried to be nice. I was angry and ashamed.

That’s a reminder that when I see a stranger misbehave, I shouldn’t think they’re a jerk/moron/dummy. We can’t make quick assumptions about people based on a single poor action from their part without getting more context. We’re all jerks sometimes.

Car dealerships' missed opportunity

Earlier this week, I went to Audi for my car’s annual checkup and to get the winter tires installed. They offered me a courtesy vehicle while they work on the car.

The few times Audi handed me courtesy vehicles, I was looking forward to testing an Audi model different than mine. Instead, they loaned me non-Audi cars: a GM and a Kia. I was disappointed. And this is where the dealership is missing an opportunity to sell new vehicles.

They could have loaned me a slightly-more-expensive-than-my-car A4, which may have convinced me to upgrade last year when I got a new A3. Courtesy vehicles are a great way to offer customers to test drive cars they might be inclined to buy in the future. It also helps retain customers.

By loaning other brands cars, it’s possible the customer might prefer the competitor’s models. What if I had loved the Kia (I didn’t)?

This time, I had a brand new Audi Q3, the SUV version of my A3. I was excited to try it. In the end, I was not impressed with that car, I prefer my A3, but at least I now know the Q3 isn’t for me, but I would recommend it to my mom.

Oh hey there!

Look who’s back here? What happened during this year and a half hiatus? More travels, new friends, new apartment, new job. The usual as per Oli’s standards. And what’s the deal with writing again?

Last week I attended an event where my friend Shelley talked about her passion for writing. She challenged herself this summer to write every day for 30 days, and succeeded, explaining that she allocated one hour to writing between 8 am and 9 am.

And I thought “I can do the same, 8 am sounds like a good time to write”. It’s currently 8:12 am on this cold Tuesday morning of November the 21st, here in Montreal, and I’m writing again.

Small Victories

As you read this, I won that post. What do I mean, you ask? Well, I believe life is about winning. Whether it’s a game, money, fame, a heart… we all want to succeed.

But all these goals we think about on a daily basis are the mid/long term ones. We ignore the small ones, like eating, being at work on time, buying the groceries, or even taking a shower. These are unconscious, or routine, goals.

And every time we complete these goals, we win. You’re hungry, you cook, you eat, you’re not hungry anymore, you won. That simple.

Think about all the little goals you’ve accomplished today, and compare that to the things you failed. I bet you had more victories than losses.

I know this is a candid way of seeing things. But seeing victories in even the small tasks nurtures a positive mindset. It’s also fun. And I don’t know about you, but I like having fun. And I just won that post. Boom!

I Don't Have Time For The Lazies

For the past couple of years, I have been contacted around twice a week by recruiters. Most of the time from LinkedIn. I rank them in three categories.

  1. The lazies - They just send me an invitation to connect on LinkedIn. I ignore them, even when sometimes they make the effort of adding a custom message instead of just leaving the default one.
  2. The average - They send me a message from LinkedIn before trying to connect. Usually they give details about the position they’re trying to fill in. I answer them, sometimes after several weeks, but I make the effort to answer them, because they took the time to write a message, even though it may be a canned message.
  3. The good ones - They send me an email to my personal address. That means they’ve done their job and tried to find more about me than just what’s on LinkedIn. I usually answer them within a day or two.

It’s not very hard to land on my site and find my email address. Yet, I’m shocked that very few recruiters send me an email instead of going through LinkedIn.

There’s a shortage of iOS developers, so you would assume that recruiters would try to do their best to attract them by doing a minimum of research. But no… most of them are lazy and just send an invitation to connect. I don’t have time for the lazies.

Rumours

Friend: Hey Oli, what do you think about that team acquiring that player?
Me: Is it official or rumours?
Friend: Rumours.
Me: Then I don’t care.

I don’t care about hypothesis, I care about facts. I don’t have time to speculate on rumours, I’d rather spend my time writing.

I Have No Clue What's Going On

Let’s get back about fifteen years ago. I was watching the half-hour newscast on TV, waiting to see the summary of a soccer game at the end of the broadcast. Five minutes in, bad news. Ten minutes in, bad news again. Twenty minutes in, more bad news. Twenty-five minutes in, sports should kick in, but guess what? Still more bad news. We reach the thirty minute mark and the show ends, nothing about sports. We went through thirty minutes of bad news, and no sports, not even any good news at all. I was pissed.

That night I decided to stop following the news. And over time, I became happier and more optimistic about everything.

At some point, I got back to following the news again. And you know what? My optimism started to fade out.

Three weeks ago I decided to cut the news again. Besides sports, I’m not reading the news online, I’m not watching the news on TV, I’m not listening to podcasts, I’m not reading RSS feeds, I’m not browsing my Twitter feed.

I have no clue what’s going on, and it feels good. Really good.

You're Not Fun Anymore, Twitter

Hey Twitter! How’s it going? I noticed you’ve become a great place to spread the word about inequalities, conflicts, unfairness, and so on. That’s amazing and I believe this is your best achievement so far.

How about me? Well… all this increasing sharing of injustice is not what I’m looking for when I browse my feed. Not that I don’t care about these, but I’ve always considered you as a fun place to hang out. You’re not fun anymore, Twitter.

Yeah I know… I could follow different people… but I’m lazy, so I’m gonna stop browsing my feed and keep posting meaningless and fun things.

No hard feelings,
Olivier

I Had To Redesign The Site

It’s always the same story. You start a new blog, write a couple posts, and for whatever reason stop at some point. Then you find all kinds of excuses to not write again. A popular one is that the site needs to be redesigned.

Yeah, right…

And guess what? That’s exactly what happened here. For the past couple months, I’ve been itching to write again, but because it didn’t look good on mobile, I believed I had to redesign the site before. Poor excuse, but I did it anyway.

Give Your App a Brain With a Flow Controller

One of the first rules a developer learns is to separate the code handling the data and the user interface. The link between the data and UI is usually done in a controller, or, in iOS, a view controller. In most projects, view controllers are interconnected and can be very dependent with one another. That’s where the flow controller comes in. It serves as a link between view controllers. It’s the brain of the app.

Technically speaking, a flow controller is a NSObject, and is very specific to the app you’re working on. Therefore it’s hard to have a base object to subclass. However, there are some rules to follow when architecting the app.

  1. Keep the application’s stateThe flow controller should always know what view controller is currently in charge. It should also poll the model objects to know the current context (feature locked/unlocked, logged in/out…).
  2. Manage the logic between view controllersThe flow controller should control the view controllers. Because it knows the application’s state, it knows when to present or dismiss a specific view controller, and which view controller should get the focus next. View controllers report to the flow controller through delegate methods so it can perform the necessary action.
  3. Orchestrate the view controllersThe flow controller should take care of the transitions and animations between view controllers. Centralizing this in an object makes it easier to replace a custom transition or change the app’s architecture (tab bar, navigation controller…).
  4. Prevent view controller dependenciesThe flow controller should remove dependencies between view controllers. They report to the flow controller when they require an external action and don’t know about each other, the flow controller does.
  5. Handle a portion of the applicationFor complex applications with a lot of view controllers, it may be better to use several flow controllers, each taking care of a different portion of the app and reporting to a master one. An application with a tab bar could have a flow controller per tab, and a main one that links them together.

I’ve used a flow controller in two projects so far, and it helped a lot organize and keep track of the workflow of the apps.


This post is based on a presentation I made at CocoaHeads Paris on January 9th, 2014. You can view the slides here.

Download a sample project here.

Universal App – From iPhone to iPad in 5 hours

This is the story of how I got to have an iPhone app work on iPad with a fairly different layout in just 5 hours of work. I’m sharing a few insights, but note this is not a secret recipe and it’s not be applicable to all projects.

This summer, I helped my friend Luc and worked with him on a new version of his company’s flagship app, Screens. Screens is a VNC client, an app that connects to a computer remotely and allows to control it. Early on, Luc had decided the app would be iOS 7 only, and that we’d start the project from scratch.

While at WWDC, as iOS 7 was unfolding before us, we exchanged about how the app could look like, and how we could take into account what we were learning that week: full-width images on iPhone, motion effects, blurs, tint color and so on.

Because the app already existed both on iPhone and iPad, we also knew from the start it would be a universal app. So as we debated on the app’s design, we considered both iPhone and iPad at the same time. Luc drew a few sketches and Thomas, the designer, quickly got back to us with pretty good mockups. The app’s design hasn’t changed much since these mockup.

They look different, yet they are the same

The app is composed of 3 main views:

  • saved screens: the remote computers you connect to often
  • discovered computers: the computers on the local network the and remote computers
  • the remote view that is displayed when you are connected to a computer

The last one is exactly the same on iPhone and iPad, it shows a full screen live view of the screen of the computer you’re connected to. We’ll focus on the first two views.

On iPhone, the saved screens is the main view, and the discovered computers view pans over. On iPad, they are laid out side by side.

Same view controllers, different storyboards

There is only one view controller for each view, then there’s a storyboard the iPhone layout and different storyboard for iPad. Some of the differences between iPhone and iPad are handled in the code, but most of the design and layout is done in these separate storyboards.

This is especially interesting in the case of the saved screens, where it’s a list on iPhone and a grid on iPad. You can now guess we went with a collection view. It’s even the same collection view cell object for both iPhone and iPad.

As we were thinking about the app’s design, we kept considering how we’d have to handle the development too.

Make sure all works on iPhone before moving to iPad

So this is how we approached the app’s development. We made sure we had all the functionality work on iPhone before even starting on iPad. Since we already knew how the app would look like on iPad, we knew beforehand we’d use a collection view instead of a table view on iPhone.

It took a couple of weeks to have something working pretty well on iPhone. At some point, though the app was still far from being perfect, we knew all the core functionality and logic was there for us to add the iPad layout.

Then it was breathe: set the project as a universal app, add the iPad storyboard and set the collection view’s layout properties, and handle some differences in the code when necessary.

In no more than 5 hours, the iPad version of Screens was working as well as on iPhone, with a different design. I didn’t expect it’d be so easy to be honest.

Plan ahead, design with development in mind

Imagine if we had used a table view on iPhone and a collection view on iPad. How would have we handled that? We’d probably have ended up with more files, a lot more code, and more pain to maintain that code.

I think the reason it went so fast is because of the way we planned the design and the development together. It doesn’t work that well for all projects, but whenever you can, try to think about development effort as you design your app.


This post is based on a presentation I made at CocoaHeads Paris on December 12th, 2013. You can view the slides here.

Solving Problems Like a Pinball

When solving a problem, imagine you build a pinball. The ball must reach the back of the play field when you hit it with the flippers. So the first thing to do is remove all the obstacles and make sure it reaches the back. Only then you can add the obstacles one by one while ensuring it keeps working every time.

That’s what my teacher used to say during programming classes. When starting a new project, or a new feature, start with the most basic thing, then iterate in small increments.

Need to add a label in a view? Place it at the center with a bright color so you can’t miss it. Then you can move it to its final position.

Need to connect to an API? Hard-code the URL and credentials and make the connection succeeds. Then you can create a view that asks for credentials.

Need to create a custom transition between views? Create a new ‘lab’ project dedicated to this task. Once it works you can move the necessary code to your big project.

Go the easy and lazy way first, then improve. Hard-code values, use bright colors, or even start a brand new little project and make sure that what you have to do works at its core. Once it works, you can add obstacles one by one.

It’s something we all know but sometimes forget. I found the comparison with the pinball quite funny so it stuck in my head.

It's Not Obvious to Everyone

I don’t use my phone as much as you do.

This is something my dad told me a couple times as I was teaching him a few features of iOS.

If you read this, you probably know more about iOS and technology in general than the average person. Many things that are easy and obvious to us aren’t to most people.

Observations

The following are a few observations I’ve made over the past couple of years. I don’t have numbers, but I’m pretty sure my usage of ‘some people’ should be more like ‘most people’.

Some people don’t use their phone extensively

For most people, a phone is just a tool to communicate and get entertained when they have time to kill. Because it’s not an object of real interest to them, they don’t have or take the time to learn new flows, icons, terms or read manuals (nobody reads manuals).

My dad often touches his iPhone’s screen inadvertently; that brings the current app to another view/state and he’s lost.

Some people hesitate to try when they don’t know the outcome

People are not adventurous by nature. On a computer they’re afraid to break everything if they try something. They approach phones the same way, and if an icon is unclear or a label confusing, they won’t touch it.

Some people don’t know the difference between similar technologies

What’s the difference between WiFi and 3G/LTE? To most people those are the same, they’re the Internet. As long as they are connected to the web they’re fine, how they are connected, they don’t care.

Some complain the Internet is too slow on their iPhone, they don’t notice the ‘E’ next to the carrier’s name, they don’t even know what that ‘E’ means.

What’s the difference between SMS and iMessage? The fact that it’s combined in the same discussion is convenient, but many people wonder why they have blue and green bubbles.

Some people don’t care about aesthetics

In the Talk Show’s 56th episode, John and Guy mention several people they showed iOS 7 didn’t notice the visual difference with iOS 6.

The phone is a tool, and people want to get things done with it. Take a unit converter app for example. Everyone want that kind of app on their phone because it’s convenient and can be useful sometimes. You spend hundreds of hours building the most beautiful unit converter app and charge $1.99 for it. It doesn’t sell because people prefer the ugly free competitor. To them both apps do the same job, but they choose the free one because they don’t care as much about aesthetics as they do about price.

Avoid confusion

Use words carefully

I know it’s annoying for most developers, but spending time to find the proper terms and sentences is very important if you want to avoid confusion. Avoid nerdy terms but be precise when it is necessary.

The iPhone’s manual used to be a great example. Big images, a few lines of text to explain all the main concepts and features. Sadly, nobody reads manuals and the iPhone 5S doesn’t ship with one anymore.

Stay close to Apple’s default behaviors and visuals

People are used to the default interface, if you try to differentiate your app too much, people will be lost. Icon for a delete action? Use a trash, not a cross. Back/Close button? Put it in the top left corner of the screen because that’s where it belongs on iOS.

iOS 7 is a big change and some developers are tempted to put borders around buttons or backgrounds to keep a button shape. But iOS users will get used to that new design, and quicker than you’d think because the apps they use the most are Apple’s, like Mail, Phone and Messages.

Spend time observing Apple’s apps, their flows, animations, and text. They’re not always perfect, but most of the time they solves problems the right way. And it’s a great source of inspiration.

Provide some help within your app

Whether it’s a walkthrough when the user launches the app for the first time, an overlay, a sample document or an embedded help web page, your app must provide some help for the user. And it has to be easily accessible, people won’t find it if they have to dig into a long view hierarchy.

It’s usually not a fun thing to work on, but you can make it cool, the perfect example being StatusBoard for iPad by Panic. The guide looks like a real manual, and it’s actually entertaining to experience the first time you launch the app.

The tip of the iceberg

I just scratched the surface here, there’s a ton more to say about improving the user experience for mass market apps.

We spend our days working on apps, we talk about development, technology all the time between ourselves. But sometimes we need to take a step back, and think about the guys who are not in our bubble. They are the majority, we are the aliens.

Many things in technology are obvious to us, but not to most people. We have to take that into account while we build products.


This post is based on a presentation I made at CocoaHeads Montreal on October 8th, 2013. You can view the slides here.

See Better, Feel Better

I wore glasses for most of my life. When I was in elementary school, other kids made fun of me for the ’fancy’ glasses I wore, or because I didn’t look cool. As a teenager, I was classified as a geek, before being a geek was hip. I got used to those remarks and easy stereotypes. It hurt, but I got used to it.

My glasses were the first thing I looked for as I woke up. I couldn’t see much without them. If I placed them in a unusual spot the night before, say on the coffee table in the living room, it could be a challenge to find them. Other times I forgot to put them away as I was going in the shower. Those who wear glasses all day know what I’m talking about. Glasses become part of us.

Every now and then people asked me why I didn’t wear contacts. The idea of ’putting my finger in my eyes’ kinda scared me. I also believed that nature made me so that my vision wasn’t perfect, and I had to deal with it the most basic way, with glasses.

In the summer of 2010, I decided I needed new glasses. I used the same pair for 10 years, which is way too long, so I was due for new ones. But then the idea of laser eye surgery popped. I had heard a few people saying the operation is very common and easy. I started reading a bit more about it and got an appointment at a clinic for an evaluation. I was a good candidate for the surgery.

I had the surgery on September 21, 2010. 10 minutes later, I didn’t need glasses anymore. I remember sitting on my couch a couple hours later, being able to read the time on the cable box on the other side of the room, and laughing of joy, excited. That was the moment I realized what happened. The next days were like a game of trying to read everything, and gauging how far I was able to read and see things clearly.

This surgery has changed my life in many ways. I gained more confidence in myself. The glasses were a burden that I got rid of, I felt I wasn’t considered as a geek anymore, I could be anyone. Kinda like Clark Kent becoming Superman.

My Road Trip Break

A very good friend of mine got married on March 1st in Los Angeles. I thought it’d be cool to do a road trip to get there. My plan was to take the train down to New York City to visit my brother before renting a car and driving for seven days to Los Angeles. I’d then stay a couple days for the wedding and finally drive back to New York over another five days.

Everyone who I shared my plans with told me two things: “Wow! That’s awesome, I wish I could do the same some time” and, “round-trip! You’re crazy! That’s a lot of driving!” To me, doing this round-trip doubled the awesomeness; I love driving.

As I knew I’d spend 12 days driving the car alone, I expected to take the time to think and reflect on life and other random things. I also planned to listen to music the entire time, because that’s what you are supposed to do on a road trip.

Turns out, I ended up doing almost none of this. I just watched the road, hands on the wheel, cruise control on, looking out at the scenery here and there. I didn’t listen to any of the podcasts I wanted to catch up on and never had the epiphany I thought I’d have while reflecting on my life.

I’m a little disappointed about that. I say only a ‘little,’ because, nonetheless, I did learn a few lessons from that road trip. One is that it’s important to take breaks from your every day life. The past couple of years, I’ve been so busy that I stopped allocating free time in my schedule. That road trip showed me that I was due for a good break.

The Morning Coffee Experience

Grande no whip mocha. That’s my drink at Starbucks. I’m actually not a coffee fan (I don’t like bitterness); however, I appreciate it when mixed with sugar and chocolate. I’m also not used to caffeine, so even a small dose has a big effect on me. The amount of coffee in the mocha is enough to kick-start my day.

I usually stop by my local Starbucks on the way to work three to four times a week. There’s a coffee shop with a better reputation a few blocks away where they prepare coffee with great care, and their mocha is delicious. Nevertheless, I prefer the experience at Starbucks.

There’s something we tend to overlook: the people who work in coffee shops have more impact on the world than they think. The way our mornings start has a big influence on how our day turns out. The more snags you experience, the worst your day may be. A good day usually starts with a good drink that wakes you up and makes you feel alive.

However, a good drink is not enough. What I enjoy the most about my local Starbucks are the nice, short conversations and the smiles the employees share when they hand me my mocha. This makes the difference with the nearby famed coffee shop, where they are so serious about their ‘craft’ that there’s no talks and no smile.

Now think about this on a larger scale. If those small talks and smiles work for me, imagine what it does to thousands of others. Working at Starbucks may not be the fanciest job in the world, but I’m pretty sure the people who work in those coffeehouse chains have a greater influence on the world than we think.

Professional Writer

When I was 18, I almost went to university to get an English literature degree instead of studying programming. I wanted to learn languages and write well.

Fast forward to today, I write hundreds of words a day and I’m fluent in several languages. Not the same kind of writing and languages I pictured back in the day though.

I write code for a job, the audience are my co-workers who read it, and computers that generate apps out of it. The languages I use the most are called Objective-C, C, Ruby, and Javascript.

At the time I gave up on the idea to go to university, I wanted to write for a large audience about sports or a sci-fi novel. I haven’t achieved any of this, but still, for the past 10 years, I’ve stayed in front of a computer writing… code.

It’s only a month ago that I made the link between those early aspirations and my current situation. Sometimes you give something up and think it’ll never show up again, only to later find out it never left.

I’ve recently started to write about sports, and learn Spanish. Interesting how things go in life.