CodeXJourneys

Resigned from my job and gave away my stuff. Traveling the world, becoming a better coder, and learning where I can most add value. Experiencing life and totally grateful for it.

Recent Journeys and Things Learned

Carless in L.A. and Loving It

I decided to try Medium again. Here is my second post on this beautiful essay site:

I Have No Car in L.A. and It’s Awesome

I’m not sure how it’s going to work for me, but I’ve found a publication I like there and I love writing in their interface, so I’ll probably do it from time to time.

TL;DR: I decided to use Uber and Lyft instead of renting a car in L.A. It rocks, even in Car City.

FacebookTwitterGoogle+Share

The Art of Imperfection

I took art classes in high school with an amazing teacher. Several of my classmates became illustrators.

I didn’t. I studied journalism instead. But I never forgot the most important lesson from Mr. Hess.

I messed up an art project during my senior year. I’d spent weeks outlining a harbor scene in pencil, then shading it in colored pencil, and I’d just done something immensely stupid. I zig-zagged a dark red pencil across the sun’s rays because I wasn’t paying attention. It was ruined.

Mr. Hess didn’t seem upset. He was zen calm. “Just keep working on it,” he said. I tried to explain that it was a waste of time to keep working on it, because it was ruined. He wouldn’t listen.

“Find a way to integrate it with your artwork,” he said.

I didn’t want to integrate it. It was a mistake, that giant red slash, and I wanted to go back in time and remove it and have my beautiful sun rising over the ocean, serene and perfect.

That was impossible. So I sat down in a chair and picked up my pencils and tried to figure out what the heck to do now. I started doodling around with the red slash, tracing a pencil lightly over it. I shaded a nearby ray darker, the one most affected by the slash, until it was nearly red. I traced some letters into another ray of the sun, erasing where I could and blending where I couldn’t.

In the end, my art project won an award at the year-end show. It was much better than my initial, bland vision of a serene sun rising over a serene sea. It was a chaotic scene, with dark orange and red and yellow rays alternating, and messages engraved in them spiraling out toward the edge of the canvas.

Mr. Hess was right. It’s impossible to mess up an art project if you keep working on it. Even if you tear the paper in half, that’s just a new starting point. You always arrive at another place. Sometimes it’s better. Sometimes it’s worse. It’s life. And it doesn’t become great through perfection and planning.

Life Lessons for My Younger Self

I’m a bit late for the New Year, but here are things I would tell my younger self. I got some of these right and some of these wrong. I’m still working on some of them!

Get health insurance. Having the worst-case-scenario covered allows you to take greater risks.

Get disability income insurance. You may need it someday, and when you can no longer get it, you’ll be grateful that you already have it. See above re: covering the worst-case scenario.

Don’t major in something impractical, unless you double-major in something practical.

Don’t go into student debt. It will constrict all of your life choices. Top colleges will pay a large part of your tuition if your family’s household income is below a certain threshold. Try to get admitted there. If you don’t, go somewhere cheap and supplement your learning with free online courses.

Be self-motivated in your work and education. No one else will make you be successful.

Start a company while you’re in college. As long as you don’t flunk out, this is a virtually risk-free option on your future.

Learn to program. It’s the lingua franca of the 21st century. Learn how to explain what you’re doing to someone who doesn’t know how to program.

Learn to write. It will serve you well in any career.

Learn to sell. Many unknown artists were just as talented as the famous ones. Maybe more talented. But does anyone care now?

Even when you don’t think you’re selling, you’re selling.

Most people are bored most of the time. Try to make their day a little more interesting, and you’ll be a great presenter.

Understand that the five minutes you spend stopping by someone’s office to say hi are more important than the five hours you spend on a presentation that no one sees if no one knows you. Human connections are the heart of LIFE. And of business.

Have compassion. Allow the possibility that the only difference between you and someone else may be circumstances.

Don’t be afraid to love. In the end the people you love, and the people who love you, are one of the most important things.

Do something important if you feel the urge. This is the other most important thing. Don’t permanently suppress your desire to do good to fulfill your desire for money. With persistence you may be able to have both.

Don’t put everything on Facebook or your blog. There is no “I Forget” button.

Keep a little bit of yourself to yourself.

Be generous with your time in helping others, but stay focused at your core.

You can do a lot of things one thing at a time. You can’t do everything at once. Multitasking is bullshit. Procrastinating productively, on the other hand, is not. A second project can help you complete both projects.

Sleep the number of hours you need almost every night. It makes you more productive and often happier.

Don’t eat crap. In the U.S., most processed food, meat and dairy are crap.

Give thanks for who you are and why you’re here. Then get it done.

Don’t give up easily. Keep at it until you solve the problem, for as long as you feel you can solve it and a little bit past that point.

Listen to yourself, not other people, on the decisions that really matter. Taking a job to please someone else is never a good idea.

Don’t do risky things that aren’t worth the trade-off (motorcycle riding, if you’re a neuroscientist).

Jump bravely into low risks that are masquerading as high risks (leaving a job to try something new, investing during a market crash, telling someone how you feel about them).

You can be yourself while still learning who you are. Just be willing to adjust as you go along.

Creativity and persistence combined are the greatest force on Earth. Use them well and wisely.

Endangered Species: Concentration and Solitude

Other than ridicule, great thinkers and discoverers of the past had something else in common: lots of time to themselves to think and experiment.

Our amplification-loop world is making solitude a rare commodity and concentration a rare ability. We’ve gained exponential connectivity with others but should be aware of what we’re losing.

We can get a lot more information a lot faster. But what are we doing with it? The next great breakthroughs are waiting while we browse Facebook.

Do you remember how it felt to sit and read for hours, uninterrupted?

Concentration Rehab

I’m not sure how to rediscover concentration amid the noise, but I’m trying. Here are some ideas I’m testing:

1.    Schedule at least one day a month for solitude.
2.    Just breathe and think for a little while each day — even 15 minutes helps.
3.    Take a walk outside, alone.
4.    Read for five hours straight in a paper book, where a “Go to Facebook” option doesn’t exist.

A Blue-Sky Dilemma

Solitude as a team also should be more highly valued when an idea is off-the-map and likely to be rejected by status-quo decision makers. In all sorts of environments, ranging from large companies to Startup Weekend, I’ve seen truly interesting ideas eliminated early in collaborative processes because they fell outside of normal bounds.

Those are often the most promising ideas.

Crowds rarely make breakthroughs. They’re good at enforcing the status quo, and (if organized well) at generating incremental improvements. They also eventually popularize breakthroughs, but only after a sufficient number of early adopters look sufficiently cool enough to make them jealous.

I’m not saying that early validation of high-level ideas with customers is bad. If you’re considering an idea that’s not truly novel, it’s a great thing to do. But vetting blue-sky ideas by committee or with customers is, I suspect, counterproductive in early days. The really great ideas are too impractical, too unlikely, too risky or anti-status quo to make it out of committee, unless you work at Google X.

Solitude Before Sharing?

For blue-sky ideas, a possible approach might be: Build solitude (or a small, trusted team that respects it), work hard, try new things, succeed  at a small scale, and then share.

It’s not as fun in the moment. Focusing intensely on a tough problem with no guarantee of a breakthrough often is not fun. It requires saying no to many things, giving up some trappings of respectability, and generally being perceived as odd. But it brings the possibility of doing something truly great, instead of just pretty good.

If people are telling you you’re crazy, you may have a truly terrible idea, or you may be on the right track. It’s difficult to parse that feedback, but it’s not always a stop-sign. The biggest stop-sign is feedback along the lines of, “Yeah, it’s okay. Go ahead.”

Los Angeles, Again

Apologies for my absence from the blog for the past few weeks; I spent the time immersed in Udemy, getting my new course ready for publication. It’s submitted for review now, waiting only for an image before it gets set live. I’m super-excited and will let you know more when it’s released.

I’m spending the winter in Los Angeles.

I promised myself last winter, as I was freezing in my NYC apartment with the heat cranked up to max and my poor tree actually leaning away from the window to escape the polar vortex (who knew trees even DID that?), that if I actually went ahead and pursued this plan to travel and learn and find a new path, I’d spend the winter someplace warm.

I chose L.A. I’ve lived here before, for four-plus years in the early 2000s, and I know where to go, where to avoid, where to relax, where to hike. Most of all, I have friends here who I’m looking forward to spending time with, making the city feel more like a village hamlet or a reunion than a sprawling sprawl.

I’m already feeling the pull of L.A.’s unique rhythm, the blend of seasons into endlessness, the no-hurry mornings and the bright blue perfection, though now I am uniquely qualified to fight it with productivity. I spent the last seven years in New York, where busy-ness is a way of life, even when it’s fabricated.

I remember traveling around L.A. when I was working in journalism, wondering as I passed by cafes in the middle of the day, “Who are all these idle people?”

Now I am one of those people. But I’m not idle. In the past month I’ve doubled down on my (now-working!) Xcode plugin, signed up to present it at a SXSW breakfast, added new capabilities and started planning a standalone software product; created a Udemy course to teach basic programming concepts to would-be programmers, non-technical co-founders, and parents and teachers; and fixed major bugs in my flashcard app that were preventing progress. I’ve spoken with a lawyer about creating a company and am prepared to move forward.

I expect to launch all of these projects by the time I leave in March, along with an organic food finder I prototyped last summer. It’ll be an interesting couple of months.

Then I’ll see what sticks.

In the meantime, I’ll enjoy being productive in the midst of laid-back L.A. I’m also trying to get back on track with my organic, hack-your-health lifestyle, which I decided a few years ago was non-optional if I wanted to live an optimal life. It’s super-successful for me when I’m on-board with it, so I’m back on board and ready to enjoy my (non)-winter.

73 degrees. I love it. Lots of work to do.

The Tyranny of Experts

We’re trapped in an expert-bound world.

If you’re not recognized as an expert by another team of experts, it’s difficult to reach an audience. This is true even if you really are an expert. If you spent thousands of hours pursuing mastery of economics but didn’t tell anyone about it, unless you get lucky a la Thomas Piketty, you’re shouting into a sea of noise.

This means trouble because throughout human history, many great discoveries came from lone thinkers and doers.

Leonardo da Vinci. Galileo. Mendel. Edward Jenner. Banting and Best. Einstein. Ignaz Semmelweis. Beethoven. Prometheus (mythologically speaking). Linus Torvalds (initially).

The TCP/IP Exception

There are exceptions, of course. TCP/IP. The Manhattan Project. Teamwork can work in a well-crafted atmosphere. But there’s a high failure rate in creating such an atmosphere.

And academia? It’s hard to say the modern academic environment, with profit-motivated grants and overwhelming politics, succeeds in creating a place where real breakthroughs are possible. More often, academics seem to be rewarded for incremental breakthroughs, not out-of-paradigm thinking.

High Volume, High Stakes

Granted, many of the great thinkers and discoverers listed above were ridiculed or persecuted.

But ridicule has a higher volume today, thanks to social media, the Internet, TV and worldwide communication. It’s hard to be just the village eccentric now.

Moreover, official experts often don’t dare look ridiculous by departing from the accepted quo. Even if they believe something different in private. Especially if believing something different could endanger their job.

That’s why innovation often comes from unexpected corners.

It’s a tough choice: Even if you’re right, you may be ridiculed and discredited; conversely, you could find acceptance and reward. If your discovery can make people money, chances are higher that your experience will be relatively good. If your discovery could cause people to lose a lot of money, you face a greater risk.

But even if what you have to say seems ridiculous, someone has to say it first.

Nothing Is Perfect: The Less-Good Parts

''The Mouth of the Beast'' from http://www.flickr.com/photos/amiebea/220479689/ by http://www.flickr.com/photos/amiebea/ {{cc-by}}

”The Mouth of the Beast” from http://www.flickr.com/photos/amiebea/220479689/ by http://www.flickr.com/photos/amiebea/ {{cc-by}}

One of my favorite people told me I sound like a superhero. The blog highlights all of the great parts of leaving my job and wandering the world, but none of the snags or tangles along the way.

I’m not sure I entirely agree. I’ve highlighted some of the ambiguous moments, like feeling stranded in Tuscany without a car, struggling with Internet outages and unreliable trains, and getting used to dark nights in farmhouse country. I’ve written about fear.

Partly, I’ve shied away from ungood stories because I don’t want to sound like I’m whining or ungrateful. On balance, this whole endeavor really is pretty great, and I’m happy I did it. I’m also grateful I was able to do it.

But to balance the scales a bit, this post will cover, in an anonymized way, several additional things that weren’t perfect.

1. Cat Bite, Initial Encounter. That’s what the hospital paperwork said when I was released from the emergency room. My roommate’s cat, which hates people but liked me, didn’t like it when I took her photo with my iPhone. It looked like a tiny scratch, but it got infected and my arm turned red. Seven days of antibiotics and stern warnings from my doctors to take all of them. I did.

2. Other Guest Roulette. With Airbnb, when I rent a private room in a host’s apartment, there are always other guests at some point. This has been true 100% of the time so far. Some of the guests were also from Airbnb, and some were friends of the host. Several of the guests were awesome and we became friends; others were less awesome. Only one made me feel truly uncomfortable, mainly because the hosts were also out, but we shared space for just a day and I locked my door while he was there.

3. Type-A, Nature-Lover Shock Therapy. I discovered I may not be cut out for life on vacation. That’s fine; I didn’t think I wanted to spend my life on vacation anyway. But I had more trouble than expected when I stepped away from an always-on, Internet-focused life. It was good for me to have this experience, but it wasn’t as easy or relaxing as I thought it would be. There were also beetles in the farmhouse that made a low, humming buzz that sounded like giant wasps. This terrified me until I figured it out.

4. My Right Foot. I sprained my ankle about 10 days before my scheduled flight to Florence. It wasn’t a bad sprain and didn’t hurt much, so I never bothered to ice it much or use a compression bandage. But I re-sprained it two days pre-flight; it collapsed while I was just standing still (perhaps a bad sign).

It still didn’t hurt much, so I purchased a compression sock and flew to Italy, then ended up visiting the ER the night after I landed. It turned out to be fine, thankfully, and the total bill was 31 euros. A week later, I re-sprained it again in the Cinque Terre, because I was starting to feel better and saw a hiking path near the water that I really wanted to explore. This time was worse — I felt like there was spaghetti in my ankle instead of ligaments and tendons. I finally accepted the need to take it easy. (It is getting better now, fingers crossed — I’m getting SCENAR therapy from my amazing acupuncturist and it is essentially a miracle.)

5. What Now Syndrome. My greatest fear is that I am like a zoo animal that, released from its pen, stands in the middle of a field and doesn’t know what to do. I can do anything, so I do a little bit of everything, and therefore I do nothing. I feel this fear more acutely as the learning-and-exploring phase of my adventures shifts into a do-something phase. I don’t think it’s bad for me to try several different things, and I think as long as I do some real work every day, I’ll figure it out, but it’s easy to feel overwhelmed by possibilities. I woke up this morning from a dream that I won’t be happy unless I’m working hard. I already knew that. And I woke up happy and ready to work.

I can’t help it even now. I’m turning this “Nothing Is Perfect” post into an “Isn’t This Awesome?” post. That really is how I think about the world. But nothing is perfect, and I’ve tried to give you a glimpse of that, to round out the picture and add more humanity to this adventure story.

My Interview with Nomadtopia

I’m excited to share the interview I did with Amy Scott at Nomadtopia: It’s here.

In the interview, I share some of my best advice from six months of travel, learning and exploration, including how I test-drove my nomad plan before taking the leap.

I normally have long blog posts, but this time I’ll let the interview speak for me, and I’ll be back with more later.

How to Get Almost-Free Airline Miles with Rocketmiles

One of the services I used during my recent trip was Rocketmiles. Rocketmiles offers airline miles in exchange for prepayment of hotel bookings. The main draw, for me, is the ability to earn United MileagePlus miles for hotel stays. And not just small bonuses — I earned 9000 United MileagePlus miles for a three-night stay at the Hilton Vienna Danube. The hotel rate was about $150 per night.

The going rate for 9000 miles on United’s website as a flight add-on is about $180-190. So, in exchange for paying a few weeks in advance, I received those miles for essentially $0. (I often use miles for business-class flights, so this starts to look even better.)

Rocketmiles is simple to use. Enter your destination, number of guests, dates of stay and airline loyalty program, and it produces a list of hotels offering at least 1,000 miles per night in exchange for your prepayment. Refundable rooms are often available (with cancellations required about a week before the stay begins), and prices are often the same as those on other travel sites.

Certain cities appear to offer better Rocketmiles deals than others, on average, though this can vary according to your dates of stay. I saw good deals in Vienna, Prague and Montreal when I was looking.

To me, Rocketmiles is a no-brainer if:

  • You’re planning to stay at a hotel anyway;
  • You’re staying with someone else, so your costs will be even lower; and
  • You can find a refundable room at a hotel that appeals to you.

In my mind, it becomes even more of a great deal if the value of miles received approaches 30% of the total hotel bill.

So, what are the caveats?

  • All hotels tend to sound good on Rocketmiles. Double-check the user reviews on TripAdvisor before you book.
  • Double-check the price on other travel sites to make sure it’s the same.
  • If you’re booking business travel, make sure you’re following your company’s procedures (i.e., are allowed to book your own hotel).

For four separate stays in November, the miles credited to my account quickly, and there were no hassles. I was treated well by the hotels and the rooms I was assigned were fine.

This service seems a little too-good-to-be-true, but I’ll be using it as long as it’s available.

GitHub Fails and Lessons Learned

I messed up my Xcode plugin yesterday. GitHub failed me, or rather, I failed GitHub. Then I fixed it and implemented better practices.

This blog post is an open, transparent attempt to share my mistakes and solutions.

For non-GitHub users, GitHub is sort of like Google Docs for software. It allows multiple software developers around the world to work together on software (relatively) seamlessly. So, if a software developer in Dubai makes a change, and another software developer in France makes a different change, those two changes can be merged into a single version of the software without significant hassle.

One Branch to Rule Them All

My first mistake was that I had only one GitHub branch: master. Initially, this worked well for me, because I used one laptop for development and pushed changes frequently from my local machine’s master branch to GitHub’s remote master branch.

Yesterday, I decided to push changes from a second machine, a test iMac with OS X Yosemite and Xcode 6 GM installed (for stability of the plugin, my laptop is still running Mavericks and Xcode 5/Xcode 6 beta. This turned out to be a good idea, at least until quirks are worked out).

Using the test iMac, I added the UUID (unique identification code) for Xcode 6 GM to my plugin. I did some limited testing (MAJOR MISTAKE) to verify functionality, pushed the code to GitHub’s master branch from the iMac, published a few more minor commits, and then pulled the new master version onto my laptop to make sure it also worked there.

Spoiler Alert!

The plugin did not work on my laptop. Previously functional commands produced no output. One command to create a for loop actually executed the Undo function instead! (If you’re not a software developer, just know that this is a bad kind of bug.) Most of these commands had worked fine on the test iMac.

Baffled, I decided to test every single command on the iMac (maybe I should have done this the first time, hmm?). I quickly discovered that with only one exception (of course, the one I’d tested before) my conditional-statement methods crashed Xcode. Some of the other methods that had produced no output on the laptop worked perfectly on the iMac. And entering slightly non-matching commands, which should produce no action, also crashed Xcode.

Clearly, my program now had crossed wires — and this crossed-wires version was the master branch on GitHub and the working version on my iMac and my laptop.

It was time to revert.

Don’t Cross the Streams

I researched how to revert GitHub commits. I wanted to roll back to a canonical, stable version that had worked with Xcode 5, and then go forward from there in a more measured way.

It turned out there were many ways to do this, many of which seemed complicated. The simplest way, doing a hard reset, was utterly bad practice (see: rewriting history) and I didn’t want to go there.

I found a Stack OverFlow answer that solved my dilemma. A poster there recommended doing this:

git revert –no-commit #######..HEAD (where ####### is the ID of the commit)
git commit -m “Commit message explaining what I just did”

This approach would revert all of the commits at once and re-create the state that had existed after the target commit. But it would not rewrite history by entirely removing old commits. Perfect.

Executing the Plan

First, in case something went wrong, I created a new branch with the old commit that I considered to be stable:

git checkout -b xcodestable #######
git push origin xcodestable

Then, reassured that I had a stable version stored on a separate branch, I switched back to the master branch and rolled it back to the old commit using the “git revert –no-commit” solution from Stack OverFlow:

git checkout master
git revert –no-commit #######..HEAD
git commit -m “Commit message explaining what I just did”
git push -u origin master

This seemed to work beautifully. But when I tried to run the plugin on my laptop, I encountered the same problems as before.

Into the Logs

Stymied in all other ways, I dealt with the situation I had in front of me and started logging messages to the console. I stepped through each process to see where things were going wrong.

To my surprise, the main problem appeared to be that many commands, after detecting the correct start point, were jumping into a method that adds items to an array. That method started with the word “Put “.

I had added case insensitivity to the plugin recently. That meant any text containing “put ” also would trigger the add-items-to-array method. For example, if the word “input” appeared anywhere in the code or comments, that would be a trigger. Whoops. I wasn’t sure why the case-insensitivity feature had worked perfectly when I first implemented and tested it, but it was breaking now.

I cleaned that up by making the command start point more specific (“Put item “) and built the program again. This time everything functioned. I tested every piece of functionality and then pushed it to the master branch:

git add –all
git commit -m “Functioning version”
git push -u origin master

Since everything was working, and the prior “stable” snapshot actually had not functioned correctly, I created a new stable branch from the functioning master branch:

git checkout -b xcode5stable2
git push origin xcode5stable2

Then I deleted the old, non-stable-after-all snapshot branch:

git push origin –delete xcode5stable
git branch -d xcode5stable

On to New Frontiers

At this point, the master branch functioned on my laptop and I had taken a snapshot (branch) of this stable state.

I still wanted to update the plugin for Yosemite and Xcode 6 GM functionality.

Unlike the last time, I decided not to do that on master. I created a new branch for testing new functionality, with the goal of merging it into the master branch once it verifiably worked on Mavericks and Yosemite:

git checkout -b newyosemite

Using the laptop, I opened the plist file as source code and added the Xcode 6 GM UUID. Then I built, re-tested every piece of functionality on the Mavericks laptop, and then pushed to the newyosemite branch.

git add –all
git commit -m “Now compatible with…”
git push -u origin newyosemite

Next Steps

The next step is to test this seemingly functional version on the test iMac with Yosemite. I’ll do that this weekend. I’m not sure if it will work, but I believe I found and fixed the major bug behind the wacky, unpredictable functionality. I also think I figured out what is causing another bug and have several ideas on how to make the code more robust.

My major takeaway is that no matter how small a project, better Git/GitHub practices are worthwhile. Specifically:

  • Preserve stable versions before major changes in a separate branch;
  • Make new changes in a separate branch before merging those changes into master; and, possibly most importantly:
  • Test ALL pieces of functionality before pushing or merging anything to branch master. Don’t just do spot tests.