My journey at Coinbase

October 4, 2024

views

I started working at Coinbase on January 2022, so that accounts for a total of 2 years and 8 months! I'm documenting my IC4 journey here, so I can look back and see how much I've grown. πŸš€

Everything in here is my personal experience and opinion.

Starting out πŸ‘£

I was previously working at a small startup called Z1 β€” a fintech for Brazilian teenagers that offers a bank account app with a Mastercard debit card. I was one of the first hires there, primarily working on their React Native app.

The journey from design to launch was super fast, as you would expect in a startup environment, so I got the chance to wear many hats and learn a lot of new things. At some point, we got into YCombinator and started to see exponential growth both in users and teammates. I was working remotely from BrasΓ­lia, DF while most of the engineering team was in SΓ£o Paulo, SP. I realized it was time to seek bigger challenges.

I'm into cryptocurrencies and blockchain technology. At the end of 2021 I started learning more about it based on the web3 boom. Coinbase was one of the companies that were hiring a lot of people and I thought it would be a good fit. I saw an opportunity on X - RIP Twitter in Brazil πŸͺ¦πŸ‡§πŸ‡· - about their team hiring engineers from Brazil and decided to apply. Turns out they were opening the "Coinbase Brazil LTDA" entity, hiring through CLT and paying base salary in Brazilian Reais (BRL/R$) along with RSU shares ($COIN on NASDAQ).

The interview process was pretty standard. I had 4 rounds of interviews:

  1. One pair programming to solve a React.js application failing unit tests locally.
  2. One pair programming implementing an order book for a crypto exchange with buy and sell buttons, along with a ledger transaction list (+/-). I did it using React Native. As preparation, I decided to recreate the Coinbase app landing page with sign in and sign up forms. The repository is open source and available here.
  3. One technical interview with a lot of system design questions using Excalidraw.
  4. One more interview with a manager.

Once I got the offer, I accepted it and started the onboarding process.

My role πŸ§‘πŸ»β€πŸ’»

  • Frontend work: joined to help rewrite the Coinbase Wallet app in React Native and also contribute to the Chrome extension development. Tech stack includes:
    • TypeScript
    • React & React Native
    • React Query for data fetching
    • CDS (Coinbase Design System) for UI components
    • Recoil & Jotai for global state management
    • Jest & React Testing Library for unit testing
    • Detox & BrowserStack for E2E testing
  • Some spot-on backend work: after a lot of time contributing to the frontend, I asked to help with some backend development. I did some minor worksteams in microservices such as WAAS - Web3 Asset Aggregator Service for consolidating asset data info from multiple providers such as Coingecko, Coinmarketcap and others, helping with a refactor to avoid having to redeploy the service in order to pickup config changes. I also helped with backend library wallet/common documentation, decomposing README into separate docs. Tech stack includes:
    • Golang
    • Postgres for relational data
    • MongoDB for non-relational data
    • SQS for message queue
    • Redis for cache
    • gRPC for microservices communication
    • Docker for containerization
    • Kubernetes for orchestration
  • PR reviews: I was known for being very thorough with my reviews, which helped my peers a lot, catching bugs and edge cases early. I did that by enforcing manual review instructions in PR descriptions, git checkout to the branch or downloading one-off builds, and manually testing changes.

What I've built 🚒

  • react-navigation scaffolding: Coinbase Wallet navigation setup in apps/rn, including TabNavigator and StackNavigator, as well as basic deeplinking setup. At that time, we were using react-navigation v4. It was later updated to v5 and then to v6.
  • Common ESLint config within monorepo: we first started with yarn workspaces at wallet/wallet-mobile repo and then the infra team switched to NX; as one of my first challenges, I pulled out the common config for linting across our monorepo and put it in a separate package workspaces/libs/eslint-config.
  • Onboarding flow: as one of my first feature assigned tasks, I worked on the import and create wallet screens. I had to deal with security concerns because recovery phrases were being asked and displayed at onboarding. I had to disabe clipboard hijacking and screen recording on those sensitive screens. The flow was quite complex, I've mapped out a state machine here for it here. After some time, there was another effort to implement instant onboarding, reducing the amount of clicks from ~10 to nearly 2. Oh, it also have a warm welcome that displays a pretty lottie animation.
  • Decentralized ID onboarding: an IC5 eng from the identity team was on PTO, so I was assigned to build the screens for claiming your .cb.id username, which is a lightweight version of ENS with really cheap gas fees, so we offer this for free to users during onboarding. Coinbase recently launched basenames to the public. Say hello to renan.base.eth!
  • Terms of Service and Privacy Policy: a legal requirement for users to acknowledge. Most boring thing ever to implement, but someone has to do it. And that someone was me. At first, I thought about not breaking the DRY principle by rendereing a pre-existing TOS page within a webview, but due security reasons, I had to keep a copy of the page in our app. Make sure you don't freeze the app on startup when implementing a fullscreen modal takeover ( Ν‘Β° ΝœΚ– Ν‘Β°)
  • A/B experiments to improve funding rates: NFT incentives that were delivered once the first funding was completed, CTAs to launch the buy flow on different parts of the app, etc.
  • One click buy flow on CBPay (at pay.coinbase.com): built a buy flow at payments/onramp-widget which is a repo from another internal team called CBPay (recently renamed to Coinbase Onramp). This flow was presented inside Wallet via webview.
  • Buy flow: one of the core features of the app. It's a complex flow that involves geo checks, amount input, asset, network and payment method selection, quote fetching, execution, KYC checks, 2-step verification, deeplinking, Coinbase account connection and A LOT of edge cases πŸ˜΅β€πŸ’«. Standarized with an useLaunchBuyFlow hook and React context based OnrampContext. I was not the main author of this flow, but I contributed to it significantly. Present on the following platforms:
  • MeshConnect integration: a vendor that allows transfers from different exchanges such as Binance, Robinhood, etc. It included the implementation of their RN SDK into wallet/wallet-mobile, and a backend proxy service at wallet/payment-provider-aggregator to inject the API key and secret values into request headers as per advice of their docs and our app security team.

Lessons I've learned 🧠

  • Efficient execution: I've improved my ability to prioritize tasks and manage my time effectively, ensuring that projects are completed on schedule without compromising quality. This involved planning and estimating accordingly, executing tasks with consistency and think critically across all execution steps.
  • Clear and proactive communication: I learned the importance of articulating ideas and feedback clearly to both technical and non-technical stakeholders. This includes regular updates, setting clear expectations, and being open to feedback, which helps in aligning team efforts and achieving common goals.
  • Being a team player: collaborating with diverse teams taught me the value of empathy and active listening. I learned to appreciate different perspectives and contribute positively to team dynamics, fostering an environment where everyone feels valued and motivated.
  • The importance of thorough testing: ensuring the reliability and stability of software through rigorous testing became a key focus. I adopted best practices in unit, end-to-end and manual testing, which helped in catching bugs early and maintaining high-quality code.
  • Written planning of work and communication/feedback: documenting plans and feedback through Project Proposal Solution (PPS) and Technical Design Document (TDD) systematically improved my workflow and leveled up my writing skills. This practice not only helped in tracking progress and identifying areas for improvement but also ensured that all team members were on the same page, reducing misunderstandings and enhancing productivity.

Things I like πŸ‘

  • Working with great and smart people: the team is composed of highly skilled professionals who are always willing to share knowledge and collaborate on challenging projects.
  • Crypto-forward environment: being at the forefront of the cryptocurrency industry, I have the opportunity to work on innovative projects that push the boundaries of what's possible in the digital finance space. They also offer education budgets through Learn&Develop (L&D) programs, as well as the CryptoU university initiative.
  • Well-known product: working on a product that is recognized and trusted globally provides a sense of pride and responsibility, knowing that my contributions impact millions of users.
  • U.S. company: they offer a diverse and inclusive work culture, with exposure to international markets and practices. I got the opportunity to visit USA πŸ‡ΊπŸ‡Έ for the first time to attend ETHDenver 2024 and team offsites in San Francisco. Base is for everyone
  • Remote-first: flexibility to work from anywhere allows for a better work-life balance and the ability to manage personal commitments effectively.

Areas for improvement 🌱

  • Opportunities for new challenges: I thrive when faced with new and diverse challenges. Continuously exploring different approaches and stepping out of the comfort zone can lead to significant personal and professional growth.
  • Work-life balance: balancing work with personal life is crucial. Finding ways to disconnect and recharge, especially when working across different time zones, can enhance overall well-being and productivity.
  • Career advancement: clear and structured paths for promotions and raises can motivate employees to strive for excellence. Regular feedback and recognition play a key role in career development.
  • Consistent management support: having consistent and supportive management can greatly impact an employee's growth. Specific and constructive feedback helps in understanding areas of improvement and achieving career goals.
  • Streamlined processes: while a startup mindset encourages innovation, streamlining processes and reducing bureaucracy can help maintain a fast-paced and efficient work environment. Don't ask for permission, just ship ΰΌΌ ぀ β—•_β—• ༽぀

What's next? πŸ’­

I am excited about the future and looking forward to new opportunities where I can leverage my skills and experiences. I am particularly interested in roles that offer a remote-friendly environment, a good work-life balance, and a culture that values innovation and continuous learning. I am open to positions that focus on web, mobile, or backend development. If you know of any opportunities that align with my interests and expertise, please feel free to reach out to me. I am eager to contribute to a team that is passionate about building impactful products and pushing the boundaries of technology. πŸ˜‰