31 Aug 2015
1 year, 3 months, and 13 days ago I graduated from college. I feel the transition from high school to college is openly discussed, but the following transition into the real world is not. Life after school has taught me a lot about myself and I am writing this post as a reflection on some of the lessons I have learned (a few the hard way).
Everyone Is Making It up as They Go
There is no manual to life and how you should live it. Your parents, idols, mentors, managers, and favorite celebrities are all making it up as they go. That is the beauty of it! It is yours to define. All of your past experiences, successes, and failures have brought you to this exact moment.
Time Moves Way Faster After School
It seriously does. People claim that college will be the best four years of your life and that it moves quickly. I have two reactions to this. First, why upper bound your "best years?" College is an amazing time, but it should also be a launchpad into your best years down the road. Secondly, as the president of Y Combinator, Sam Altman, mentioned in his post on turning 30: "the days are long but the decades are short." Years following school fly by way faster than those in school.
Mental Health Is Just as Important as Physical Health
We tend to obsess over eating the right things, working out, and making healthier physical decisions. We need to do the same for our minds. Life after college is challenging. Find ways to be at ease with your mind and thoughts. Meditate. Track your mood. Call an old friend who moved far away after graduation. FaceTime your parents and siblings. Smile while commuting to work. Say hi to a stranger. Or even see a psychiatrist every other week. Mental health is much easier to handle in a preventive fashion. It is not weird or a sign of failure to do these things. By learning to manage thoughts and emotions, mindfulness is worth its weight in gold.
In a previous post about loneliness. I failed to mention how normal these feelings are. This is especially true after graduation. You will be lonely at times in this new chapter. However, the irony of loneliness is that we all share it from time to time.
Burnout Is Real
Related to mental health, make sure to pace yourself in your work. There are no speed limits after exiting the highway that is college (more on this metaphor in a bit). Anyone who tells you that you should be firing on all cylinders 24/7 is on track for burnout. Make sure to plan time for fun. Shut down your computer after work. Revisit an old video game you loved as a kid. While we often praise the hard worker who stays in the office until midnight, we overlook the fact that having a proper work cadence is the key to a long-lasting career.
Optimize for Learning
After college, you might not exactly know your niche. That is perfectly fine. In this case, I tend to optimize for learning. Will that job at a startup pay less than the 800-pound gorilla but teach you more? Go with the startup. Your first job won't define your entire career. Lean towards opportunities that push you outside your comfort zone.
Your Peers Are All on Their Own Trajectories
In school, it's too easy to fall into the trap of falsely comparing yourself to others. Whether it's by GPA or courses taken, these metrics are not clean-cut. Moreover, after school, everyone embarks on their own trajectories and you need to make sure not to juxtapose them. Life is a race against yourself.
Additionally, just because someone has years of prior experience doesn't mean they can't one day be your peer. "A little bit of slope makes up for a lot of y-intercept."
From a lecture by Professor John Ousterhout
Establish Keystone Habits
Keystone habits are those that keep you due north, when everything else in life may appear to be going south. A common example is exercise. When you exercise regularly, you tend to sleep, eat, and feel better. Some of my keystone habits include writing three positive things about each day (which later turned into a habit of journaling), meditation, and reading.
No Matter What Happens, It'll Be Just Right
Transitioning from college to the real world often leaves some aspects of your life in a difficult situation. Will you still be close to friends who are moving to a different city? Should you try a long-distance relationship with your significant other? I have coped with these difficult questions by being at ease with all possible outcomes. Some friends will naturally fall out of touch and that's perfectly fine. Hold onto those that stay close. Long-distance relationships can work, but if they don't, you'll know right away. No matter what happens, it'll be just right.
Take Time to Reflect
You know that quote about the second best time to plant a tree being now? The same applies to journaling your thoughts, feelings, and smaller moments in life. The only regret I have about actively journaling is the fact that I didn't start earlier. Make sure to also reflect on your previous entries. It can often be a great reminder of how far you've come.
There Are No Guardrails
I like to think of college as a highway that you and your peers are driving along. You have the safe comfort of guardrails to keep you on track. Graduation is much like taking an exit in this regard. No one will tell you what you should do, when you should do it, or how to approach it. You are own your own now. Maybe you'll blaze a new trail. Maybe you'll find yourself at an intersection with an old friend. In either case, take care of your vehicle, visit rest stops, and enjoy the journey!
22 Aug 2015
From a previous internship and my most recent job, I have been fortunate enough to be allowed to work remotely for extended periods of time. While the benefits of remote work are widely discussed, I wanted to talk about one of the downsides I struggled with the most: loneliness. This is a really personal topic and definitely hard to write about. However, I hope the lessons I have learned can help others who are dealing with (or are worried about) loneliness in a remote setting.
Not Being Around Others
One of the most immediate hurdles is the fact that you will no longer be around your teammates. This can be especially difficult if a remote culture isn’t baked into your company, where you might feel like an outlier during in-person events such as all-hands meetings or social gatherings. To remedy this, I’ve tried a few things:
One of the easiest ways to make your teammates see the person behind your avatar in chat is to establish a method of ambient presence. This doesn’t have to be as daunting as a live stream of your workspace. Sqwiggle shines in this regard. The app takes pictures of you at regular intervals (one or five minutes, with manual override) to help your team feel more connected. I can't recommend it enough. It is amazing how much of an effect seeing your coworkers faces each day has on your overall mood.
I actually borrowed this technique from the wonderful folks over at Buffer. Every week, I would set up 15-20 minute calls with a specific teammate. A strict rule during these calls is that we would discuss anything except work. Not only did this help tackle loneliness, it allowed me to get to know my teammates on a more personal level (works well with meeting new hires too).
Meals With Friends
Another way to get out of your typical workspace is to schedule meals with friends in the area. This is perfect for catching up with old friends and helped me avoid the trap of simply eating lunch at my desk.
Nearby coworking spaces can be a silver bullet in combatting loneliness. This is one resource I wish I had used more during my time working remotely.
Missing out on Offline Communication Channels
In both of my remote experiences, the companies were onsite by default. This leads to challenges regarding offline communication (in-person chats, impromptu meetings, etc.) that must be overcome. In handling these challenges, the goal should be to default to online communication and reach a level where there is no advantage to being in the office. Not only does this help remote employees, it helps those onsite by making all communication searchable and documented in a manner accessible to all employees. One specific difficulty I wanted to highlight is accidentally not being called into meetings. To solve this, my previous team added Google Hangout links to all calendar invites, which worked really well. Additionally, I made sure to be vocal if I wasn't called into a meeting before it started. Don't be shy. You won't be rude by doing so and it will help make calling in remote employees more habitual for those in the office.
Cabin Fever and Burnout
Mental health is critical, especially when working remotely, and I wish it was discussed more openly. To help stay in check, I have used meditation, mood logging, and hour tracking.
After struggling to meditate regularly for the past couple of years, I finally hit my rhythm with Headspace. It is an amazing app that guides you through meditation and presents it in a non-spiritual manner that is approachable. Starting to meditate has honestly been one of the best decisions of my life. It has allowed me to start each day with clarity and benefitted my personal relationships in ways I couldn't even imagine. Relating to remote work, this will help prevent your emotions from snowballing internally, in the absence of others being around you for emotional support.
One of the lessons in Headspace is that you should only treat thoughts for what they are, thoughts! In practice, this means that you should try1 not to let thoughts become larger than they really are. To do this, it is helpful to label thoughts when they arise. For example, is the thought a worry about the future, a feeling, or just thinking? After labeling the thought, I try to imagine the thought as being a glass ball floating in space. In labeling it, I'm gently pushing it away with a feather. This metaphor serves as a way to mentally separate myself from my thoughts. I recently discovered an app that encapsulates this process called Moodnotes. After a week of use, it has already earned a spot on my home row!
Shutting Down My Computer
One thing that surprised me when I initially started working remotely was that I actually worked more than I previously did onsite. I would often let work-related tasks slip into my personal life (exaggerated by time zone differences). Answering that one email after hours or getting extra development time at night. While these small occurrences may seem harmless, they quickly add up and contribute to burnout. This is when I started to become strict about shutting down my computer after work. I wouldn't reply to non-urgent messages after signing off either. While this may require an adjustment period, it helped my previous teams rely on asynchronous communication, which plays well with time zones and honoring people's periods of productivity.
All in all, I am a huge fan of remote work. It affords you and your team many benefits that just aren't possible when requiring everyone to be under the same roof. However, loneliness is a hurdle that needs to be discussed openly and overcome. I hope some of the lessons and techniques I learned can help in your journey. Have any that I missed? Let me know!
1: Easier said than done, of course!
09 Aug 2015
Starting in 2015, I made a goal to actively read more. I approached this in two directions: traditional books1 and trekking through my Pocket queue. For those who aren't familiar with Pocket, it's an app that allows you to save online articles and videos for later consumption (even offline). Moreover, it has an amazing interface which makes reading web content feel comparable to an eBook.
One issue I have always faced with Pocket is the fact that deferring content to read later2 often meant that I never got to it or read it much later, when no longer relevant. In the past few weeks, I have been able to take my Pocket queue from well over 400 items to 100. Here are some techniques that might help in your quest to 'Pocket Zero'!
Aim for a Decreasing Number of Items Each Day
In any given day, I try to read more items than I save. A simple rule for accomplishing this is "for every item you save to the queue, read two."
Use Badge Counts
Badge counts help me keep track of my queue totals (and the above technique). However, I always have to remind myself that this number shouldn't be discouraging. It's just a mile marker. For each decrement, I'm one item closer to my goal.
Sort by Oldest First to Trim Irrelevant Items
Every so often, I'll reverse the sort order of my queue to trim older or irrelevant items. No longer interested in the topic? Archive. Out of date? Archive. Broken URL? Archive.
Watch Video Content on Commutes and Workouts
Unfortunately, I get motion sick when reading in moving vehicles. So, I've often resorted to watching videos during commutes3. Another great time I've found for knocking out video content is during my cardio workouts (on stationary machines). It helps the time pass so quickly!
Use the 'Quick Reads' Feature in the App
When the day is coming to an end and I haven't gotten any reading in, this feature is a lifesaver. As the name implies, it's a collection of the shortest items in your queue. Any progress is better than no progress.
Reflect on What You Have Read for the Day
Before going to bed each night, I've started to look back at my most recently archived items. Reviewing items helps with spaced repetition of their core ideas and better persists them into memory. Moreover, this fits snugly next to my habit of journaling.
You Don't Have to Read Everything in Your Queue. Life Goes On!
At the end of the day, a Pocket queue is exactly that, a queue! It'll be there whenever you have an idle moment or an itch to read. Don't put life on pause just to clear Pocket, it's there for you to read later :)
Hope these techniques help you get the most out of Pocket! Have any that you use personally? I'd love to hear about them!
1: My current preference for reading is with iBooks. This allows me to seamlessly transition across all of my devices (including bookmarks, notes, and hightlighting). I have given the Kindle app a try, but I preferred the visual aesthetics of iBooks over it.
2: Subtle pun since Pocket used to be called Read It Later
3: Not driving of course!
02 Aug 2015
This past Spring, I transitioned to the iOS team at Imgur, after having worked on their API for the previous year. The motivation for this transition was my attendance of CodePath's Winter cohort. CodePath is an eight week program that teaches experienced web engineers either iOS or Android1. After completing the course, I was eager to bridge our existing Objective-C app to Swift2 and help in any capacity that I could.
To ramp up on the codebase, the mobile team uses pair programming extensively. This worked out really well because I would transfer knowledge about the intricacies of Swift to the more senior engineers, while they would teach me the best practices of Cocoa Touch! We've learned a lot about what makes pairing work more effectively and even got the opportunity to try remote pairing. Most recently, we used pair programming (almost exclusively) in adding upload functionality to the app. This helped catch a ton of bugs! Below are some tips we highly recommend for pairing:
- Switching drivers is a lot easier when using two keyboards hooked up to the same computer.
- For remote pairing, we've been using Screenhero3.
- For Xcode pairing specifically, CoPilot looks promising. However, we haven't tried it yet; so, we can't vouch for how well it works.
- Switch drivers after completing major logical chunks. This allows the driver to get into the code without having to be interrupted by hard time limits.
- Both partners should also agree on a cadence for switching before they start pairing.
- It's sometimes helpful to have a second computer nearby to reference docs, as needed.
- If you're not currently driving and are having trouble following, speak up. You'll often catch bugs by having the driver explain their thought process aloud (similar to the benefit of Rubber Duck Debugging).
- Get snacks and drinks before you start pairing to minimize distractions once you've gotten in the zone.
- TDD and pairing go really well together. One person writes the tests and the other writes the corresponding implementation.
- Shut down anything that can generate notifications. OS X has a "Do Not Disturb" mode available in the Notification Center.
- Make sure to take breathers and have fun!
Hope these help make your pairing sessions better! Have any other tips that I forgot to mention? Let me know on Twitter!
1: I was lucky enough to be in one of the first few batches that used Swift.
2: Post about the lessons we learned coming soon!
3: They have closed new registrations, post-Slack acquisition. So, you'll need an existing user to invite you!
11 Jul 2015
Ever wanted to write a small wrapper for an iOS app that has an undocumented API? Itching to reverse engineer how it communicates with its backend1? You're in luck! 😎 In the past, my friends and I have used this technique to figure out how to programmatically send and receive Snapchats, months after the application's release. This lead to one of the greatest stories we tell today.
To sniff an application's network traffic, we're going to use mitmproxy. It's a powerful man-in-the-middle proxy that allows you to intercept, modify, replay, and save HTTP/S traffic.
Installing mitmproxy and CA certificate
First, let's install mitmproxy (I use
pip in this example but there are other install methods in their docs)
Next, we'll need to alter the proxy settings on our iOS device to point to the machine running mitmproxy:
Determine your computer's IP on the network
- System preferences > Network > Advanced > TCP/IP
Set iOS manual proxy settings
- Settings > Wi-Fi > [select current network]
Install CA certificate on device
- Open Safari and go to
mitm.it, if everything is setup correctly, you should see this screen below. Install the Apple certificate.
Viewing Network Requests
Setup is done! Now the fun begins. You may have noticed the output pouring in from of the
mitmproxy command you ran earlier. Those are all of the network requests your device is making! You can navigate through the requests with the arrow keys and press enter on any request to inspect it (once in the inspection mode, use
l keys to switch tabs). If you need any additional help with possible commands, just type
You're all set! Inspect away and go make that unofficial API wrapper you always wanted 🚀
1 If you find any security issues, do the right thing and let the developers know. It shows character and may even land you an interview with the company 😊