Blog

  • Cooked

    I’ve been reading Michael Pollan’s Cooked and watching the Netflix show. This is my favorite line from the book:

    Easy. You want Americans to eat less? I have the diet for you. Cook it for yourself. Eat anything you want–just as long as you’re willing to cook it yourself.

    There’s a very similar line in the show too:

    Eat anything you want. Enjoy all of your food. Anything you want. You want apple pie? Have a whole apple pie tonight. You want cookies with that apple pie? And ice cream with that apple pie? I’ll allow you to eat all the cookies, all the ice cream, and all the pie you can have tonight. I’m just gonna ask you to do one thing. Make all of them. Make the apple pie, make the ice cream, make the cookies. And you know what I know is gonna happen? You’re not having apple pie, ice cream, or cookies tonight.

    Image Credit: Justin making an apple pie by Justin Leonard on Flickr.

  • Upgrading Dependencies on a Django Website

    Our website has been running Django 1.6 since it was built in 2014. Django has moved on to newer versions since then. I’ve been contemplating updating it, but never found enough time. At one point, we decided to scrap the Django website and move to WordPress. Eventually, the convinience of Django won over. This mean, I had the unenviable task of upgrading Django. It took about a good 2 weeks of work in total. I took a few breaks to solve problems that I ran into. Here’s a sort of summary of problems I’ve found and how I solved them.

    Django-CMS is only compatible with Django 1.8 and not Django 1.9. I didn’t catch it the first time. That was my first mistake. After that, I pinned it to the latest version of Django 1.8.

    We were using South and I had to convert from South to Django’s migrations. When I did this migration, I got a traceback from Django-CMS at the python manage.py migrate --fake-initial step. Turns out one of those migrations needs to faked. So, I ended up doing this:

    python manage.py migrate --fake-initial cms --app python manage.py migrate --fake cms 0002_auto_20140816_1918 python manage.py migrate --fake-initial cms python manage.py migrate --fake-initial 

    We had a custom submenu plugin. This just plain stopped working. Turns out Django CMS made a few backward incompatible changes causing this breakage. This caused most pages to plain fail. It took me a long time to realize I should turn off all the plugins and enable them one at a time to discover the failure. The traceback in this instance didn’t help me pinpoint the error at all!

    We shipped a bunch of dependencies with our code instead of installing the plugin. A few plugins had blocker bugs, which we fixed in our “fork”, and shipped. The bugs were now fixed in the plugin and we could remove the in-code forks and just use them as dependencies. This bit was annoying but not too painful. Once I removed them from the code, we had a lighter footprint for our code and easier path to upgrades.

    This took me about one full month of work on and off. I would often run into problems. I forced myself to take a break when I was stuck. It often made me think of different approaches to the problem at hand. I’ll be handing over this codebase to someone else soon, and I’m much happier at the state I’m leaving it. It’s better than what it used to be when I started. After all, that’s pretty much what our job is, right?

  • New Delhi Marathon 2016

    On Sunday, I finished my first marathon, New Delhi Marathon, in 5:47:13. It was 42.195 km of fun, pain, and runner’s high. If the bib numbers are sequential in order of registration (I suspect they are), I’m the 8th person to register for the full marathon. That’s how excited I was about a full marathon right in heart of Delhi. The criticism in this post is because we want you to do better next year. You guys managed great things for the first edition and we’d love to see a better event next year.

    From the onset, the quality of this race would depend on its route. Having it pass through some of the major landmarks of Delhi was great. You guys pulled this one off, hats off to you. Extra points for the course being AIMS-approved.

    At the start of the race, there were a good number of race marshals and police; they stopped traffic and guided us. This was a great feeling. The people in cars and bikes on the route were cheering us on too!

    Rocking on Vandemataram Marg

    From about the 30K mark or so (at 9 am), I only saw three aid stations with water. The rest of them seem to have run dry and the volunteers were just sitting in chairs and chatting. To be clear, until this point, the race marshals and police were extremely helpful and cheery. As I was preparing for the race on Saturday night, I decided I’d rather carry extra weight than not have water. In retrospect, that was the best decision I’d made. My advice to fellow runners, when in doubt, carry your own hydration.

    The website seemed to say that roads would reopen by 11 am but I’m pretty sure we were navigating traffic around 9 am. I understand that this is not in your control, but an early warning would have been nice. What could have been in your control though is having route markers and/or race marshals until 11 am. This did not happen, as far as I could see.

    As my first marathon, I’m not happy with the last 2 hours (12.2K) of the race. This is when I was reaching my breaking point, which is my fault, thanks to less than ideal training. This is also when the support from the race organizers dwindled much less than what I expected. It took me 2 hours to complete the remaining 12.2K. I look forward to the next edition where I can better my own time at the New Delhi Marathon. I hope the organizers will also give me a better experience.

  • Poor UX Hurts Your Customers

    Poor UX Hurts Your Customers

    On Sunday, I had to make a bunch of visits across town and I figured it would be a good chance to book a Zoomcar. I’ve used them in the past and they’ve had good customer service and cars in great condition. This time though, I had a terrible experience with their app and customer service, even after being escalated.

    Zoomcar changed their polices in the last month or so. Originally, charges for extension of a booking would be deducted from the security deposit. Now they’d like their customers to make a payment immediately. However, the app UX is flawed, especially for customers who’ve used the app before. I would expect their customer service to handle this situation delicately, especially for customers who’ve used the previous policy and haven’t noticed the new one, but they failed that as well.

    This is where their developers made a mistake: I booked a car from 4:30 pm to 8:30 pm. At about 7:00 pm or so, I extended the trip to 9:30 pm. I got a dialog box that said my extension was successful, exactly like in the past. That false success message is a mistake. It should have told me an extension is available if I made a payment in the next 10 minutes. After pressing the “OK” button in the dialog box, it shows me that I have outstanding amount. In the previous versions of the app, I would see that as well. This amount would later get adjusted with the security deposit, so there’s no UX change in line with the policy change. To add to their UX woes, the app doesn’t let me finish a return check list about 20 minutes after the end of booking time. I would think that since there’s a check list for the fleet executive, keeping the member checklist available on the app until the fleet executive checklist is submitted sounds like a better policy.

    Now their customer service mistake: Anticipating this change of policy, when a customer fails to make a payment for an extension, they could call the customer reminding them the policy has changed and they need to make a payment to extend the booking. They failed to do this as well. At around 8:50 pm, when returning from my last stop, I realized it’d take us more than 40 minutes to get back to the drop off point and I thought I’d extend the booking once more to 10:00 pm. The app consistently showed me that my booking ended at 8:30 pm, so I called up customer care. This has happened in the past when I had a spot of bad network. The first representative told me that their policies have changed and I needed to make a payment for extension within 10 minutes or the extension would be reversed. According to him, the fact that they’ve shown the “Outstanding Amount” means that I should have known to pay it right then. I requested a one-off exception, but they offered nothing other than advice to head to the drop off point as soon as possible to avoid further late charges. I called them again and this time I had my call escalated. This person informed me that they had red color writing in the app that tells me I need to make a payment. I don’t remember seeing this, to be honest. But again, in light of the “confirmation” I got, I didn’t actually look at the app in detail. This person also told me that I needed to get back to drop off location as soon as possible to avoid further late fees. I figured I better head back and accept the late fees.

    The Ford Ecosport is a pleasure to drive

    While this was going on, my partner tweeted about this incident and a Zoomcar representative got in touch with us. As I was driving, my partner spoke to them, and this representative (Mr. Sashi) was understanding of the situation and offered us a solution – Please get to the drop off point, we’ll only charge the extension fees and waive the late fees. We reached the drop off location at around 10 pm, but took a bit to handover because of some mess with vehicles blocking the entrance to the location. I could not finish the checklist on the app, because I’d finished my ride according to it. Sigh. Perhaps their devs should actually use the app in all the use cases? I finished the checklist on the fleet executive’s phone and then waited to see the charges. I was charged 600 for the extension and 320 as the hourly charge. A bit later, when we got home the charges were corrected to only Rs 165, which is the charge for the extra distance. They charged us the lowest of the amount they could. Mr. Sashi called me to confirm that they’ve fixed the charges. I’ve given him some of this specific feedback and he mentioned that it’s already been forwarded to the development team. I hope in the days to come they fix both their app UX and customer service UX.

    We only got a solution to our problem because we tweeted about the problem and they were monitoring their Twitter account. Otherwise, I doubt we’d have come to a solution. The escalation personnel asked me to email my feedback rather than send it in themselves. Mr. Sashi, on the other hand, told me my feedback had already been forwarded to their development team. I sincerely hope it has.

    Image Credit: Ford EcoSport by Robert Basic on Flickr.

  • Yearly Review

    Yearly Review

    Success

    • Run: As I’ve written before, this year has been a spectacular success with running. I’ve run 800 km and I’ve just bought a cycle. Here’s to more exercise! This years goals are 2000 km of running, 3000 km of cycling, and to finish one full marathon.
    • Read non-fiction: I’ve read a few non-fiction books so far and they’ve been enlightening. This year, I’ll try to add reviews of books I read. I’ll be picking up a lot of books based on recommendation from Farnam Street Blog. This year’s goal is simple, for every 3 non-fiction books, I can read one fiction 🙂

    Not Quite Success

    • Learn C and JavaScript: I didn’t manage the time to squeeze this into my schedule. I did manage to build some things with JavaScript, so it’s a partial win. I will most probably abandon this in favour of learning Rust or Go.
    • Cut down servers: When you need automation for personal servers, you know it has gone too far. I’m back down to just two servers these days. This is how far I can go without causing serious outage to how I do things.
    • Study: I’m still yet to complete a MOOC course successfully. This one is a challenge for this year to go along with my actual studies.
    India Gate, my favorite part of Delhi

    New Challenges

    • Accounting: Last year, I finally got down to getting a regular accounting habit. This year, I’d like to push that to keeping accounts and sticking to budgets.
    • Cooking: I’ve been trying (and failing) to cook more and eat restaurant food less. I will be tackling this in a slow and steady manner 🙂
    • Android Development: I’ve been using Android for a while and I haven’t yet build anything for it. This year, I’ll be experimenting on building a few apps for personal use, nothing big for sure.

    Image Credit: Delhi, India Gate by Arian Zwegers on Flickr.