<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Tech @ Careem - Medium]]></title>
        <description><![CDATA[From the tech team at Careem - Medium]]></description>
        <link>https://medium.com/careem-tech?source=rss----94b5af9ed755---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Tech @ Careem - Medium</title>
            <link>https://medium.com/careem-tech?source=rss----94b5af9ed755---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 30 May 2026 17:38:18 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/careem-tech" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[A Week of Learning Agile Development]]></title>
            <link>https://medium.com/careem-tech/a-week-of-learning-agile-development-1975062b3b97?source=rss----94b5af9ed755---4</link>
            <guid isPermaLink="false">https://medium.com/p/1975062b3b97</guid>
            <category><![CDATA[code-retreat]]></category>
            <category><![CDATA[team-activities]]></category>
            <category><![CDATA[agile-development]]></category>
            <category><![CDATA[refactoring]]></category>
            <dc:creator><![CDATA[Lamak Qaizar]]></dc:creator>
            <pubDate>Thu, 14 Jan 2021 15:52:24 GMT</pubDate>
            <atom:updated>2021-01-14T15:52:24.138Z</atom:updated>
            <content:encoded><![CDATA[<p>Away from the hustle of production work, we organised a series of team activities to grow our agile development capabilities. Each full-day of activity was themed:</p><ul><li>Day 1 — Refactoring</li><li>Day 2 — Code Smells</li><li>Day 3 — Testing Legacy Code</li><li>Day 4 — Simple Design</li><li>Day 5 — Mob Programming</li></ul><p>We kicked off each day with a book reading activity. Reading was intertwined with discussion and was followed by a <strong>coding kata </strong>— an exercise that reinforced learning by practice.</p><p>A short retrospective meeting to gather reflections and learnings brought each activity to a close.</p><p><em>Learning Week</em> was held remote-first on Zoom and all activities were group-based —i.e. reading and programming in either one large group or several smaller teams. For these smaller groups, we used Zoom’s breakout rooms feature.</p><h4>Want to run these activities for your team?</h4><p>If participants are not familiar with Pair Programming &amp; TDD, consider including relevant introductions. Participants in our case were a budding XP-team with a year of practical experience.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Zo5wYn_ZDFI26SEM5VAYTA.jpeg" /><figcaption>Refactor cat. Photo by Zainab Jalali</figcaption></figure><h3>Day 1 — Refactoring</h3><ul><li>Group-reading: <strong>Design II — Refactoring</strong> from <em>Agile Technical Practices Distilled. </em>While reading, participants discovered heuristics such as Object Calisthenics &amp; duplication, and techniques to refactor (Safe Refactoring &amp; Parallel Change).</li><li>Participants were introduced to <strong>5 atomic refactors:</strong> (1) <em>Rename, (2) Extract, (3) Inline, (4) Move, (5) Safe Delete</em>. A look-up table was provided with keyboard shortcuts for reference.</li><li>Kata: <a href="https://github.com/emilybache/Yatzy-Refactoring-Kata">Yatzy Refactoring Kata</a></li></ul><p>A few thought-provoking excerpts from <strong>Chapter 2: Principles in Refactoring </strong>of <em>Refactoring: Improving the Design of Existing Code</em> were shared with participants through the day:</p><blockquote>“But doesn’t the time I spend on refactoring reduce the speed of development?”<br>“How to tell a manager about refactoring?”<br>“Refactoring can be a fantastic tool to help understand a legacy system …”</blockquote><h3>Day 2 — Code Smells</h3><p>Participants added Code Smells to their refactoring tool-kit.</p><ul><li>Group-reading: <strong>Chapter 3: Bad Smells in Code </strong>from <em>Refactoring: Improving the Design of Existing Code</em>, followed by <strong>Design III — Code Smells</strong> from <em>Agile Technical Practices Distilled</em>. Participants discovered the catalogue of refactoring recipes in Martin Fowler’s book.</li><li>Kata: <a href="https://github.com/AgileTechPraxis/CodeSmells">Smelly Tic-Tac-Toe</a> — participants used the following commit convention: [code smell] message, for e.g. [primitive obsession] wrapped float as Amount.</li></ul><h3>Day 3 — Testing Legacy Code</h3><p>Tests were already written for coding exercises on previous days. Day 3 asked the question: What if we don’t have tests?</p><ul><li>Group-reading: <strong>Chapter 1: Changing Software </strong>and<strong> Chapter 2: Working with Feedback </strong>from <em>Working Effectively with Legacy Code</em>, followed by <strong>Testing Legacy Code </strong>from <em>Agile Technical Practices Distilled</em>.</li><li>Kata: <a href="https://github.com/jbrains/trivia">Ugly Trivia Game</a> — writing a Golden Master test.</li></ul><h3>Day 4 — Simple Design</h3><p>Besides introducing the principles of Simple Design, we set out to build a habit of experimentation &amp; improvement.</p><blockquote>“After deleting and starting again enough times, I’ve often heard people say they have a feeling of freedom they’ve not experienced before.” — Corey Haines</blockquote><ul><li>Group-reading: <strong>Good design?</strong> and <strong>4 Rules of Simple Design</strong> from <em>Understanding The Four Rules of Simple Design</em>, followed by <strong>Classic TDD I</strong> and <strong>Classic TDD II</strong> from <em>Agile Technical Practices Distilled</em>.</li><li>Kata: 4 sessions of <a href="https://www.coderetreat.org/facilitators/gameoflife/">Conway’s Game of Life</a>, 45 minutes each. This followed the <strong>Code Retreat</strong> format: code was thrown away &amp; pairing partners switched after each session.</li></ul><h4>Constraints</h4><p>Participants were given a constraint in each session to break out of habitual code &amp; design practices.</p><ul><li>Session 1 — TDD, driver/navigator rotation in five minutes (or less)</li><li>Session 2 — ≤ 3 lines per method, no variable reassignment</li><li>Session 3 — Evil mute ping/pong. One person is a test-redder, and the other a test-greener. The test-greener does not care about requirements and will get tests to pass any which way. Partners cannot talk to each other.</li><li>Session 4 — No if/else, no loops, no getters (Tell, Don’t Ask principle)</li></ul><p>We adapted constraints after each session based on progress. More constraints can be found on <a href="https://www.coderetreat.org/facilitators/constraints/">coderetreat.org</a>, along with a <a href="https://www.coderetreat.org/facilitators/facilitation/">facilitation guide</a>.</p><h4>Reflections</h4><ul><li><a href="http://cyber-dojo.org/">Cyber-Dojo</a> allowed for a low overhead pair programming experience, i.e. no IDE quirks, no git commands and a simple way to throw away code by closing a browser tab. The downside was the lack of refactoring support. We switched to an IDE with git for our last session.</li><li>Groups may require a nudge to follow a constraint or discover an insight during sessions. We started with 1 facilitator and 4 pairs, before shifting to 2 mobs in the last session. The last session yielded better engagement between facilitator and groups.</li></ul><h3>Day 5 — Mob Programming</h3><p>Participants chose what to do on the final day: refactoring the <a href="https://github.com/jbrains/trivia">Ugly Trivia Game</a> from Day 3.</p><p>A single mob formed with five to eight members throughout the day. Driver/navigator roles rotated every five minutes, with a primary-navigator selected to avoid overwhelming the driver. Drivers would be rotated into the primary-navigator role.</p><p>We experimented with <a href="https://mob.sh/">mob.sh</a> for quick handovers. It turned out to be a nifty tool: keeping time and managing the sequence of drivers.</p><p>Code changes were deleted at the end of each rotation if tests were not green, encouraging participants to use safe refactors.</p><h3>Book references</h3><ul><li><a href="https://leanpub.com/agiletechnicalpracticesdistilled">Agile Technical Practices Distilled</a> <em>by Pedro M. Santos, Marco Consolaro, Alessandro Di Gioia</em></li><li><a href="https://martinfowler.com/books/refactoring.html">Refactoring: Improving the Design of Existing Code</a> <em>by Martin Fowler</em></li><li><a href="https://www.google.com/search?q=working+effectively+with+legacy+code">Working Effectively with Legacy Code</a> <em>by Michael C. Feathers</em></li><li><a href="https://leanpub.com/4rulesofsimpledesign">Understanding the Four Rules of Simple Design</a> <em>by Corey Haines</em></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1975062b3b97" width="1" height="1" alt=""><hr><p><a href="https://medium.com/careem-tech/a-week-of-learning-agile-development-1975062b3b97">A Week of Learning Agile Development</a> was originally published in <a href="https://medium.com/careem-tech">Tech @ Careem</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Transforming the way customer disputes are resolved at Careem]]></title>
            <link>https://medium.com/careem-tech/transforming-the-way-customer-disputes-are-resolved-at-careem-f31434b81e87?source=rss----94b5af9ed755---4</link>
            <guid isPermaLink="false">https://medium.com/p/f31434b81e87</guid>
            <category><![CDATA[extreme-programming]]></category>
            <category><![CDATA[mpb]]></category>
            <category><![CDATA[lean-startup]]></category>
            <category><![CDATA[lean-product-development]]></category>
            <category><![CDATA[bpm]]></category>
            <category><![CDATA[customer-service]]></category>
            <dc:creator><![CDATA[Mohammad Urwah]]></dc:creator>
            <pubDate>Sun, 29 Nov 2020 12:56:33 GMT</pubDate>
            <atom:updated>2020-11-30T10:58:12.590Z</atom:updated>
            <content:encoded><![CDATA[<p><em>How the Care Engineering team revolutionised the way customer disputes are resolved. This is just the beginning of our journey to simplify the lives of our customers, captains and colleagues.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*HSwBMfRCeUcvGtVW" /></figure><p>At Careem, our Care agents resolve thousands of interactions everyday. These interactions involve over 100+ different contact reasons. A customer (here customer refers to a user — a captain, customer or a merchant) can contact us pre, post or in ride and naturally, each of these contact reasons has a different resolution. The wide variety of contact reasons are both different in terms of the investigation as well as the actions taken to resolve the contact.</p><p>When I joined Careem, back in 2018, I visited one of our call centres to understand how our care agents resolve a contact. That visit made me realise the number of manual steps that were being done were very high. Some agents had calculators open on their desktops to recalculate the ride fare. New agents had to go through documents to understand how to resolve an issue which they were solving for the first time. Only the highly experienced Care agents were made to receive calls from customers as they had the investigation and resolution steps fully memorised. To escalate an issue to the supply team they had to write an email or create a Jira ticket. At this point, you might be wondering if the handling time was skyrocketing? Well yes, it was.</p><p>Being a Care agent is a hard job especially when the other person is reaching when they are most unhappy with a service or situation. They have to make sure the customer is happy by the end of the interaction. They have to make sure that customer satisfaction (CSAT) remains high, handling time remains low and incase of payment adjustments they are just giving the right amount to the customer — enough to keep both customer and Careem happy. By mid-2018, we made a goal to simplify the lives of our Care agents and provide fast and consistent resolution to our customers.</p><p>It was not that we didn’t have a portal, we did. That portal allowed them to see customer details, trip details and even to perform payment adjustments on customer accounts. The problem was that it was a generic web-app with all the information that the agent might need. But the steps required to resolve a contact were embedded into the brains of our agents. We wanted to embed those steps into an app which would guide them towards a resolution. We wanted to create a resolution engine.</p><p>And so we started our journey to simplify the lives of our agents. We wanted to come up with an MVP and launch it as soon as possible. More importantly we wanted to gather feedback of our agents if the product really helped them and then iterate on it.</p><p>We experimented with the Lean Startup methodology. And we wanted to think of the fastest way to empower our agents. The goal was to simplify Care agents life by guiding them on every step.</p><h3>Lean Product Management</h3><p>Our team came up with the idea of using Google Forms in an iframe inside our web app. When I first heard of the idea, <strong>it sounded bizarre</strong>. As a junior software engineer out of university, I was new to the idea of Lean Product Management. I wanted to deliver complete features and as quickly as possible. And so I questioned why are we using Google Forms when we can create flows and forms inside our web app. My PM calmed me down and assured me that we will definitely iterate over it and improve.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/477/0*72FtypzxgAPhE9Fu.png" /><figcaption>The build, measure and learn loop</figcaption></figure><p>Google Forms helped us in policy adherence as well. It ensured that every agent was following the same steps to resolve the same problem and that there was no personal sentiment involved. We gradually started rolling it out. Not only our Care agents were satisfied but our quality &amp; other metrics started to improve. QA agents found a way (via Google Form responses) to validate the steps taken by the Care agents and ensure that the resolution provided was correct and followed Careem expectations. In about three months, we launched 20+ category flows on Google Forms. It was not only Google Forms, we started displaying the relevant trip and customer related relevant information beside it as well.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/421/0*_ha7LhfIqp2TtVsO" /></figure><h3>Google Forms had its limitations</h3><p>The data filled by our agents was not easily accessible. Trivial questions like trip related information and basic customer information had to be filled manually. Policies change based on cities, car types, customer segmentation, customer LTV and so on. These are all things which our ecosystem (100’s of microservices) already know and so there was no point in asking an agent to fill this trivial information to reach a resolution. There was limited automation possible inside Google Forms. We could auto populate the form sections but we couldn’t skip those forms. And so we decided to move away from Google Forms.</p><p>The first iteration allowed us to understand the problem context further. We wanted to create something not only for our agents but also for our business operations team as well. We wanted to give them the ability to change resolution policies on the fly with little to no tech involvement. That sounded really hard to do when we thought about it at first. Embedding business policies in code is easy, if they seldom change. In our case, policies changed very often (1–2 changes every week in one flow). If you consider encoding 20+ different flows then it sure seems like a lot of work to do. Below is an example of how does a contact resolution policy looks like:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/451/0*BFkjyMvZQc8qt8x_" /></figure><p>It’s a flow chart. One way to embed this policy is by using conditional statements in code. But this was not a viable option as we wanted to minimise tech involvement. Another more dynamic way to implement this is by encoding this policy on a BPM engine. We researched on the available open source BPM’s available. After careful consideration we chose <a href="https://flowable.com/open-source/">Flowable</a> due to its community support. This time it was an experiment for our tech ops team. We wanted to know if Flowable was the right tool for them and that they were comfortable enough to create and modify business policies in it?</p><h3>Migrating away from Google Forms</h3><p>It was challenging at first. Coming from a stable solution like Google Forms to an open source tool seemed like a tough decision, but we took a leap of faith. As a POC we migrated one of our google forms to flowable app. We utilised API’s exposed by flowable SDK’s and built a service on top of it. We then migrated 2–3 more flows. Everything worked fine in the beginning. We were doing about 50k+ transactions on Flowable everyday. As data grew in Flowable database the API’s started getting slower. We suffered a few hiccups on the way. In order to truly reap the benefits of an opensource tool you need to dig deeper and understand its internal working as well. It turned out that there were missing indexes on the database side. We raised it with the Flowable team and got them added in their source code.</p><p>Currently we have around 20+ resolution flows on Flowable and we are scaling it as I write this. Now our goal is to introduce automated machine tasks in the BPM process to reduce the average handling time of each resolution and remove those trivial questions that I outlined above.</p><h3>Reflection</h3><p>As I look back on the past two-year journey, I realise that we have travelled so far. Not only in-terms of making our agents lives easier but also evolving as a true agile team.</p><p>When we started this journey, we had a design sprint to decide on what we are going to build and we created wireframes, prototypes and what not about what out final web-app would look like. It looked great as a prototype, but the thought of implementing that prototype burdened us. Being introduced to lean startup methodology made our lives a lot easier. We have started experimenting a lot more. If we are not sure of something, we make that available to our Beta agents. To validate our hypothesis, we measure the impact using analytical tools like Google Analytics and finally, we iterate over it.</p><h3>Learnings</h3><ul><li>A feature can never be fully complete. There is always room for improvement. Its in the hands of the user to decide which improvement is more important than the other. So reduce the scope, launch soon, gather feedback and then iterate over it.</li><li>To truly understand what your user wants, sit with them while they are working on the problem you want to solve. If possible, shadow and role play as a user as well. This way you understand the problem in users shoes.</li><li>Tech debt keeps growing and growing. New features have some monetary benefits attached to them and so they will always have higher priority. The way we deal with tech debt is by incrementally reducing it with new features. When we have to implement a feature on a piece of code with huge tech debt, we first refactor the code and then implement the feature on it. Incremental refactoring is always helpful and keeps the code clean over the long run.</li><li>Open source tools give you a huge boost and enable you to launch quickly and experiment if the intended functionality is beneficial to the users or not.</li><li>Writing tests increased our confidence on the code we wrote. If we didn’t have enough time, we reduced the scope of the feature but ensured that we wrote quality code.</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f31434b81e87" width="1" height="1" alt=""><hr><p><a href="https://medium.com/careem-tech/transforming-the-way-customer-disputes-are-resolved-at-careem-f31434b81e87">Transforming the way customer disputes are resolved at Careem</a> was originally published in <a href="https://medium.com/careem-tech">Tech @ Careem</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[For managers: How to carry out a caring Reduction in Force]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/careem-tech/for-managers-how-to-carry-out-a-caring-reduction-in-force-d5f99038b4c7?source=rss----94b5af9ed755---4"><img src="https://cdn-images-1.medium.com/max/1132/1*2FXUcOTuYNGY7cHWvEspLA.png" width="1132"></a></p><p class="medium-feed-snippet">Due to COVID-19, our industry was impacted significantly which meant Careem had to carry out a reduction in force after exhausting cash&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/careem-tech/for-managers-how-to-carry-out-a-caring-reduction-in-force-d5f99038b4c7?source=rss----94b5af9ed755---4">Continue reading on Tech @ Careem »</a></p></div>]]></description>
            <link>https://medium.com/careem-tech/for-managers-how-to-carry-out-a-caring-reduction-in-force-d5f99038b4c7?source=rss----94b5af9ed755---4</link>
            <guid isPermaLink="false">https://medium.com/p/d5f99038b4c7</guid>
            <category><![CDATA[experience]]></category>
            <category><![CDATA[careem]]></category>
            <category><![CDATA[layoffs]]></category>
            <category><![CDATA[management]]></category>
            <category><![CDATA[reduction-in-force]]></category>
            <dc:creator><![CDATA[Mohamad Charafeddine]]></dc:creator>
            <pubDate>Thu, 14 May 2020 12:55:37 GMT</pubDate>
            <atom:updated>2020-05-14T12:55:37.049Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Crisis, Replication and A/B Testing]]></title>
            <link>https://medium.com/careem-tech/crisis-replication-and-a-b-testing-4368fa3afe8d?source=rss----94b5af9ed755---4</link>
            <guid isPermaLink="false">https://medium.com/p/4368fa3afe8d</guid>
            <category><![CDATA[replicability-crisis]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[analytics]]></category>
            <category><![CDATA[a-b-testing]]></category>
            <category><![CDATA[hypothesis-testing]]></category>
            <dc:creator><![CDATA[Richard J Brooker]]></dc:creator>
            <pubDate>Mon, 04 May 2020 11:52:33 GMT</pubDate>
            <atom:updated>2021-04-01T08:45:58.113Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YBwZNzNHhWzU6GBMoFtcDQ.png" /><figcaption>Reptiles — <a href="https://www.google.com/search?q=M.+C.+ESCHER&amp;stick=H4sIAAAAAAAAAOPgE-LUz9U3MC4xS09W4gAxTQ1z87Rks5Ot9Msyi0sTc-ITi0r0gbg8vyjbCkhnFpcsYuXx1VNw1lNwDXb2cA3awcoIAANzpRdIAAAA&amp;sa=X&amp;ved=2ahUKEwj76OnarZLpAhUhzoUKHbuDApoQmxMoATAiegQIDRAD">Maurits Cornelis Escher</a></figcaption></figure><h4><em>The ‘Reproducibility Crisis’ is common knowledge in the scientific community. Most businesses, however, haven’t even begun to recognise the problem.</em></h4><h3>Background</h3><p>“Science is in a methodological crisis” — this seems to be a common sentiment among academics.</p><p>In a survey of 1,500 researchers, 70% of them said they had failed to replicate another scientist’s experiment <a href="https://www.scientificamerican.com/video/is-there-a-reproducibility-crisis-in-science/">[1]</a>. In a 2009 study, 14% of scientists admitted to personally knowing someone who had falsified results <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2685008/">[2]</a>. A 2019 meta-study of deep learning in recommendation systems suggested that less than 40% of papers were replicable <a href="https://dl.acm.org/doi/10.1145/3298689.3347058">[3]</a>. Countless other studies have gone on to confirm similar findings.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HsUpFdwzR1bYeOk3eb_2_w.png" /><figcaption>Survey of 1,576 researchers [<a href="https://www.nature.com/news/1-500-scientists-lift-the-lid-on-reproducibility-1.19970">https://www.nature.com/news/1-500-scientists-lift-the-lid-on-reproducibility-1.19970</a>]</figcaption></figure><p>These findings have been extremely demotivating for researchers, especially anyone working in Social Sciences and Psychology at the time. It has weakened the position of Science in the public sphere.</p><p>What&#39;s not talked about is how incredible this realisation is, and how far ahead the Scientific Community is in identifying these problems. Most of the private sector hasn’t even begun to recognise the issue or understands its relevance.</p><p>A lot of analytical work in businesses is bizarre and senseless. Too often, employees deploy subtle scientific tools with a superficial understanding. The result is a vast waste of time, energy, and money.</p><h4>Introduction</h4><p>In this article, I&#39;m going to talk about some of the lessons we are learning from academic researchers, and highlight some of the things we can do to improve analysis, experimentation, and A/B testing in our companies.</p><h3>1. Stop Incentivising Bad Practises</h3><p>In many companies, your promotion/remuneration/commission is directly or indirectly linked to the results of an experiment you are running. I understand the motivation for this, however, it incentivises false reporting and lazy analysis, and doesn’t reward exploration and risk-takers.</p><h3>2. Education</h3><p>Most business leaders don’t know what a significance test is or understand why statistical analysis is important.</p><p>Statistical Analysis can drastically change the results of your findings. For example, let&#39;s look at this revenue data for an e-commerce site.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*B-W7XG8FKM2mkQbYrmhTmA.png" /></figure><blockquote>&gt; SELECT cohort, AVG(revenue) FROM revenue_table GROUP BY 1 ;<em><br></em>cohort, AVG(revenue) , COUN(custoomer_id)<br>treatment, 14.01 , 5723<br>control, 13.75, 5721</blockquote><p>On face value, it would appear the treatment group had an increase in revenue.</p><p>However, after filtering outliers and plotting confidence intervals you can see, if anything, there is a negative impact for the majority of users.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oOaEi7aIEkBWJ88xKT2Utg.png" /><figcaption>Distribution plot of average revenue per user. Estimated using bootstrapping.</figcaption></figure><p>The variance of your metrics can we very high, especially if you are involved in both B2B and B2C sales.</p><h3>3. Peer Reviews</h3><p>Pair programming, replicability studies, and cross-department validation can help you understand if your methods and findings are valid.</p><h3>4. Understand P-hacking</h3><p>P-hacking is a collection of ways you can distort your analysis, by collecting or selecting data or statistical analyses until nonsignificant results become significant. Common examples are the early stopping of A/B tests and selective reporting,</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*7dm2ddsjGUld0ndfqsu2qA.png" /><figcaption>A graph showing the z-score for 1000 A/B test simulations. The tests are terminated when the z-score reaches statistical significance. The result is a false-positive rate of 17%, three times higher than the intended 5%. [<a href="https://www.aarondefazio.com/tangentially/?p=83">https://www.aarondefazio.com/tangentially/?p=83</a>]</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vCnXXH39IGR4rgq6bo1d_A.png" /><figcaption>Evidence of selective reporting. It suggests there is a difference between p-values in the abstract compared to the p-values in the results section of research papers. [<a href="https://www.researchgate.net/figure/Evidence-for-p-hacking-across-scientific-disciplines-A-Evidence-for-p-hacking-from_fig8_273463561">https://www.researchgate.net/figure/Evidence-for-p-hacking-across-scientific-disciplines-A-Evidence-for-p-hacking-from_fig8_273463561</a>]</figcaption></figure><p>For an entertaining discussion on the P-hacking check out <a href="https://www.youtube.com/watch?v=0Rnq1NpHdmw">Last Week Tonight with John Oliver.</a></p><h3>5. Don’t Confuse your Experiment Unit and Observation unit</h3><p>A common mistake people make when running an A/B test is creating a test split on users but then treating more granular data as your independent observations.</p><p>Take a look at this conversion data. Users have been placed into random control and treatment groups.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Fl1caOiYxQHwlwmXKZc-KA.png" /><figcaption>Conversion data for 430,311 sessions and 97,245 users.</figcaption></figure><p>Often, the analyst’s first instinct is to model this as independent Bernoulli trials.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PlKCMhbPGqkcfheRBEFS3Q.png" /><figcaption>Smaple mean distribution of Bernoulli trials. P(control&gt; treatment) = 93%.</figcaption></figure><p>However, because the split is at a user level, the data is more like a power distribution.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*H9HjMMrlN3yj1EVIP6jRPw.png" /><figcaption>Histogram of the number of conversions per user.</figcaption></figure><p>By treating sessions as<a href="https://en.wikipedia.org/wiki/Independent_and_identically_distributed_random_variables"> <em>i.i.d </em></a><em>we had tricked ourselves into thinking we had more data and less variance than we do. </em>The ‘real’ confidence intervals are much wider than our initial assumption had us believe.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Qh7J_Or4e5B7_w7Vk4xFpQ.png" /><figcaption>Distribution plots using user bootstrapping, P(control&gt; treatment) = 67%.</figcaption></figure><p>The results are no longer statistically significant (which is good, as this was a random A/A test with no difference between control and treatment).</p><h3>6. Make Sure Your Test Has Enough Power</h3><p>Whether you are doing a Hypothesis test or calculating confidence intervals, you need to know what kind of impact you are able to measure and how likely you are to recognise it.</p><h3>7. Deduction vs Induction</h3><p>Deductive reasoning moves from idea to observation, while induction moves from observation to the idea. Both are important types of scientific reasoning.</p><p>Always think about your hypothesis and theory behind the observations you are seeing. Often having a valid theory is more important than the observations themselves.</p><h3>8. Careful Calculating Rates</h3><p>For example, if your treatment increases the number of users you see, then you might see a drop in revenue per user, even though total revenue is increased.</p><p>Try to look at sums and totals when possible.</p><h3>9. Become a Bayesian</h3><p>It&#39;s likely you are using Bayes Theorem and prior distributions already. But to really make use of the Bayesian paradigm look into Thompson Sampling.</p><p>PyData has a helpful introduction to Thompson Sampling <a href="https://www.youtube.com/watch?v=wcCSAbcj5Q0">https://www.youtube.com/watch?v=wcCSAbcj5Q0</a>.</p><h3>10. Random is Rarely Enough</h3><p>A common issue in testing is &quot;Pre-Experiment Bias&quot;. This is when, by chance, your control and treatment have a pre-existing difference. This dramatically reduces the statistical power of your tests.</p><p>Solutions are strategised sampling and propensity matching. There are more details on the subject in these posts:</p><ul><li><a href="https://engineering.thumbtack.com/repeated-rerandomization/"><em>https://engineering.thumbtack.com/repeated-rerandomisation/</em></a></li><li><a href="https://blog.twitter.com/engineering/en_us/a/2015/detecting-and-avoiding-bucket-imbalance-in-ab-tests.html"><em>https://blog.twitter.com/engineering/en_us/a/2015/detecting-and-avoiding-bucket-imbalance-in-ab-tests.html</em></a></li><li><a href="https://dataorigami.net/blogs/napkin-folding/17987495-the-class-imbalance-problem-in-a-b-testing"><em>https://dataorigami.net/blogs/napkin-folding/17987495-the-class-imbalance-problem-in-a-b-testing</em></a></li><li><a href="https://eng.uber.com/xp/"><em>https://eng.uber.com/xp/</em></a></li></ul><p>However, the conversation around this topic is often ill-defined. Sometimes its talked about as a solution to measuring significance, however, it shouldn’t affect the validity of your significance test, only its power.</p><h3>11. Don’t Trust Blog Posts</h3><p>There is a large industry around testing, particularly in A/B tests. It&#39;s estimated that the global A/B Testing Software Market to Reach US$1,081M by 2025.</p><p>Claims-makers love to point out problems they can provide solutions to. Try to remember that what you are reading is a piece of self-promotion, not academic material.</p><p>Much of the language in online significance calculators is vague and doesn’t clarify what your observations are or how the test needs to be constructed, e.g:</p><ul><li><a href="https://neilpatel.com/ab-testing-calculator/">https://neilpatel.com/ab-testing-calculator/</a></li><li><a href="https://abtestguide.com/calc/">https://abtestguide.com/calc/</a></li><li><a href="https://www.surveymonkey.com/mp/ab-testing-significance-calculator/">https://www.surveymonkey.com/mp/ab-testing-significance-calculator/</a></li></ul><h3>12. Don’t Filter</h3><p>As soon as you put a filter on your data (e.g filtering users who didn’t make it past a certain point in the conversion funnel), the test is no longer a randomised experiment.</p><h3>13. Filter Outliers</h3><p>Filtering outliers can help improve the power of your significance test. Keep in mind these outliers might need to be analyzed separately.</p><h3>14. Multi Comparison</h3><p>If you are doing multi-variant testing you might need to correct your P-values, (e.g .<a href="https://en.wikipedia.org/wiki/Multiple_comparisons_problem">Bonferroni Correction</a>). The more variants you have, the higher the chance of a false positive.</p><h3>15. Be Aware of Network Effects</h3><p>If you’re testing in a marketplace or social network, it is likely that the effect on your treatment will have consequences on the control. For this, you will need a network segmentation, a time-based test, or geo-spatial segmentation.</p><p>Lyft has some posts on the problem, <a href="https://eng.lyft.com/experimentation-in-a-ridesharing-marketplace-b39db027a66e">https://eng.lyft.com/experimentation-in-a-ridesharing-marketplace-b39db027a66e</a></p><h3>16. Bootstrapping</h3><p>Finding the right closed-form solutions for confidence-intervals/hypothesis tests is nuanced and difficult. It can require years of experience and a deep understanding of statistics.</p><p>Bootstrapping is an easy and intuitive alternative for calculating a probability distribution and confidence intervals.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/850/1*K_FLh1_IIwbdb_-vzhzTDg.gif" /><figcaption>Example of calculating bootstrap distributions through sampling with replacement.</figcaption></figure><h3>17. Increase Transparency</h3><p>Always share your code, data, and methodology.</p><p>Adopt a coding convention when sharing code. ‘Papers With Code’ provide a useful checklist for this, <a href="https://medium.com/paperswithcode/ml-code-completeness-checklist-e9127b168501">https://medium.com/paperswithcode/ml-code-completeness-checklist-e9127b168501</a>.</p><h3>18. Be Wary of Time Based Tests</h3><p>Time-based switching is when your alternate versions of your app/website/etc based on hourly windows.</p><p>The number of observations you have is the number of time windows — this is usually very small. You will need very large shifts in metrics in order to see any statistical significance.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6PL9QM2GmACDBAoMhyWIBA.png" /><figcaption>Results of a time-based A/A test simulation. It shows you would need a 2% increase in conversion rate to be sure of any statistical significance.</figcaption></figure><h3>19. Check Tracking</h3><p>Often with new app releases come improvements in tracking. This will affect what kind of metrics you can compare.</p><h3>Conclusion</h3><p>This article is far from extensive. Each experiment is its own piece of analysis with 100 different pitfalls each time.</p><p>Do not underestimate how difficult experimentation is.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4368fa3afe8d" width="1" height="1" alt=""><hr><p><a href="https://medium.com/careem-tech/crisis-replication-and-a-b-testing-4368fa3afe8d">Crisis, Replication and A/B Testing</a> was originally published in <a href="https://medium.com/careem-tech">Tech @ Careem</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Reflections on my first couple of months at Careem]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/careem-tech/reflections-on-my-first-couple-of-months-at-careem-4db415ab08f7?source=rss----94b5af9ed755---4"><img src="https://cdn-images-1.medium.com/max/1920/1*V6NjrF9vqpcWj-mdowFJxA.jpeg" width="1920"></a></p><p class="medium-feed-snippet">Reflections on the blitzscaling rocketship journey of Careem to become the Middle East first $B tech company &amp; the sustainable path&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/careem-tech/reflections-on-my-first-couple-of-months-at-careem-4db415ab08f7?source=rss----94b5af9ed755---4">Continue reading on Tech @ Careem »</a></p></div>]]></description>
            <link>https://medium.com/careem-tech/reflections-on-my-first-couple-of-months-at-careem-4db415ab08f7?source=rss----94b5af9ed755---4</link>
            <guid isPermaLink="false">https://medium.com/p/4db415ab08f7</guid>
            <category><![CDATA[culture]]></category>
            <category><![CDATA[reflections]]></category>
            <category><![CDATA[scale]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[change]]></category>
            <dc:creator><![CDATA[Mohamad Charafeddine]]></dc:creator>
            <pubDate>Sun, 12 Jan 2020 11:19:43 GMT</pubDate>
            <atom:updated>2020-01-18T18:00:49.359Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Careem appoints three tech leaders to help achieve Vision 2022]]></title>
            <link>https://medium.com/careem-tech/careem-appoints-three-tech-leaders-to-help-achieve-vision-2022-691f726690c1?source=rss----94b5af9ed755---4</link>
            <guid isPermaLink="false">https://medium.com/p/691f726690c1</guid>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[tech-leaders]]></category>
            <dc:creator><![CDATA[Adam J Gonçalves]]></dc:creator>
            <pubDate>Thu, 26 Sep 2019 12:06:28 GMT</pubDate>
            <atom:updated>2019-09-26T12:09:01.809Z</atom:updated>
            <content:encoded><![CDATA[<p>Careem is often thought of as a tech company but they recognise that people are their most valuable asset.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*S-O6LKLKOTOonjseYcVfwA.gif" /></figure><p>And now, building a stronger tech team is more important than ever before. Careem’s 2022 vision is to become the regions everyday super app. To make this vision a reality, Careem has been searching for the best leaders with the right expertise to support the scaling and reliability of ride-hailing.</p><p>Careem has appointed three senior tech leaders in its ride-hailing domain over the past few weeks: Moin Moinuddin, Reno Marioni and Mohamad Charafeddine.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/82/1*yTQJTgtSx_F9igCUmdCWJQ.png" /><figcaption><strong>Moin Moinuddin </strong>VP Engineering (Ride Hailing)</figcaption></figure><p>Moin Moinuddin will lead engineering for Careem’s ride-hailing domain. Prior to Careem, Moin was the product and engineering leader at Tesla, based in the United States. At Tesla, he was responsible for leading global ecommerce, POS and its payments platform to enable a worldwide frictionless commerce experience for Tesla customers.</p><p>Before that, Moin spent close to 20 years in senior tech-leadership positions across Microsoft, Dropbox and Visa. Moin started his professional career as a developer where his first big achievement after graduation was developing a POS system that is still used by Starbucks around the world.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/82/1*dogSP171TBt_dY7h-11G0w.png" /><figcaption><strong>Reno Marioni </strong>Senior Product Director (Marketplace)</figcaption></figure><p>Reno joined Careem as Product Director for Marketplace in Berlin. Before joining Careem, Reno was the Chief Product Officer for Moovel, now known as ReachNow, the Mobility-as-a-Service arm for the Daimler/BMW Mobility joint venture, where he led product and design teams.</p><p>Prior to this, he served as the Senior Director of Digital Products &amp; Services at BMW Group, where he led digital service innovation for the BMW Connected Car ecosystem in Munich, Germany. Marioni was influential in spearheading the transformation of BMW into the connected car digital services across all consumer touch points. He also worked at HERE Technologies, Nokia, and founded his own startup.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/82/1*XtPkusVlmCbiQNylOxTxdw.png" /><figcaption><strong>Mohamad Charafeddine </strong>Senior Product Director (Trust, Safety and Integrity &amp; Care)</figcaption></figure><p>Mohamad will be heading Product for Trust, Safety and Integrity and Care. He recently relocated from Silicon Valley, where he worked on Core ML for business integrity at Facebook to classify and enforce on all ads content in order to reduce personal, financial, sentiment, and societal harms.</p><p>Prior to that, he headed product strategy and execution for the applied AI R&amp;D lab at Samsung SDS Research America, where he led applications of Reinforcement Learning and Deep Learning in multiple domains such as digital marketing, healthcare, and manufacturing. He was part of the founding team for a Stanford spin-off startup, ASSIA, where he built big data mining software to diagnose and optimize entire access networks for telecommunication service providers with 100M households under management.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=691f726690c1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/careem-tech/careem-appoints-three-tech-leaders-to-help-achieve-vision-2022-691f726690c1">Careem appoints three tech leaders to help achieve Vision 2022</a> was originally published in <a href="https://medium.com/careem-tech">Tech @ Careem</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to setup RDS Replication across AWS accounts]]></title>
            <link>https://medium.com/careem-tech/how-to-setup-rds-replication-across-aws-accounts-408314aff9b8?source=rss----94b5af9ed755---4</link>
            <guid isPermaLink="false">https://medium.com/p/408314aff9b8</guid>
            <category><![CDATA[mysql]]></category>
            <category><![CDATA[rds]]></category>
            <category><![CDATA[replication]]></category>
            <category><![CDATA[careem]]></category>
            <category><![CDATA[aws]]></category>
            <dc:creator><![CDATA[Khurram Naseem]]></dc:creator>
            <pubDate>Wed, 31 Jul 2019 09:38:07 GMT</pubDate>
            <atom:updated>2019-07-31T09:55:04.109Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aJTn85mYMKyJpHWbCGyA3Q.jpeg" /></figure><p>Every day, engineering teams are working tirelessly to solve problems and more often than not, this means choosing between the best of many possible solutions. When we share our approaches to technical problems, we hope to fast track this process for our teams.</p><p>Recently, Careem’s DataOPS team was tasked with the migration of a database from one AWS account to another with minimum downtime. Here you will find the specific steps we took to set up a live RDS MySQL replication across AWS accounts.</p><p>The same approach can also be applied to set up production account data for testing in another AWS account like QA. When you are testing on live data, sensitive information must be scrubbed by adding database triggers on the QA account.</p><blockquote>Note: We have tested this functionality on AWS RDS MySQL 5.7 and it works.</blockquote><p>Let’s suppose you have a database named DB1. For the sake of clarity, the accounts will be referred to as “Account A” and “Account B”.</p><p>Do the following task on On Account A.</p><ul><li>Create one new exclusive VPC Security group to be used in new read replica. Let&#39;s name it <strong>sg_share_RDS</strong>.</li><li>On “DB1”, run following to make sure binlog files there for at least 24 hours.</li></ul><pre>call mysql.rds_set_configuration(‘binlog retention hours’,24);</pre><ul><li>Create new RDS Subnet Group, with at least two public subnets attached to this subnet group, let’s name it “share_rds_subnet”.</li><li>Create new Read Replica from database “DB1” with port 3316(or any nondefault port i.e. 3306).</li><li>Set Public access to ‘Yes’ and assign Subnet Group “share_rds_subnet” to Read Replica. Also, enable auto backup on this new read replica.</li><li>Assign security group <strong>sg_share_RDS</strong> to newly created read replica &amp; Allow port 3316 to your VPN Security group to make a connection to this read replica.</li></ul><p>Lock every database user in the new read replica, after switch off (read_only=0) in read replica parameter group, we prefer you also have exclusive DB parameter group for newly created read replica. After locking down all users, create one database user that is exclusively used for replication with a tough password. For example</p><pre>GRANT REPLICATION SLAVE ON *.* TO &lt;your_user&gt;@&#39;%&#39; IDENTIFIED BY &lt;your_password&gt;;</pre><p>Run below command</p><pre>SHOW SLAVE STATUS; </pre><p>And check <em>seconds_behind_master</em> must be <strong>zero</strong>. on a newly created read replica. Make sure the newly create read replica is ready and fully synced with the master. Now do the following steps.</p><p>Stop replication on read replica by calling</p><pre>CALL mysql.rds_stop_replication().</pre><ul><li>Run following command on stop read replica and save values of (<em>Master_Log_File</em> , <em>Read_Master_Log_Pos</em>) to use it later.</li></ul><pre>SHOW MASTER STATUS;</pre><ul><li>If you are on Mac run <em>dig</em> &lt;your stop read replica endpoint&gt; note down the public IP address.</li><li>Take a snapshot of a read replica in account “A” and share snapshot to other AWS account “B” from AWS console.</li><li>After share snapshot restores RDS snapshot in AWS account (“B”) make sure you also have designated security group and subnet group (with at least two public subnets) on the target AWS account.</li><li>Once a snapshot is restored and available, connect to it and run the following commands. Now run <em>dig</em> &lt;newly created RDS endpoint in account “B”&gt;</li></ul><p>Get the public IP address of newly created RDS in account “B” and allow this IP in account “A” ( source DB ) security group to connect on the port which you defined for your read replica. This means only this IP (from the account “B”) can connect to source DB in account “A”.</p><p>Now run following in your target DB in account “B”.</p><pre>CALL mysql.rds_set_external_master(&lt;Public IP Address of stop Read Replica&gt;, &lt;port of read replica&gt;, &lt;username&gt; , &lt;password&gt; , Master_Log_File,Read_Master_Log_Pos, 1);</pre><pre>CALL mysql.rds_start_replication();</pre><p>Now run following command</p><pre>SHOW SLAVE STATUS; </pre><p>on newly created DB in the account “B” and check if its successfully connect to its master database (The read replica on AWS account “A”).</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=408314aff9b8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/careem-tech/how-to-setup-rds-replication-across-aws-accounts-408314aff9b8">How to setup RDS Replication across AWS accounts</a> was originally published in <a href="https://medium.com/careem-tech">Tech @ Careem</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Careem Tech profile: Engineering under the hood]]></title>
            <link>https://medium.com/careem-tech/careem-tech-profile-engineering-under-the-hood-530fc59c716b?source=rss----94b5af9ed755---4</link>
            <guid isPermaLink="false">https://medium.com/p/530fc59c716b</guid>
            <category><![CDATA[middle-east]]></category>
            <category><![CDATA[tech]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[careem]]></category>
            <dc:creator><![CDATA[Matthew David Pomroy]]></dc:creator>
            <pubDate>Thu, 04 Jul 2019 06:05:48 GMT</pubDate>
            <atom:updated>2019-07-04T06:05:48.260Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wC6X8DwgXVwoVUrK7oVy5Q.jpeg" /></figure><p>Careem is increasingly playing a big part in the region’s digital future, through our technology, infrastructure, and our diverse and talented people. We thought you might like to hear from one of the tech team who is helping make this happen and learn more about what goes on at Careem. Ivan Belfinger is one of our backend software engineers…</p><p><strong>What exactly do you do at Careem?<br></strong>I’m a backend software engineer, which means I work with things that are under the hood. You know when you use the Careem app and you see all those nice things? Well, I work on all of those other things that are going on behind them. I’m part of “New Categories” team, and currently working mostly with a fun problem called pooling; how to efficiently match multiple customers in a single car.</p><p><strong>What technologies are you working with specifically?<br></strong>Java, Python, AWS, Dynamo DB, Redis and some of the other industry standard tools. We’ve just been playing around with OR Tools, this is really fun. We’re using this to solve real-life problems such as vehicle routing issues — how to route the vehicle for as little cost as possible whilst maintaining high customer service. This is why I love working for Careem, we get to work and experiment with the newest and latest technologies and we are not limited to legacy software.</p><p><strong>What does your typical day involve?<br></strong>My day usually involves a lot of coding, reviewing other people’s code and talking to other teams. Our current tasks demand a lot of inter-team collaboration, and that has been super fun. My day is interrupted here and there by a few meetings and interviews. Apply for a job in Careem, and I might be one of the first people from the team that you meet!</p><p><strong>What were doing before you joined Careem?<br></strong>I’m slightly ashamed to say I was working for a very boring company — a bank. The environment there was painfully slow. Something I really love about being part of a tech start-up now, is how different it is.</p><p><strong>So what inspired you to join Careem?<br></strong>Dubai was part of the attraction, for sure, but Careem is the biggest tech company in the region so that was my key motivation — I knew that I would get to work on the latest and best tech innovations in the region.</p><p><strong>What motivated to choose this career in the first place?<br></strong>As a child my dad worked with AutoCAD, one day my dad brought home an old machine his company was throwing away. I was only six years old and my brother was 10 years old, and he gave us a screwdriver and said start playing. That is how both my brother and I are now Software Engineers. It runs in the family.</p><p><strong>What drives you at Careem?<br></strong>What I like about Careem is that we enable low-income individuals to create their own futures and opportunities for themselves and their families. By becoming a Captain with Careem they are changing their lives and we are helping to do this. We are having a huge impact in the region. The culture here is also really good — it’s very multicultural with over <a href="https://blog.careem.com/en/diversity-in-tech/">70 nationalities at Careem overall and around 50 in the tech team</a>. Everyone is super open to talking and helping each other. In Careem you are never the smartest person! Sometimes this makes me feel bad, but it’s great that I’m constantly learning every day.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=530fc59c716b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/careem-tech/careem-tech-profile-engineering-under-the-hood-530fc59c716b">Careem Tech profile: Engineering under the hood</a> was originally published in <a href="https://medium.com/careem-tech">Tech @ Careem</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Careem Tech profile: Creating the customer experience]]></title>
            <link>https://medium.com/careem-tech/careem-tech-profile-creating-the-customer-experience-b2823cb8c7cd?source=rss----94b5af9ed755---4</link>
            <guid isPermaLink="false">https://medium.com/p/b2823cb8c7cd</guid>
            <category><![CDATA[product-management]]></category>
            <category><![CDATA[tech]]></category>
            <category><![CDATA[careem]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Matthew David Pomroy]]></dc:creator>
            <pubDate>Tue, 18 Jun 2019 05:34:03 GMT</pubDate>
            <atom:updated>2019-06-19T05:26:05.605Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*p9yGn0_xTm0aOhPHebU7kw.jpeg" /></figure><p>As Careem enters Chapter 2 and expands into platformisation, we are increasingly playing a big part in the region’s digital future, through our technology, infrastructure, and our diverse and talented people. We thought you might like to hear from some of our tech people who are making this happen to learn what they do and how they got into this line of work.</p><p>Asma Alyamani — Lead Product Manager</p><p><strong>What do you do at Careem?<br></strong>I lead product for the customer ride-hailing experience at Careem. We are the voice of the customer. We understand their wants and needs, and build products to simplify their lives. We are obsessed with creating the best experiences for our customers across all touch points in their journey, primarily on our iOS and Android apps.</p><p><strong>How big is your team?<br></strong>We are a team of seven product managers, 40 engineers and three product designers.</p><p><strong>And you’re responsible for creating a roadmap for the entire customer-facing product?<br></strong>Yes, and each product manager on the team owns a different part of the customer journey. For a particular problem space or product, there is a dedicated team of engineers, designer and a product manager who are jointly responsible for defining their priorities and goals, and delivering value for our customers. For example, we have teams dedicated to payments, locations, and acquisition to name a few.</p><p><strong>How did you start at Careem?<br></strong>I joined almost four years ago. Careem was much smaller back then, and the product team was only three or four people. I started as a country product manager for Saudi Arabia, focused on getting strong product-market-fit for Saudi by building a deep understanding of both our customers and captains, figuring out what their biggest needs are and finding ways to solve them.</p><p>I did that for about a year, then shifted into the customer product management role where I worked on a few different products before more recently leading it overall.</p><p><strong>How is the customer app different from market to market?<br></strong>Some things are standardised across markets and some are localised. One of the primary features of our product which differs in each market is the set of services available. If you open the app anywhere you still maintain that familiarity with the Careem experience, but the services available in that market are completely localised. In Dubai, for example, we have Dubai Taxi, Economy, Business, First Class and so on. In Karachi, we have Bikes and Rickshaws which aren’t available in Dubai. It’s important to have this flexibility to offer the most suitable products for customers’ needs in each city.</p><p>Another feature that’s localised is Careem Rewards, our loyalty program. You earn points for each Careem ride you take, and can then use your points to give back to those in need or take free rides. Depending on where you open the app, you’ll see a different set of rewards that you can redeem. In Dubai, for example, we’ve partnered with Dubai Cares so you can use your points to provide education for underprivileged children, whereas in Riyadh we’ve partnered with the local charity Disabled Children’s Association which you’ll see as a reward if you use the app there. The vision is to keep growing this library of rewards and be highly connected to the local ecosystem in each market.</p><p><strong>How did you get into product management?<br></strong>Through Careem, actually. My Bachelor’s degree is in computer science so I was always close to tech. I studied at the University of Pennsylvania in the United States, then did an MBA at Stanford. While I was there, I got exposed a lot more to entrepreneurship and the tech ecosystem, and I did my summer internship at Zendesk. My role was product analytics working directly for the product manager leading their data products — that was how I first got exposed to product management.</p><p>When I graduated I decided to come back to the region because I felt like I could have more impact here. I was introduced to the Careem co-founders and immediately decided to join because Careem’s mission really resonated with what I wanted to do.</p><p><strong>What does your typical day involve?<br></strong>A core part of my role involves dealing with people, whether it’s relationship building, stakeholder management, collaborating with engineers or having one-to-ones with my team members.</p><p>To build the best experiences for our customers, we need to understand what are their pain points and needs. And given the diversity of our customer segments in our different markets, which vary substantially, it’s important to spend talking to colleagues in the city teams who are on the ground and closest to our customers to get an understanding of what’s happening as well as talking to customers.</p><p>Similarly we need to align with stakeholders in different functions to make sure we are working together on the same strategy and mitigate any risks and dependencies on each other. We need to be aligned on the vision of where we’re going, what needs to be done and then building the right products with the optimal priorities.</p><p>I would say 50–60 percent of my time goes there. Another 10–20 percent translating this into our product strategy and vision. The remaining time is spent looking at our organizational structure and how to enable the right environment to provide teams with enough autonomy to deliver. This also means constantly iterating on our product processes, what we’re building, and working with the team to conceptualise new ideas and share feedback on some of the experiences that we’re working towards.</p><p>We do design critiques on a weekly basis as well as product feedback sessions where a product manager would come and present something they’re working on to the rest of the product team to get insights, which helps them improve it. Generally, we have a very collaborative way of working and a lot of my time is spent working with people.</p><p><strong>What’s been the most successful feature you’ve introduced?<br></strong>Packages has been an incredibly successful product for us, and this is a product which Careem innovated in so it’s not something that’s been done before. We started by targeting the commute segment in Saudi, and have since evolved into various use cases. We offer two types of packages that customers can buy: ride packages and KM packages. For ride packages, the value proposition is that a customer pays upfront to save on their rides — by getting a discount on each ride — with access to priority customer support. With KM packages, customers buy a bundle of kilometres which enables them to pay one upfront payment for their upcoming rides at a discounted rate. They also benefit from no peak and other surcharges.</p><p>Our customers love using packages and it’s helped tremendously with the stickiness of our platform. We are focusing on further improving the package experience and addressing some of the current frictions, like being able to purchase a package with cash.</p><p>We also launched Careem Rewards which has been a great success for us, and our customers love it! Similar to packages, we are determined to make this even better for customers.</p><p>We just keep iterating and evolving.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b2823cb8c7cd" width="1" height="1" alt=""><hr><p><a href="https://medium.com/careem-tech/careem-tech-profile-creating-the-customer-experience-b2823cb8c7cd">Careem Tech profile: Creating the customer experience</a> was originally published in <a href="https://medium.com/careem-tech">Tech @ Careem</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Break the Monolithic Database]]></title>
            <link>https://medium.com/careem-tech/from-monolithic-to-microservices-database-bdf7094d8457?source=rss----94b5af9ed755---4</link>
            <guid isPermaLink="false">https://medium.com/p/bdf7094d8457</guid>
            <category><![CDATA[database]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[monolith]]></category>
            <dc:creator><![CDATA[Khurram Naseem]]></dc:creator>
            <pubDate>Wed, 22 May 2019 12:25:52 GMT</pubDate>
            <atom:updated>2019-05-23T09:59:26.684Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*T62rTMntSJ2pDoLHPN8B5w.jpeg" /></figure><p>Monolithic applications are increasingly being replaced with smaller, more easily maintainable, components or services that communicate with each other to accomplish the same task in a more efficient manner.</p><p>As services are separated from each other, it becomes easier to identify distinct services that are highly utilized and scale those services independently of the whole application.</p><p>Storing data from different domains in a single database has an additional side effect that should not be underestimated. It creates dependencies between different services/domains on a DB schema level. A breaking change on the schema level - e.g. changing the data format of a column — will have a ripple effect through the whole system, ultimately requiring a synchronous change and production deployment of all dependent subsystems. Finding these subsystems, however, is almost impossible as the database often doesn’t provide a reliable way to track those dependencies. Again, this significantly impacts the new feature development as it makes broader and high quality refactoring impossible.</p><p><strong>Data isolation within the existing database</strong></p><p>There is actually a way to approach the split safely using only master-slave replication. The idea is to split/isolate the data within the originating database itself (Main DB). This can be achieved by restricting the MySQL database users.</p><p>For example, the Services “A” data had to be split out of Main DB. So a Services “A” DB user was created and this DB user was restricted to read/write only to the Services “A” data tables. Similarly, all other DB users (one by one) had their access to the Services “A” data tables denied.</p><p>This is a long process that includes extensive monitoring for system abnormalities, because when a DB user (e.g. Services “B” user or Services “C” user) has the access cut, then the service that is using this user might suffer from lack of privileges in case it directly or indirectly (though joins) uses Services “A” tables.</p><p>If abnormalities are detected the user should have their access immediately restored. The process, however, helps with identifying and fixing of rogue services which directly use the Services “A” data tables. Needless to say, the service that is going to have its user access cut from Services “A” tables should have it’s code base thoroughly examined prior to the exercise. In summary, the process will be:</p><ol><li>List all database users.</li><li>Identify the user that with high confidence doesn’t use directly the Services “A” tables</li><li>Cut the access to Services “A” tables to that user.</li><li>Carefully monitor the system for abnormalities.</li><li>If an abnormality is found immediately restore the DB user access, investigate and fix the reason and go to step 3.</li><li>Successfully eliminated the access of the selected user to the Services “A” tables. Go to step 2. for the next user until all users except the</li><li>Services “A” user has their access denied.</li></ol><p>In the end, other users have their access to Services “A” tables cut, we can safely say that the Services “A” data is now <strong>private </strong>to the Services “A”. In other words, even though the data is still residing in the Main DB we have the process of extracting a microservice completed. The next logical step, of course, is to migrate this data to a new database i.e. reap the benefits of having a microservice by changing its data storage. This is now easy, the process is the following:</p><p>1, Create a Main DB read replica (this will be the new master database for microservices).<br>2. Wait for zero replica lag i.e. all data has been replicated.<br>3. Create read/write user in the replica exclusive for the new service<br>4. Reconfigure all DB reads to go to the new read replica. <br>5. Stop the new Services “A” i.e. all writes to the old DB.<br>6. Reconfigure all writes to go to the new read replica.<br>7. Wait for zero DB lag. Promote the read replica as a new master node.<br>8. Start the new service.</p><p>At a later stage, we can remove the irrelevant tables from the newly promoted database and same we can do to the old master database remove tables which we have migrated to the newly promoted database.</p><p>This is a simple two-step process, where first we restrict services on a set of tables after defining table ownership by using database privileges model and at a later stage, we just create a slave database for data migration.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bdf7094d8457" width="1" height="1" alt=""><hr><p><a href="https://medium.com/careem-tech/from-monolithic-to-microservices-database-bdf7094d8457">How to Break the Monolithic Database</a> was originally published in <a href="https://medium.com/careem-tech">Tech @ Careem</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>