Character.AI

Domando el teclado

Unirme a una app con millones de usuarios y unificar el manejo del teclado como mi primera gran contribución.

A lo largo de mi carrera, siempre he construido cosas de 0 a 1. Desde el principio. Armar la arquitectura del proyecto, prototipar en baja/alta fidelidad, pasar por el proceso de construcción y, finalmente, llegar a prod. Esa era mi especialidad (y lo sigue siendo), pero en ese momento también era una limitación.

Así que me uní a c.ai. Millones de usuarios, millones de dispositivos. Una comunidad construida alrededor de una app que llevaba años siendo la mayor app de chat con IA. Nada de Expo, solo React Native puro. Un backend que ni siquiera me atrevía a ejecutar localmente. Una jerarquía ya establecida en cuanto a quién era dueño de qué en el codebase.

Y ahí estaba yo, ante el difícil dilema de querer que me valoraran por lo que valen mis habilidades, algo que en el pasado siempre me había funcionado para destacar entre mis compañeros el nivel de software que era capaz de construir, y a la vez hacer todo lo posible por no cagarla por completo desde el principio.

Entonces, ¿cómo lo hice?

En mis primeras dos semanas, me limité a hacer cosas pequeñas en el codebase (como se debe, para entender qué está pasando realmente, el típico proceso de onboarding) mientras empezaba a identificar los dolores de cabeza de ese codebase enorme.

El primero que detecté tenía que ver con el manejo del teclado. En ese momento estábamos en pleno proceso de crear una nueva interfaz de chat, renovando por completo todos los sistemas que existían en la versión legacy. Eso significaba que los componentes de manejo del teclado eran una maraña de componentes que intentaban resolver el manejo del teclado de ambos chats, además de implementaciones personalizadas para tener keyboard avoiding views en los bottom sheets legacy, en los nuevos bottom sheets (los de gorhom), modals, formularios, scrollviews y lo que se te ocurra.

Era una pesadilla.

Entonces empecé a proponer React Native Keyboard Controller como nuestra source of truth para el manejo del teclado. A la gente le gustó la idea, así que me puse a trabajar en ello.

Resulta que no tenía ni idea de cuántas partes de la app tocaba el manejo del teclado y, aunque estuviera mirando el código y colocando el reemplazo, era una pesadilla averiguar cómo llegar a esa pantalla, y cómo saber de verdad a qué pantallas se podía llegar realmente o si eran código legacy abandonado. En esa época no existían los GitHub stacks, así que estuve atrapado en un rebase hell durante bastante tiempo, intentando no desviarme de mi tarea mientras también intentaba limpiar las pantallas legacy que iba encontrando.

Luego, tras exactamente un mes de revisiones con mucho ir y venir, pruebas, 45 commits y miles de LOC's, logramos lanzarlo. Tuvimos algunas regresiones en cosas pequeñas después del lanzamiento, pero nada grave como romper prod por completo.

Para la comunidad no fue tan notable, pero en cuanto a DX fue una mejora increíble que siguió generando valor incluso un año después del lanzamiento de la renovación del chat. Con el tiempo, también toqué un montón de partes de la app relacionadas con esta renovación del chat, y nosotros (el equipo de chat) logramos hacer una mejora increíble en la función principal de la app.

AntesEl chat anterior: burbujas oscuras simples, calificaciones con estrellas bajo la última respuesta y una barra de mensajes básica.
DespuésEl chat renovado: burbujas translúcidas sobre un fondo ilustrado a pantalla completa, con controles de voz y de reacciones.
El chat, antes y después de la renovación.