Sé consciente de lo que sabes (y de lo que no)

He dicho muchas veces que uno de los motivos por lo que escribo este blog es para aprender cosas nuevas. Me gusta aprender. Y me gusta enseñar. Por eso a veces, en un alarde autorreferente, me gusta aprender sobre aprender y, aunque no soy ningún experto en la materia (no soy un experto en casi nada), creo que en una profesión como la nuestra, donde la necesidad de aprender es constante, merece la pena pensar un poco sobre cómo aprendemos. Concretamente, en este post vamos a ver distintas fases por las que pasamos al aprender algo, lo que en ocasiones se denominan fases de la competencia.

Puede que sea éste un post raro para un blog sobre desarrollo, pero considerando lo importante que es el aprendizaje en esta profesión, podemos dedicarle un poco de tiempo. A fin de cuentas, le dedicamos mucho tiempo a escribir sobre herramientas para desarrollar software y, la capacidad de aprender, junto con la de resolver problemas, son seguramente las dos herramientas más importantes que tenemos, muy por encima de IDEs, editores o librerías.

Incompetencia inconsciente

Es la primera fase. No sabemos hacer algo, pero es que ni siquiera sabemos que es posible hacerlo. Por ejemplo, en esta fase se encontraría alguien que no sabe que existe la programación funcional: no sabe utilizarla y ni siquiera se lo plantea porque no la conoce.

Pero no hace falta irse a un caso tan extremo. ¿Habéis visto alguna vez una clase con métodos de 800 líneas, con nombres de variables poco descriptivos, fragmentos de código comentados porque ya no se usan y responsabilidades entrelazadas? Seguro que sí. Posiblemente sea otro caso de incompetencia inconsciente, en el que el desarrollador no sabe que hay formas mejores de estructurar y escribir el código, por lo que dentro de su marco de conocimiento, está haciendo lo correcto.

Desgraciadamente, me atrevería a decir, y ésta es una estimación sacada de la nada, que más el 75% del código que hay en producción ha sido escrito por alguien que se encuentra en esta fase de conocimiento.

Incompetencia consciente

Un paso natural. En algún momento, ya sea por curiosidad, por necesidad o por el sufrimiento que nos causa nuestra propia incompetencia, empezamos a ser conscientes de que hay cosas que no van todo lo bien que deberían. Que debe haber algo más. Y comienza nuestra búsqueda.

Nuestra clase con métodos de 800 líneas se había vuelto inmanejable y no podíamos ser los únicos con estos problemas. ¿Qué hacen los demás? Y ahí empiezas a investigar sobre clean code, patrones de diseño o principios SOLID, aunque todavía no sabes muy bien cómo aplicar eso a tu código.

Es un paso importante, porque es el primer paso hacia la mejora, pero también es un paso que nos puede producir cierta ansiedad. Ser consciente de la cantidad de cosas que no sabemos puede resultar abrumador. Es lo que algunos llaman developaralysis y hace que nos pongamos nerviosos en lugar de dedicar el tiempo necesario para aprender bien las cosas realmente importantes.

No siempre es necesario superar esta fase. Hay muchas ocasiones en las que nos basta saber que existe algo, tener unas ideas generales sobre lo que nos puede aportar, y dejarlo estar hasta que sea necesario. Un aprendizaje más Just In Time y menos especulativo. Por supuesto, no quiero decir que no merezca la pena aprender cosas «porque sí», sino que no debemos agobiarnos intentando aprender los 8 frameworks de Javascript que han salido en las últimas 2 horas o los cambios del último SDK de Azure.

Competencia consciente

Por fin. Después de darnos cuenta de que necesitábamos aprender algo y dedicar tiempo a ello, ya somos competentes y nuestra situación mejora. Lo malo de esta fase es que aplicar los conocimientos adquiridos requiere un esfuerzo consciente por nuestra parte, y eso hace que resulte más tedioso y cansado.

Ya no diseñamos clases con métodos de 800 líneas. Nos ha costado, pero ahora somos capaces de pensar detenidamente en las responsabilidades de cada método y, con paciencia, acabamos generando diseños con los que resulta más cómodo trabajar.

Tenemos que estar constantemente pendientes de no volver a caer en los métodos de 800 líneas, y a veces supone tanto esfuerzo separarlos en distintas clases, gestionar las dependencias entre ellos, o buscar nombres apropiados para las variables, que acabamos obteniendo el mismo resultado que en la primera fase, ya no por incompetencia, sino por dejadez o hastío.

Aun así, esta fase supone un avance importante porque por fin podemos aplicar mejoras, aunque nos cueste.

Normalmente habrá un montón de cosas que sepas en las que no hayas pasado de esta fase, sobre todo cosas que no utilizas a diario. Seguro que muchos sabéis usar expresiones regulares, pero en cuanto se complican un poco, tenéis que dedicar un rato a pensar sobre los grupos de reemplazo o el greedy matching, y eso hace que a veces acabéis por emplear soluciones menos eficientes (volviendo a la primera fase) sólo por no tener que pensar.

Competencia inconsciente

Es el nirvana. El maestro Jedi de los estados de consciencia. Es conseguir que te salgan las cosas sin pensar, tenerlas tan interiorizadas que te salgan automáticamente.

Puede parecer imposible, pero en realidad ya hay un montón de cosas que haces así. Andar, sin ir más lejos. No creo que seas muy consciente de los movimientos que haces para desplazarte de un sitio a otro, te sale natural. Lo mismo pasa con el lenguaje, o si quieres ejemplos menos básicos, con conducir. Cuando me estaba sacando el carnet de conducir me parecía muy complicado tener que estar pendiente de tantas cosas a la vez (la marcha, la velocidad, las señales, el tráfico, …), sin embargo, 20 años después, prestar atención a todo ello me resulta natural y no me supone ningún trabajo adicional.

Para dar el salto desde la fase anterior a ésta, el único camino que conozco es la práctica y la repetición. En serio. Me gustaría decirte que a base de leer libros sobre clean code vas a hacerte un experto en el tema, pero si no ejercitas lo que estás aprendido, ya sea con programas reales, con katas, con proyectos para jugar, o con lo que sea, como mucho conseguirás quedarte en la fase de competencia consciente (y eso siendo bastante optimista).

Como te puedes imaginar, llegar a esta fase requiere tiempo y esfuerzo. Mantenerse también, aunque hay ocasiones en que si llegas a interiorizar algo lo suficiente, luego es difícil olvidarlo, o al menos es fácil recuperar el nivel después de haber estado un tiempo sin practicarlo. Todos hemos oído la expresión montar en bici nunca se olvida.

Es imposible alcanzar un grado de competencia inconsciente en todas nuestras habilidades, por lo que es necesario seleccionar en cuales queremos invertir el tiempo necesario para lograrlo. Cuando son habilidades que utilizamos en nuestro día a día, llegar a un punto de competencia inconsciente es una evolución lógica, pero si son cosas más esporádicas, puede ser muy complicado.

Si realmente quieres llegar a este nivel con algo, mi consejo es que intentes involucrarlo en tus actividades cotidianas. Si, por ejemplo, has decidido hacerte un experto en vim o en shortcuts de Visual Studio, haz el esfuerzo consciente de usarlos siempre que puedas en lugar de recurrir a lo que fuese que hicieras antes. Es la mejor forma de ir interiorizando esa forma de trabajar y conseguir que te salga sóla.

Conclusiones

Conocer los distintos estados de consciencia y competencia nos puede ayudar a enfocar mejor la manera en que aprendemos y a ser conscientes, valga la redundancia, de nuestro nivel en una materia determinada.

Para mejorar en algo, el primer paso es ser consciente de los problemas que tenemos.

Por ello es importante estar siempre replanteándonos lo que sabemos y asumir que, tal vez, estemos en esa fase de incompetencia inconsciente y haya cosas que nos estamos perdiendo. A partir de ahí, paciencia y trabajo. A base de aprendizaje y práctica podrás mejorar hasta dominar esa materia, pero el camino es largo y hay que estar preparado para ello.

Tampoco debes obsesionarte con todo lo que no sabes. El mero hecho de ser consciente de que no sabes algo ya te coloca en una buena posición para aprenderlo.

11 comentarios en “Sé consciente de lo que sabes (y de lo que no)

  1. Un artículo muy interesante, sobre todo porque delimita muy bien las diferentes fases del aprendizaje y establece la gran barrera para lograr la excelencia: cuando se estudia en profundidad un «framework», una metodología, un patrón de diseño, etc, y no se logra un resultado fino en la práctica.

    Esto me recuerda al «Gran Filtro» de la Paradoja de Fermi (http://www.astrobitacora.com/por-que-no-hemos-encontrado-vida-inteligente-la-paradoja-de-fermi-y-el-gran-filtro/). Cómo superar este gran filtro en el mundo del desarrollo es un tema que puede ofrecer un gran número de artículos.

  2. José Pérez Yazquez dijo:

    Mañana voy a comprarme un sombrero, solo para quitármelo. Muy, muy buen post.

  3. Sergio León dijo:

    Muy buen post, Juanma, nivel pro, pareces un contertulio de la tele, lo has clavado :)
    Este otro post vendría a complementar lo que cuentas, el cómo aprender http://www.jasoft.org/blog/post/PermaLinkaspxguid=504b7082-c4bf-47a9-833c-f4f561e.aspx y también recuerdo haber escuchado un podcast de «Basta ya de picar» en el que hablaban largo y tendido sobre como cada uno de ellos se enfrentaba a la situación de aprender algo nuevo http://www.bastayadepicar.com/episodio/014/
    Te dejo aquí los enlaces porque estoy seguro de que volveré a leer este post algún día y así está todo recogidito ¿Haces copia de seguridad del blog, verdad? :)
    Insisto, gran post!!

  4. Gracias a todos por los comentarios (y por los enlaces).

    Gregor, nunca se me había ocurrido pensar en el Gran Filtro aplicado a otros campos. Da que pensar.

    José, me alegro de que te haya gustado. Si te compras un sombrero, manda foto, que ando buscando uno y no encuentro ningún modelo que me guste ;-)

    Sergio, creo que has pillado mi estrategia a medio plazo para pivotar cual estartap saltarina de bloguero de medio pelo a tertuliano en Sálvame Deluxe.

    Interesante post el del Sr. Alarcón, aunque, al menos en mi caso, los vídeos no me ayudan a retener más que la lectura, más bien al contrario, pero supongo que también influyen factores subjetivos.

  5. Victor Quintana dijo:

    Lo peor es entrar en la incompetencia consciente y tener un responsable que está anclado en la incompetencia inconsciente. No hay por donde avanzar, ves que no sabes las cosas y ves que «nunca» vas a poderlas saber, porque no les gusta que «innoves»…. Lo mejor en esos casos en terminar la relación laboral :-)

  6. Hola, la verdad es que no recuerdo ahora como he llegado a tu blog, pero me parece genial.

    En cuanto a mi nivel, me atrevería a decir que estoy en el estado de incompetencia consciente apunto de entrar ya en la competencia consciente (sí, sufro de developaralysis).

    Siempre he trabajado con programación orientada a objetos, pero me gustaría introducirme en el mundo Web con JavaScript. He leído un poco por tus posts y me pregunto cual debería ser mi flujo o workflow de aprendizaje. Que principios de diseño o patrones sigo, valen los de OOD: SOLID, DRY, IoC, ORM …? Luego continuo con MEAN (o cualquier otro framework)? Mi idea es ir probando con algún proyecto personal.

    También me atrae la idea de hacer algo con Ruby y Ruby on Rails (estoy leyendo el libro POODR de Sandi Metz), pero veo que no tiene mucha demanda en el mercado laboral.

    Y el tema de la programación funcional, me sirve también para el tema Web?

    Gracias y enhorabuena por el blog.

  7. Hola Joan,

    Gracias por tu comentario, me alegro de que te resulte útil lo que escribo.

    Con respecto a tus dudas, yo creo que cualquier camino que sigas te puede acercar a lo que buscas. Para mi la clave es centrarse en principios fundamentales más que en herramientas concretas: eso te permitirá adquirir conocimiento reutilizable cuando cambien las cosas (que, ten por seguro, cambiarán).

    En cuanto a la programación funcional: sí, sirve para desarrollar aplicaciones web, y de hecho hay quien opina (yo entre ellos) que el desarrollo web (sobre todo la parte de servidor) se ajusta mejor al paradigma funcional que a la orientación o objetos, porque básicamente cada operación puede modelarse como una función que recibe datos de entrada (la petición HTTP) y a partir de ellos calcula unos datos de salida (la respuesta HTTP). En estos posts tienes un ejemplo de cómo clojure puede usarse para este tipo de aplicaciones: https://blog.koalite.com/tag/compojure/.

    Un saludo,

    Juanma.

  8. @Joan Personalmente te recomendaría MERN (React) en lugar de MEAN (Angular). A parte de este «stack» Java es con diferencia el ecosistema más rico para desarrollo en general.

  9. Muchas gracias por vuestras respuestas.

    @Juanma En cuanto a los principios fundamentales supongo que te refieres a arquitectura, SOLID, Clean Code, Testing, Patrones, no?

    @Horacio Gracias, lo tendré en cuenta.

    Ya no se cuantas pestañas tengo abiertas por culpa de tus posts hehe

  10. Si, justo a ese tipo de cosas me refería. También hay cosas más teóricas, tipo complejidad algorítimica (importante en escenarios donde importa el rendimiento), propiedades de sistemas distribuidos (muy útil ahora que la nube está tan de moda), etc.

Comentarios cerrados.