Hola a todos. Quiero compartir mi experiencia en el desarrollo de una biblioteca de código abierto, hablar sobre el proceso involucrado e inspirarlos a crear sus propios proyectos.
En primavera, mientras miraba una de las transmisiones de Yegor Bugaenko, me inspiró la idea del desarrollo de código abierto. Yegor afirmó que si quieres ir más allá de ser un desarrollador común y convertirte en un especialista más solicitado y único, necesitas crear algo propio. Ya sea un libro, un blog, una biblioteca o incluso un framework, este tipo de proyectos te permiten destacar entre muchos otros desarrolladores, especialmente en el mercado de TI actual. Esto no solo demuestra tu profesionalismo, sino que también demuestra un compromiso genuino con el desarrollo del campo.
Todo esto me hizo pensar: ¿cómo puedo realmente destacarme entre otros desarrolladores? A pesar de los años que llevo trabajando en TI y participando en varios proyectos, todavía no tengo nada propio, algo que pueda mostrar mi singularidad y profesionalismo.
Volví a revisar mis antiguos proyectos favoritos en GitHub, pero rápidamente me di cuenta de que ninguno de ellos era realmente importante. Así que decidí empezar desde cero y crear algo nuevo. Lleno de motivación y entusiasmo, comencé a pensar en lo que podría escribir que tuviera demanda, al menos entre un público pequeño, y que fuera acorde con mis habilidades.
Durante dos o tres días estuve analizando ideas para mi proyecto de código abierto. Cuanto más pensaba en ello, más me parecía que ya todo estaba escrito y que lo que faltaba por realizar sería imposible de lograr solo. Permítanme decirlo de inmediato: esta es una perspectiva engañosa. No dejen que destruya su potencial. Sí, ya se ha creado mucho, pero eso no es motivo para rendirse y abandonar la idea de crear algo propio.
Ahora voy a explicar por qué:
El aspecto más importante de crear algo nuevo es identificar un problema real y ofrecer una solución. Puede tratarse de un desafío global o de un problema pequeño pero significativo que se debe mejorar. Es fundamental comprender qué dificultades enfrentan otros desarrolladores o usuarios habituales y cómo se puede ayudarlos a superar esos desafíos.
Después de reflexionar un poco más, sentí el deseo de crear algo útil para la comunidad .NET: una pequeña biblioteca que pudiera facilitar el desarrollo de proyectos. Dado que mi principal interés es .NET, decidí concentrarme en lo que ya sé y hago bien. Una idea que se me ocurrió fue crear una biblioteca para realizar un seguimiento de los eventos de entrada del teclado y el mouse.
Un mes antes, mientras trabajaba en una aplicación de escritorio para Windows, me enfrenté a la tarea de rastrear las pulsaciones de teclas en el teclado para realizar ciertas acciones. El matiz principal era que tenía que funcionar independientemente de si nuestra aplicación estaba activa. Como no había soluciones listas para usar en ese momento, utilicé llamadas nativas de P/Invoke y logré con éxito el resultado deseado. En ese momento, no consideré que otros desarrolladores también podrían enfrentar este problema y que una pequeña biblioteca que abordara este problema podría ser bastante útil.
Sí, no es una biblioteca que cambiará la vida de nadie, pero es el primer paso para crear algo propio. Es una oportunidad de adquirir experiencia valiosa y dedicar tiempo a algo que realmente me apasiona, por eso decidí tomar acción.
El primer paso fue pensar en ideas sobre las funciones que tendría mi biblioteca. Quería que sus capacidades fueran lo más amplias posible y que al mismo tiempo fueran accesibles y fáciles de usar. Mi objetivo era que el usuario no tuviera que escribir más de 3 a 5 líneas de código en la mayoría de los casos.
Durante el proceso de lluvia de ideas, se me ocurrió la idea de que sería posible no solo rastrear la entrada, sino también controlarla. Por ejemplo, con código, se podrían simular pulsaciones de botones o combinaciones de teclas, mover el cursor del ratón, desactivar ciertas teclas para que el sistema no respondiera a sus pulsaciones o incluso cambiar las asignaciones de teclas. Todas estas funciones se implementaron gradualmente a través de actualizaciones.
Tan pronto como terminé el conjunto de características, comencé con entusiasmo el desarrollo. Escribir el código no fue particularmente desafiante, pero me concentré en su estructura y limpieza para que otros desarrolladores pudieran entender fácilmente lo que se hizo y por qué. Durante el proceso de desarrollo, realicé refactorización global varias veces, cambiando la organización y los nombres, así como extrayendo partes del código en clases separadas. Presté especial atención a separar el código dependiente de la plataforma (ya que planeaba crear una solución multiplataforma en el futuro) del código de la biblioteca en sí. Esto evitaría la necesidad de reescribir toda la base de código al alejarme de P/Invoke. También me tomé el tiempo para agregar comentarios XML para que los usuarios de la biblioteca pudieran entender lo que hace cada método o clase.
Después de completar la primera versión de la biblioteca, la subí a NuGet (el sistema de gestión de paquetes para la plataforma .NET, similar a npm o pip). Quería recibir comentarios para entender si alguien estaba interesado en este proyecto y qué dirección debería tomar a continuación. Antes de promocionar mi biblioteca, decidí crear un archivo README en el repositorio de GitHub, que incluye información sobre los objetivos de la biblioteca y una breve guía sobre cómo usarla.
Decidí buscar a mis primeros usuarios en Reddit . Después de encontrar varias comunidades adecuadas, escribí una breve publicación titulada " Biblioteca C# de código abierto para manejar eventos de teclado/ratón en aplicaciones de interfaz de usuario de Windows ". Fue un poco estresante y, honestamente, no esperaba ningún resultado significativo. Sin embargo, sorprendentemente, valió la pena. Una de las publicaciones recibió alrededor de 14.000 visitas y aproximadamente 30 comentarios con comentarios positivos. Fue una sensación increíble que desearía que todos pudieran experimentar: la comprensión de que el tiempo dedicado al proyecto no fue en vano. Aunque no creé algo innovador, entendí que hay personas que lo encuentran realmente útil y que están dispuestas a apoyar mis esfuerzos.
Después de recopilar todos los comentarios, decidí continuar con el desarrollo y mantenerme en contacto con los usuarios más interesados que dejaron comentarios. Me comuniqué activamente con ellos y escuché sus solicitudes de funcionalidades que les gustaría ver. Durante el mes siguiente, publiqué varias actualizaciones pequeñas y luego me volví a centrar en atraer usuarios.
En GitHub, hay un tipo especial de repositorio llamado "awesome": se trata de colecciones de enlaces y recursos recopilados sobre temas específicos, por ejemplo, awesome-dotnet . Mi objetivo era promocionar mi biblioteca en cada uno de estos repositorios. Aunque no fue una tarea fácil (una biblioteca con 10-15 estrellas en GitHub no atrae mucho interés), logré ingresar a varios de ellos. Esto aumentó significativamente el tráfico de usuarios y atrajo la atención hacia mi proyecto.
Durante el desarrollo posterior, me encontré con muchas tareas pequeñas para las que a veces me faltaban ganas y energía. Por lo tanto, decidí aprovechar uno de los beneficios del desarrollo de código abierto: atraer a entusiastas que estuvieran dispuestos a ayudar con estas tareas. Para ello, recurrí al servicio Up-for-Grabs , que ofrece una lista de repositorios de código abierto con problemas activos para aquellos que quieran contribuir. Después de agregar mi repositorio y crear varios problemas, inmediatamente recibí solicitudes de ayuda.
Después de que mi biblioteca se descargara más de mil veces, decidí trabajar activamente en la documentación. Desde la primera actualización, la funcionalidad de la biblioteca había aumentado significativamente y los ejemplos en el archivo README ya no eran suficientes. De todas las opciones posibles, elegí la más simple y accesible: creé un archivo Markdown separado y detallé todas las clases que ofrece la biblioteca. También decidí escribir una pequeña guía para usuarios avanzados que quieran aprovechar al máximo las capacidades de la biblioteca. Para mi sorpresa, un chico que se especializa en escribir documentación técnica se acercó a mí y me ofreció su ayuda. Me ayudó a estructurar correctamente el material y describir con precisión todos los detalles. Con su ayuda, completamos esta tarea rápidamente.
El desarrollo de código abierto es una gran oportunidad para conocer y ampliar su red con otros programadores. Hasta ahora, nueve personas de diferentes países han contribuido a la biblioteca, incluidos Estados Unidos, Australia, Argentina, Canadá, Alemania, Polonia y otros. Han colaborado en la redacción de funcionalidades, pruebas unitarias y documentación. Además, ha sido un maravilloso intercambio de experiencias y una comunicación agradable. Tal vez con algunos de los colaboradores podamos iniciar un nuevo proyecto juntos.
A pesar de tener un trabajo y otros compromisos, quiero continuar con el desarrollo y lanzar una versión completa con las características que creo que deberían incluirse en la biblioteca. Mis planes futuros incluyen hacerla multiplataforma y desvincularla de los marcos de interfaz de usuario específicos.
Para concluir, me gustaría resumir todo lo que he dicho. Nunca tengas miedo de probar algo nuevo y no te quedes estancado. Si realmente amas la programación y quieres crecer como desarrollador, esfuérzate por crear algo propio, ya sea una pequeña biblioteca o un servicio. Nunca sabes a dónde te puede llevar. A lo largo del desarrollo de esta biblioteca, encontré alegría no solo en la programación, sino también en conocer gente y hacer nuevas conexiones. Planeo seguir participando en el desarrollo de código abierto, no solo avanzando con mis propios proyectos, sino también contribuyendo a las bibliotecas comunitarias; esta también es una gran experiencia.
Para aquellos que quieran empezar a incursionar en el desarrollo de código abierto, ¡recomiendo esta guía !
Si te ha gustado esta publicación, ¡te agradecería que apoyaras la biblioteca con una estrella en GitHub!