Comentarios claros en Kotlin.

Recientemente me di a la tarea de documentar el código de una aplicación que estoy desarrollando y seamos sinceros, documentar código es aburrido, tal vez por esto no pude encontrar muy buena información, en particular en la parte de cómo comentarlo. Incluso en la página oficial de Kotlin no vienen ejemplo claros de cómo comentar el código. Después de un buen rato de prueba y error descubrí algunas cosas que creo que vale la pena compartir.

Vamos a verlo con el ejemplo de un método que obtenga el subtotal de una lista del supermercado donde cada elemento tiene un precio, una cantidad y un posible descuento. Además al final le vamos a agregar un impuesto 😭 al ticket. El método podría ser el siguiente.

private fun getTicketTotal(productList: MutableList<Product>, 
taxPercentage: Double): Double {
    var total = 0.0
    for (product in productList) {
        val subtotal = (product.quantity * product.price)
        total += subtotal * ((100 - discount)/100)
    }

    val taxAmount = (total * taxPercentage)/100
    total -= taxAmount

    return total
}

Empecemos por lo más básico, un simple comentario en Kotlin se inserta con dos lineas diagonales // así:

private fun getTicketTotal(productList: MutableList<Product>, 
taxPercentage: Double): Double {
    // Creamos total en 0
    var total = 0.0
    for (product in productList) {
        // Subtotal es el la multiplicación de cantidad por precio
        val subtotal = (product.quantity * product.price)
        total += subtotal * ((100 - discount)/100)
    }

    // Sumamos el impuesto al total
    val taxAmount = (total * taxPercentage)/100
    total -= taxAmount

    return total
}

Para comentarios más largos que ocupen varios renglones podemos insertarlos con
/* ... */, aunque también podríamos tener simplemente varios renglones con //:

private fun getTicketTotal(productList: MutableList<Product>, 
taxPercentage: Double): Double {
    // Creamos total en 0
    var total = 0.0
    for (product in productList) {
        // Subtotal es el la multiplicación de cantidad por precio
        val subtotal = (product.quantity * product.price)
        /* Restamos el posible descuento al subtotal, por ejemplo si 
           el subtotal es de $150 el descuento es de 30%, el total 
           será de 150 * ((100 - 30)/100) = 150 * 0.7 = 105 */
        total += subtotal * ((100 - discount)/100)
    }

    // Obtenemos el monto de impuestos, por ejemplo si el total es 
    // 150 y el impuesto es 15%: 
    // taxAmount = (150 * 15)/100 = 22.5
    val taxAmount = (total * taxPercentage)/100
    total -= taxAmount

    return total
}

Finalmente, para comentar un método completo podemos utilizar /** ... */, aquí podemos indicar también cuales son los parámetros que necesita el método y qué es lo que regresa, así:

/**
* Este método obtiene el total de una lista de [Productos] teniendo
* en cuenta [Producto.precio], [Producto.cantidad], 
* [Producto.descuento] y un posible impuesto.
*
* @param productList La lista de productos de la cual se obtiene el * total
* @param taxPercentage El porcentaje, el cual puede ir de 0 a 100
*
* @return El total después de impuestos.
**/
private fun getTicketTotal(productList: MutableList<Product>, 
taxPercentage: Double): Double {
    // Creamos total en 0
    var total = 0.0
    for (product in productList) {
        // Subtotal es el la multiplicación de cantidad por precio
        val subtotal = (product.quantity * product.price)
        /* Restamos el posible descuento al subtotal, por ejemplo si 
           el subtotal es de $150 el descuento es de 30%, el total 
           será de 150 * ((100 - 30)/100) = 150 * 0.7 = 105 */
        total += subtotal * ((100 - discount)/100)
    }

    // Obtenemos el monto de impuestos, por ejemplo si el total es 
    // 150 y el impuesto es 15%: 
    // taxAmount = (150 * 15)/100 = 22.5
    val taxAmount = (total * taxPercentage)/100
    total -= taxAmount

    return total
}

Como puedes observar hay palabras que encerré entre [] esto es para que puedas dar option + clic en esa clase o incluso en un método o campo dentro de la clase y te lleve directamente a ella. Ahora es mucho más claro lo que hace el método, sí es aburrido, pero tus compañeros (y tu yo del futuro) te lo agradecerán.

NOTA: No todos los métodos e instrucciones necesitan comentarios, hay unos que son auto explicativos.

Si te gustó el artículo compártelo suscríbete y sígueme en mis redes sociales o donde quieras. También te invito a dejar tus comentarios. ¡Saludos y mucho éxito!

Tensorflow en 90 segundos

Recientemente he retomado mi interés por el machine learning y su combinación con las aplicaciones móviles, estaré posteando acá lo que vaya aprendiendo e implementando, para iniciar quiero compartir este pequeño video acerca de qué se trata una de las tecnologías más usadas hoy en día para Machine Learning, se llama Tensorflow y te lo presento en tan solo 90 segundos.

Te invito a suscribirte al canal y al blog para más cursos, artículos, tutoriales y todo tipo de contenido relacionado al diseño, programación y emprendimiento tecnológico.

Usando Corrutinas con Firebase en Android MVVM

Estoy desarrollando un proyecto alterno que utiliza la arquitectura MVVM y Firebase/Firestore, para todo el manejo de los hilos y tareas en segundo plano estoy usando corrutinas (coroutines).

Me acabo de topar con una situación que no me había sucedido, al usar Firebase, este trae sus propios listeners para saber cuando termina un proceso, el cual regresa un DocumentSnapshot que es el que necesitas para extraer los datos. Algo así:

class MyRepository(private val firestoreDb: FirestoreDb) {
    
    suspend fun downloadSomething(listener: (DocumentSnapshot) -> Unit){
        firestoreDb.collection(collectionName).get()
            .addOnCompleteListener {
                task ->
            if (task.isSuccessful) {
               // Do something ...
               listener(myDocumentSnapshot)
            } else {
               // Show error
            }
        }
    }
}

Esto es llamado desde el ViewModel el cual se vería así.

viewModelScope.launch {
    repository.downloadSomething {
        documentSnapshot ->
        // Do Something
    }
}

Pero uno de los puntos principales de las corrutinas es que no necesitemos integrar interfaces y/o listeners para devolver los datos, sino que los podamos devolver en la misma linea para continuar con nuestro código, es decir, en vez de esto:

fun downloadSomething() {
repository.downloadSomething {
result ->
processResult(result)
}
}

Con las corrutinas podemos hacer esto:

suspend fun downloadSomething() {
val result = repository.downloadSomething()
processResult(result)
}

Pero tal y como funciona normalmente Firebase no se puede porque como dije antes, ya trae ese listener .addOnCompleteListener integrado, entonces ¿Cómo lo manejamos para poder usar el resultado con corrutinas? La respuesta que encontré fue usar .await()

await() nos ayuda a esperar a que un proceso se complete sin bloquear otros hilos (Como el Main Thread), haciendo que evitemos tener que llamar un listener una vez que se complete, ya que al terminar se ejecutará la siguiente linea de código del hilo. Pero await() no viene con Firebase sino con las Kotlin Coroutines, por lo que tenemos que agregarlo como dependencia:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.1.1'

Ahora que ya podemos usar await() el código de Firebase quedaría así:

class MyRepository(private val firestoreDb: FirestoreDb) {

    suspend fun downloadSomething(): DocumentSnapshot {
        return withContext(Dispatchers.IO) {
            firestoreDb.collection(collectionName).get().await()
        }
    }
}

Con esto podemos regresar el DocumentSnapshot y continuar con nuestro trabajo de forma secuencial en el ViewModel:

viewModelScope.launch {
    val documentSnapshot = repository.downloadSomething()
    // Continuar secuencialmente
}

Esto trae ventajas para hacer testing, para manejar excepciones, para cumplir con el MVVM y para manejar los LiveData.

NOTA: Esto solo funciona para cuando usas get().addOnCompleteListener(), todavía no he encontrado la manera de hacerlo funcionar con cambios en tiempo real con addSnapshotListener(), buscaré la manera para postear.

Como siempre todos los comentarios y dudas son más que bienvenidos.

¿Qué es JSON? – En palabras simples

Algunos de mis alumnos me han pedido que les pase un artículo sobre JSON y como funciona, es más sencillo de lo que crees, aquí te dejo un video para que conozcas JSON en 3 minutos.

Como siempre los comentarios o dudas son bienvenidos. Inscríbete al canal y al blog para recibir los últimos artículos, videos, cursos, etc que voy creando.

¡A programar! ¿Qué lenguaje/framework/IDE elegir para lanzar tu idea?

Después de todo lo anterior: Validar tu idea, identificar a tus clientes, planear tu MVP, lo que sigue es empezar a “tirar código”. Pero este paso puede llevarte al análisis parálisis, habiendo tantas tecnologías ¿Qué debería usar? ¿Qué lenguaje? ¿Qué IDE? ¿Qué framework?. La realidad es que aquí si depende del proyecto (No te puedo decir que uses Android si tu idea es una página web) pero si te puedo dar algunos consejos que me han sido útiles en este punto.

La regla general es que si ya conoces una de las tecnologías y esa te sirve para construir tu idea no pierdas el tiempo leyendo esto y vete por ese lenguaje, framework, etc, ya después aprenderás otras cosas. Si no conoces nada sobre programación, trataré de recomendarte la tecnología que además de servirte para construir tu idea te deje habilidades que te servirán para el futuro.

  • Si tu idea es una app móvil, piensa si está enfocado en Android, iOS o ambos:
    • Solo Android: Usa Android Studio con cualquiera de los dos lenguajes: Java o Kotlin. Aquí tienes un artículo para elegir cuál de los dos. Y acá puedes encontrar dos cursos gratuitos, uno para cada lenguaje.
    • Solo iOS: No hay pierde, usa Swift con XCode.
    • Ambas: Programar apps en iOS y Android a la vez te puede tomar mucho tiempo. Si no tienes un socio o amigo que te pueda ayudar a programar en iOS mientras tu lo haces en Android o viceversa lo mejor es usar Flutter, es un lenguaje creado por Google que te ayudará a desarrollar apps en ambas plataformas a la vez y viene con mucho poder últimamente, una pequeña desventaja es que no puedes hacer tantas cosas como en los lenguajes nativos, así que es para apps más simples.
  • Si tu idea es una página web:
    • Blog, tienda en linea, landing para tu empresa: Si tu página es algo sencillo como estas mencionadas no necesitas ni siquiera aprender a programar. Elige un servicio de los que te permiten hacer tu página web en un par de horas: WordPress, Wix, Shopify, WooCommerce, Squarespace. Todas estas te ahorrarán mucho tiempo, y el tiempo te dirá si necesitas desarrollar una página más compleja.
    • Una página más compleja que necesita una API: Si ya sabes programar en un lenguaje busca si existe un framework con ese lenguaje que te permita crear tu backend, por ejemplo yo conozco Python, me gusta el lenguaje, así hago que mis páginas web en Django, un framework para Python que me ayuda a hacer las cosas rápidamente porque puedo programar tanto frontend (Lo que el usuario ve) como el backend (La lógica detrás), si no sabes programar te recomiendo este camino. Otros ejemplos son NodeJs para JavaScript, Spring para Java, Spring para Kotlin, Rails para Ruby.

Lo sé, suena a mucho trabajo, y lo es, pero tómalo como algo divertido que te servirá toda tu vida. Si quieres dedicarte a ser programador como empleado sí necesitas aprender lo más que puedas para conseguir el empleo, pero como esta sección es para emprendimiento, mi consejo es que no te pases la vida estudiando cada tecnología hasta sus huesos, aprende solo lo necesario para implementarlo en tu idea y más adelante te vas adentrando conforme lo necesites.

¿Hay algún lenguaje o framework que recomiendes o que hayas escuchado buenas cosas de él? Te invito a dejarlo en los comentarios.

¿Cómo vas a ganar dinero con tu idea? Los mejores 8 modelos de negocio para tu app.

El modelo de negocio es la manera en que vas a ganar dinero con tu idea, la forma en que vas a cobrar; por ejemplo podrías vender productos, manejar subscripciones, etc. En este artículo ahorrarás buen tiempo al conocer los 8 modelos de negocio más comunes para aplicaciones móviles, páginas web u otros productos tecnológicos. ¡Vamos a ello!

  1. Enterprise: Vender servicios o software a otra empresa. Normalmente estos contratos tienen términos fijos y vienen con renovación al final de un periodo. Ejemplos: Moz, Docker, Cloudera, Solidworks.

  2. SaaS (Software as a Service): Vender licencias de software en la nube, por lo general a otras empresas. Normalmente el pago es mensual o anual y no hay plazos fijos, mientras pagues tienes acceso. Ejemplos: Github, Mixpanel, Slack.

  3. Subscripción: Vender un producto o servicio, usualmente a clientes directos, en una base recurrente. Ejemplos: Netflix, Spotify, Shave Club.

  4. Transaccional: Hacer transacciones financieras a nombre de un cliente y cobrar una tarifa, usualmente un porcentaje de la transacción. Ejemplos: Stripe, Paypal, Conekta.

  5. Marketplace: Ser intermediario en la venta de un producto o servicio, es decir, estás en medio de los vendedores y compradores, y cobrar una tarifa o porcentaje del valor de la transacción. Ejemplos: Airbnb, Mercado Libre, Uber, Rappi, Udemy.

  6. E-Commerce: Vender productos físicos en línea. Generalmente las empresas e-commerce manufacturan y llevan inventarios de estos productos. Ejemplos: Boutiques en linea como Shein o Mango, venta directa de productos de cualquier tipo a través de una página web.

  7. Publicidad: Ofrecer un servicio gratuito a los consumidores y ganar dinero con publicidad (Recuerda que si el producto es gratis, significa que tú eres el producto 😉). Ejemplos: Redes sociales, blogs, apps gratuitas con publicidad.

  8. Hardware: Vender dispositivos físicos a consumidores o negocios. Ejemplos: Go Pro, Xiaomi.

Para terminar te dejo dos consejos para elegir el mejor modelo de negocios para tu producto de acuerdo a errores que cometí con mis proyectos pasados.

  • Tu producto debería caer en uno de estos 8 modelos, en este tema es en el único que te diría que no intentes reinventar el hilo negro. Entender la forma en que van a pagar es algo muy importante para los usuarios, si el modo de pago es confuso puede causar rechazo por no saber cuánto van a pagar exactamente o incluso puede sonar a estafa.

  • El modelo de negocios es parte de la idea, ve pensando en él desde el inicio de tu proyecto para que lo tomes en cuenta en el diseño.

¿Tu producto está dentro de uno de estos modelos? ¿Conoces algún otro modelo de negocios probado? Te invito a dejar tus comentarios.

Data Binding para Android con Kotlin

Desde el inicio de Android la forma de obtener acceso a un View era así:

val nameTextView: TextView = findViewById(R.id.name_text) as TextView

Y estaba bien, solo que se podía mejorar porque tiene sus desventajas:

  1. Es aburrido de hacer cuando tienes 10 o más views, tienes que ir a ver a tu layout.xml el id que le diste. Además ¿Qué es eso de tener que escribir 2 veces el tipo de View que vas a usar? 😪.

  2. Si olvidaste crear el nameTextView y lo quieres usar la app truena (nullPointerException), pero no te avisa en tiempo de compilación, sino en tiempo de ejecución, es decir, te avisa ya que estás usando la app, cuando no hay mucho que hacer más que lanzar una nueva versión, esto es tardado y para entonces ya les tronó a muchos de tus usuarios.

  3. Cada vez que llamas findViewById, Android va y busca el id de entre el montón que tienes en tu app, es un proceso pesado y poco eficiente.

Por eso Google decidió sacar a la luz algo llamado data binding (Algo así como enlace de datos) que hace tu código más rápido, limpio y menos repetitivo.

Lo primero que hay que hacer es agregar soporte para data binding en tu archivo build.gradle (app):

// En la parte superior agrega el plugin de 'kotlin-kapt'
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt' <--- Aquí
}

android {
    ...

    buildFeatures {
        dataBinding true
    }
}

Luego en tu layout.xml (por ejemplo activity_main.xml), y en la pestaña del documento o en el ViewGroup padre da clic en alt + N (option + N en Mac) y selecciona “Convert to data binding layout”

Verás que todo se encierra dentro de <layout

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            id="@+id/name_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </LinearLayout
</layout>

Esto también creará automáticamente una clase binding con el nombre de tu Activity, por ejemplo para MainActivity creará una clase ActivityMainBinding, o para LoginActivity creará ActivityLoginBinding

Ahora en el método onCreate() de tu Activity, en vez de usar setContentView(R.layout.activity_main) puedes crear un objeto binding así:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

Y en vez de usar el findViewById(R.id.name_text) simplemente podrás usar el binding.nameText y esto será tu TextView, por ejemplo para agregarle texto puedes hacer lo siguiente

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)

    // binding.nameText es el TextView de tu layout, esto es lo mismo que hacer
    // findViewById(R.id.name_text)
    val nameTextView = binding.nameText
    nameTextView.text = "Ragnar Lothbrok"

    // También puedes simplemente escribir 
    // binding.nameText.text = "Ragnar Lothbrok"
}

El nameText del binding.nameText se generó automáticamente a partir del id del TextView name_text, por ejemplo si tienes un ImageView llamado profile_image, se generaría también un binding.profileImage que podrías usar directamente, no más findViewById.

Con dataBinding obtienes 3 ventajas que se contraponen a las desventajas del inicio:

  1. El código es más limpio y ahorras lineas de código porque no necesitas declarar los views.

  2. Los errores ocurren en tiempo de compilación, si ocurre un error lo sabrás antes de ejecutar la app.

  3. Como todo se pre-carga en tiempo de compilación, el proceso es más eficiente al usar los views.

¿Qué arquitectura es mejor para Android? ¿MVC, MVP o MVVM?

La arquitectura es uno de los principales temas a abordar cuando inicias una nueva aplicación, como siempre trataré de evitar el “depende para qué lo quieras” y en 2 minutos te ayudaré a elegir cuál te conviene más para tu app.

Nota: Esta es mi opinión personal después de usar las 3 arquitecturas mencionadas.

En Android, la arquitectura MVC (Model-View-Controller) no funciona porque no está hecha para ello, las veces que lo he intentado mi código queda de 💩, no he encontrado como adecuarlo, mi recomendación es no implementar MVC con Android.

En cuanto a los otros dos (MVP y MVVM) he implementado ambos y los dos funcionan muy bien. Para ser honesto me gusta más MVP, aunque MVVM está prácticamente hecho para Android y es el que Google recomienda más. Te dejo un resumen de las ventajas y desventajas que veo sobre ambos:

MVP (Model-View-Presenter): 
Ventajas:

  • Súper fácil de replicar, una vez que lo implementas para una activity o fragment casi es solo es copiar y pegar.
  • La separación de código es muy clara.
  • Gracias al punto anterior te permite hacer testing exhaustivo relativamente fácil.
  • Una vez que lo entiendes lo puedes usar una y otra vez y se acomoda muy bien a casi cualquier tipo de aplicación.
  • Es fácil de adaptar a apps que ya están construidas con código antiguo (Legacy), aunque sí se necesita bastante trabajo y tiempo.

Desventajas:

  • Algo difícil de entender al principio.
  • Necesitas muchas interfaces (y mucho código repetitivo), como consecuencia a veces es aburrido de implementar y hace que sea difícil buscar dónde se mandan llamar ciertos métodos con los shortcuts del teclado.

MVVM (Model-View-ViewModel)
Ventajas:

  • Recomendado por los de Google y prácticamente hecho para Android, por si solo no es una ventaja pero podría ser que por ello agreguen mejoras a la técnica.
  • Su mayor ventaja es que tiene herramientas para manejar el lifecycle de los activities y fragments, no tienes que estar cuidando esto. Por ejemplo, cuando usas MVP si no tienes cuidado es muy frecuente que la app truene si haces ciertas cosas después del onStop() del Activity, esta es la mayor ventaja que veo.


Desventajas:

  • Se complican a propósito, necesitas hacer ciertas cosas que se podrían hacer de manera más fácil.
  • No es tan replicable como el MVP, en cada Activity o Fragment donde lo uses tienes que hacer algunas cosas diferentes.
  • Es difícil de adaptar a apps que ya están hechas, es decir, prácticamente es para aplicaciones nuevas.
  • Para implementar MVVM en un Activity que traiga datos de internet, necesitas integrar al menos como 6 clases: Activity, ViewModel, Repository, Api, Dao, Model, uff 😪.

Bajo este análisis, lo que yo haría es lo siguiente:

  • Si la app es para mi propio negocio me iría por MVP: En lo personal lo veo más estructurado y fácil de manejar y replicar, me ayuda a hacer las cosas más rápido.

  • Si es una app para la empresa en la que trabajo usaría MVVM: Es más actual, luce mejor en el currículum y los de Google de seguro irán mejorando las técnicas.

¿Sabes cómo implementar las arquitecturas en Android? Te invito a dejar tus comentarios o dudas.

¿Cuánto tiempo te debería llevar lanzar una app/web? Spoiler, no tardes mucho.

Ahora que tienes una idea de tu MVP y las características que debería tener, es hora de establecer una fecha para lanzar tu producto, así es, elige la fecha YA. En este artículo te diré cuánto tiempo necesitas para lanzar una app.

TL;DR: Son 3 meses.

He lanzado más de 10 apps y páginas web al mercado, algunas como empleado y otras como empresas personales. El tiempo que toma hacer un producto digital varía principalmente en función de estos 5 aspectos:

  1. La dificultad del producto: Si necesita tecnología avanzada como redes neuronales, optimización de consumo de datos, batería, rapidez de procesamiento, etc.

  2. Las partes que necesita: Algo como Uber lleva bastante trabajo porque necesita una app de usuario + app de conductor + backend + toda la logística.

  3. El tamaño del equipo: Un equipo más grande podría hacer las cosas más rápido, pero no necesariamente es así, a veces con más personas se requiere más tiempo para tomar decisiones.

  4. Si estarás o no de tiempo completo.

  5. Si tienes experiencia programando: O en la parte técnica necesaria para construir tu producto.

Independientemente de estos aspectos, 3 a 5 meses es un tiempo suficiente para lanzar tu MVP. Los puntos que tienen mas peso en la duración según mi experiencia son el 4 y 5. Si es la primera vez que emprendes puedes ponerte una meta de 4 o 5 meses, si ya tienes experiencia 3 serán suficientes. Toma en cuenta lo siguiente:

  • El alcance es flexible, el tiempo no. Es preferible quitar características menos esenciales que aumentar el tiempo, lanza en el momento que te lo propongas.

  • Esto aplica para productos digitales, en el caso de un producto que involucre hardware, dependerá mucho de los tiempos de producción que son lentos.

  • Hay productos que necesitan validaciones que requieren mucho tiempo, por ejemplo si necesitan que los evalúe alguna autoridad médica, que se aplique alguna ley, etc., en estos casos aunque no puedas lanzar en 3 meses, sí puedes tener un producto que funcione y probarlo con personas cercanas en ese tiempo.

  • Esto asume que sabes un poco de programación o la habilidad técnica principal que necesitas para crear tu producto. Si no sabes nada de programación, lo mejor es que agregues un par de meses para aprender, pero tampoco agregues mucho, por lo general necesitas sólo lo básico para construir un producto decente, así que no te mates aprendiendo hasta lo más avanzado de Javascript.

  • No aplica si pagas para que alguien te desarrolle la app/web, estos procesos toman mucho tiempo, de hecho mi recomendación es que NO pagues por esto, hazlo tú mismo(a). Si quieres saber por qué te invito a ver este otro artículo.

  • No será un periodo fácil, lograr esto supone que tendrás que trabajar duro en los próximos meses, avanzar aunque sea un poco TODOS los días y desvelarte de vez en cuando, pero ¡hey!, somos emprendedores porque nos apasiona aprender y crear cosas geniales, así que no debería afectarte demasiado. Se te harán cortos los días de la emoción.

Para terminar, este es un ejemplo de una MVP que lanzamos en tan solo 3 meses haciendo los mismos pasos que te estoy compartiendo en esta serie de artículos, es una app llamada Botia que sirve para reservar servicios usando bots, puedes encontrarla en https://www.botia.app, el producto consiste en una app móvil (Android) + backend.

Como definir tu Producto Mínimo Viable (MVP) para lanzar en 3 meses.

En este punto espero que hayas validado tu idea y tengas al menos una noción de quien es tu cliente/usuario ideal, si todavía no lo haces te recomiendo ir a esos artículos, si ya lo hiciste ahora toca definir tu Producto Mínimo Viable (MVP – Minimum Viable Product).

El MVP es un producto (App móvil, web, etc.) que tiene lo necesario para resolver el problema que quieres pero requiere el tiempo y esfuerzo mínimo de tu parte para poder ser lanzado al mercado.

Aquí el objetivo del juego es lanzar tu producto cuanto antes para revisar qué es lo que hay mal en él y corregirlo, además de que validarás mejor si la idea es tan buena como creías. Es mejor darte cuenta de tus errores a los 3 meses que esperar 1 año a que sea perfecto.

Como siempre te guiaré con un ejemplo, vamos a suponer que estamos creando una página web para comprar cereales (Konfléis en Latinoamérica) de todos los colores y sabores, te subscribes y cada semana recibes un cereal que elijas de un catálogo, vamos a llamarla Cerealife (Idea millonaria 💵🤑 y nombre genial) Vamos a definir el MVP. Piensa ¿Qué es lo mínimo que necesito para lanzar esta página web? Y se nos ocurre lo siguiente:

  1. Mostrar un catálogo de los cereales.
  2. Que el usuario pueda seleccionar cereales del catálogo.
  3. Que pueda insertar sus datos de entrega.
  4. Que pueda suscribirse creando una cuenta.
  5. Que pueda insertar sus datos de pago.

Esas son las características esenciales para que la página web comience a funcionar.

Siempre va a haber más ideas, pero muchas de ellas no serán esenciales así que las podemos dejar para después, anótalas por ahí pero no las incluyas en tu MVP, ejemplos de características que NO deberías incluir en el MVP de Cerialife:

  1. Que se pueda compartir su cereal en redes sociales: Muy bonito pero no es esencial.
  2. Que puedan agregar amigos para compartir el cereal: Esto no es esencial, además de ser raro.
  3. Poder ver dónde viene su cereal.
  4. Poder seleccionar en un calendario cuando salen de vacaciones y no quieren recibir el cereal: Ok esto es importante, pero lo puedes resolver en el MVP con un simple Switch que “apague la app”.
  5. Poder calificar los cereales si te gustaron o no.

No quiere decir que no hagas todo esto después (excepto el punto 2, por favor no lo hagas) pero son cosas que si te pones a hacerlas te retrasarán y realmente no aportan nada al problema núcleo, que es tener buen cereal siempre.

El MVP NO es un producto inacabado o con bugs, es algo que debe funcionar y debe estar listo para que el mundo lo use, aunque al principio solo sea el mundo alrededor de ti. Lo normal es que al inicio cuando lances tu MVP sea un desastre, pero como menciono arriba, lo importante del MVP es ahorrar tiempo y esfuerzo. Una vez que termines tu MVP y lo hayas lanzado, lo que sigue será pedir retroalimentación a tus usuarios para mejorar lo que haya fallado, pero eso lo veremos en otro artículo.

Ahora te toca a ti definir tu MVP, si tienes dudas te invito a comentarlas y con gusto te ayudo.

Suscríbete para enterarte cuando suba nuevos artículos y cursos, así como recibir contenido y promociones especiales, prometo no enviarte spam.