Introducción rápida a LINQ con C#: manejar información en memoria nunca fue tan sencillo

21/08/2019
Artículo original

Como programadores, es muy habitual tener que trabajar sobre colecciones de datos por un motivo u otro, seleccionar datos, agruparlos, sumarlos ...

Una manera muy socorrida de trabajar con este tipo de datos es recorrer la colección. De hecho, es la solución para la gran mayoría de los lenguajes y la que mejor rendimiento nos ofrece.

Suponiendo que tenemos una lista de enteros, si queremos sumarlos podríamos hacer algo así:

var valores = new List<int> {1,2,3,4,5,6,7,8,9};
var suma = 0;
foreach (var valor in valores)
{
    suma += valor;
}

O si por ejemplo, queremos buscar los números que sean pares:

var valores = new List<int> {1,2,3,4,5,6,7,8,9};
var pares = new List<int>();
foreach (var valor in valores)
{
    if (valor % 2 == 0)
    {
        pares.Add(valor);
    }
}

La lista de ejemplos es infinita, y siempre vamos a poder encontrar una solución iterando la colección, pero... ¿Es la mejor opción?

¿Qué es LINQ?

Dicho de manera sencilla, LINQ (Language Integrated Query) es un conjunto de extensiones integradas en el lenguaje C#, que nos permite trabajar de manera cómoda y rápida con colecciones de datos, como si de una base de datos se tratase. Es decir, podemos llevar a cabo inserciones, selecciones y borrados, así como operaciones sobre sus elementos.

Language-Integrated Query (LINQ) es el nombre de un conjunto de tecnologías basadas en la integración de capacidades de consulta directamente en el lenguaje C#

Fuente: MSDN

Todas estas operaciones las vamos a conseguir muy fácilmente gracias a los métodos de extensión para colecciones que nos ofrece el espacio de nombres "System.Linq" y a las expresiones lambda. Sin ir más lejos, los dos ejemplos anteriores se podrían hacer así:

var valores = new List<int> {1,2,3,4,5,6,7,8,9};
var suma = valores.Sum();
var pares = valores.Where(x => x % 2 == 0).ToList();

Como se puede comprobar, la lectura es mucho más clara, por lo que ganamos en mantenibilidad del código.

En el ejemplo anterior, vemos que LINQ puede devolvernos valores de operaciones, o devolvernos colecciones.

Seguramente te hayas fijado en el ToList() del segundo caso. Esto es porque LINQ siempre nos va a devolver un objeto de tipo IEnumerable<T>, el cual debemos iterar. Hasta que no lo iteremos, la consulta no se ha ejecutado todavía, y solo tenemos una expresión sobre una colección, por eso invocamos ToList() para forzar la ejecución de la consulta.

Sobre la ejecución diferida de consultas se puede hablar largo y tendido ya que es una materia en sí misma. Para más información puedes consultar este enlace.

Vamos a ver un resumen de algunas de sus herramientas más útiles.

Para los ejemplos, vamos a suponer una clase como esta:

public class Alumno
{
    public string Nombre { get; set; }

    public int Nota { get; set; }
}

Y partamos de la base de que tenemos una colección de alumnos como esta:

var alumnos = new List<Alumno>
{
    new Alumno {Nombre = "Pedro",Nota = 5},
    new Alumno {Nombre = "Jorge",Nota = 8},
    new Alumno {Nombre = "Andres",Nota = 3}
};

Ahora veamos algunas de las operaciones que podemos llevar a cabo con LINQ sobre esta:

Select

Nos va a permitir hacer una selección sobre la colección de datos, ya sea seleccionándolos todos, solo una parte o transformándolos:

var nombresAlumnos = alumnos.Select(x => x.Nombre).ToList();

Where

Nos permite seleccionar una colección a partir de otra con los objetos que cumplan las condiciones especificadas:

var alumnosAprobados = alumnos.Where(x => x.Nota >= 5).ToList();

First/Last

Esta extensión nos va a permitir obtener respectivamente el primer y el último objeto de la colección. Esto es especialmente útil si la colección está ordenada.

var primero = alumnos.First();
var ultimo = alumnos.Last();

OrderBy

Gracias a este método, vamos a poder ordenar la colección en base a un criterio de ordenación que le indicamos mediante una expresión lambda. Análogamente, también existe OrderByDescending, el cual va a ordenar la colección de manera inversa según el criterio:

var ordenadoMenorAMayor = alumnos.OrderBy(x => x.Nota).ToList();
var ordenadoMayorAMenos = alumnos.OrderByDescending(x => x.Nota).ToList();

Sum

Como hemos visto más arriba, nos va a permitir sumar la colección:

var sumaNotas = alumnos.Sum(x => x.Nota);

Max/Min

Gracias a esta extensión, vamos a poder obtener los valores máximo y mínimo de la colección:

var notaMaxima = alumnos.Max(x => x.Nota);
var notaMinima = alumnos.Min(x => x.Nota);

Average

Este método nos va a devolver la media aritmética de los valores (numéricos) de los elementos que le indiquemos de la colección:

var media = alumnos.Average(x => x.Nota);

All/Any

Con este último operador, vamos a poder comprobar si todos o alguno de los valores de la colección cumplen el criterio que le indiquemos:

var todosAprobados = alumnos.All(x => x.Nota >= 5);
var algunAprobado = alumnos.Any(x => x.Nota >= 5);

Sintaxis integrada

Aunque en los ejemplos anteriores hemos visto el uso directo de los métodos de extensión, otra de las grandes ventajas que tiene LINQ es que permite crear expresiones directamente en el código, de manera similar a si escribiésemos SQL directamente en C#. Por ejemplo:

var resultado = from alumno in alumnos
                where alumno.Nota >= 5
                orderby alumno.Nota
                select alumno;

nos devolverá la lista de alumnos que tienen una nota superior a o igual a 5, ordenados por nota ascendentemente.

¿No es algo casi mágico?

Ventajas y desventajas

Ahora que hemos visto un poco por dónde pisamos, es hora de que hablemos sobre las ventajas y desventajas que nos puede aportar utilizar LINQ en vez de iterar las colecciones.

La principal y única desventaja que tiene, es que es un poco más lenta que si utilizásemos bucles for o foreach para iterar la colección y hacer la operación. Por supuesto esto no es apreciable en prácticamente ninguna situación convencional, pero en entornos donde cada milisegundo cuenta, debes conocer que tiene un impacto.

Por otro lado, las ventajas que nos aporta LINQ son principalmente que el código es más legible, ya que utiliza una sintaxis muy declarativa de lo que está haciendo, y sobre todo, nos ofrece una manera unificada de acceder a datos, sean el tipo que sean, y tengan el origen que tengan. Por ejemplo, podemos utilizar LINQ para trabajar con bases de datos, con XML, con Excel, con objetos en memoria, ¡y hasta con Twitter!

Resumiendo

Pese a que en esta entrada solo hemos hecho una pequeña introducción con un resumen reducido de las extensiones más frecuentes que nos aporta LINQ (créeme que muy pequeño... te recomiendo mirar el espacio de nombres y ver todas sus opciones), es una herramienta muy potente. Tanto, que otros lenguajes la han implementado también.

Si bien es cierto que existe una merma de rendimiento respecto a iterar el bucle directamente, el rendimiento perdido en el 99,99% de los casos se compensa con el beneficio que aporta tener un código claro, legible y mantenible.

Real Dev: desafíos para desarrolladores que ponen a prueba tus habilidades en la vida real

19/08/2019
Artículo original

Real Dev: desafíos para desarrolladores que ponen a prueba tus habilidades en la vida real

Real Dev es una nueva e interesante plataforma creada para que los programadores pongan a prueba sus habilidades resolviendo desafíos, en estos tendrán que resolver problemas que se pueden presentar en diferentes escenarios de la vida real.

Sus creadores creen que a la hora de contratar desarrolladores es mucho más importante evaluar las habilidades prácticas a la hora de solucionar un problema real, que estar resolviendo acertijos con algoritmos.

La propuesta es utilizar la plataforma de Real Dev como un sitio en el que los desarrolladores pueden practicar y aprender. Sus retos han sido extraídos de proyectos y código que está actualmente en producción, el código se prueba automáticamente, y también tienen una tabla de liderato para quienes participen.

10 desafíos para poner a pruebas tus habilidades como programador

De momento han lanzado el sitio con 10 desafíos diferentes (aunque planean añadir más) en los que se muestran problemas técnicos reales que se presentan en múltiples escenarios, como por ejemplo a la hora de armar los endpoints de un servidor HTTP, o escribir un script que haga algo, o armar el frontend de una página web, etc.

En Real Dev puedes iniciar sesión con tu email o con tu cuenta de GitHub, tras ello tendrás acceso a la lista de desafíos, solo tienes que elegir uno, instalar el CLI de forma local, iniciar sesión y comenzar a escribir código.

Puedes enviar la solución a cualquier hora del día, cualquier día de la semana. Ellos te ofrecen una herramienta de línea de comandos para que envíes el código y ellos lo reproducen en la nube para darte feedback instantáneo. Puede seguir practicando y Real Dev juzgará tu código con varios casos de prueba.

Zoncolan: así es la herramienta de Facebook para encontrar bugs de seguridad capaz de analizar todo su código en media hora

19/08/2019
Artículo original

Zoncolan: así es la herramienta de Facebook para encontrar bugs de seguridad capaz de analizar todo su código en media hora

Cuando un proyecto informático tiene el tamaño de Facebook, se hace necesario contar con herramientas que agilicen, entre otras muchas cosas, el hallazgo de bugs en sus millones de líneas de códigos. Para ello, en cuanto a seguridad, la compañía presume de haber desarrollado Zoncolan, una herramienta de análisis estático que permite encontrar bugs en ramas individuales y otros que afectan a ramas que interactúan entre sí.

Lo que aporta frente a la revisión manual es, sobre todo, velocidad, pero también mucha ayuda automatizada que, además de notificar sobre bugs, también ofrece información en tiempo real sobre posibles problemas que pueden surgir si se introducen ciertos cambios en el código.

Una vez se hacen las propuestas de cambios, Zoncolan comienza a escanear todo el código, y avisará al programador que haya introducido las líneas o a ingenieros de seguridad. Según Pieter Hooimeijer, manager de ingeniería de seguridad en Facebook, el año pasado, Zoncolan localizó 1.500 problemas en el código.

Zoncolan puede sustituir a personas en la detección de problemas, pero las sigue necesitando para mejorar

Zoncolan

En la web que Facebook ha lanzado sobre Zoncolan, la compañía afirma que como cualquier sistema de este tipo (refiriéndose al análisis estático), Zoncolan no puede encontrar todos los problemas, pero sí **permite encontrar algunas clases de problemas (y prevenir futuros) que se pueden solucionar de una vez y retroactivamente.

El problema de Zoncolan, como todas las herramientas de su tipo, es que es muy eficaz para encontrar bugs, pero de momento no capaz aprender de forma autónoma a saber qué es un bug, sino que tienen que ser los ingenieros los que establezcan reglas que indiquen los factores que pueden ser problemáticos. Aunque en el futuro probablemente esto cambie, Zoncolan puede escanear todo el código en tan solo 30 minutos, por lo que lo que ayuda en su forma actual ya es de gran valor.

Facebook explica así cómo Zoncolan ayuda a escalar el trabajo y crear reglas:

  • Un ingeniero de seguridad puede verificar los hallazgos sin tener que pasar horas incalculables revisando código manualmente.
  • Podemos utilizar una regla codificada para evitar que en el futuro se repita el mismo problema. Zoncolan funciona con miles de cambios de código por día antes de que el código se envíe a producción, y nos alerta de los problemas. Nuestro repertorio de reglas ha crecido con el tiempo, y podemos agregarlo o perfeccionarlo según sea necesario.
  • Las reglas por sí mismas sirven como documentación de los problemas de las clases. Una vez disponible como regla de Zoncolan, es más fácil para los ingenieros de seguridad examinar los matices de la regla en sí y los problemas que hemos encontrado como resultado. Este proceso ayuda a educar a los ingenieros sobre lo que deben buscar en el futuro. También puede informar las decisiones para construir mejores bibliotecas y marcos de trabajo, para eliminar clases de problemas por completo.

La compañía afirma que Zoncolan utiliza una técnica llamada "interpretación abstracta" para seguir las entradas controladlas por el usuario en la base del código. Analizando el código, es capaz de construir estructuras representando por una parte las funciones del código, con un gráfico de control de flujo, y por otra cómo interactúan, en un gráfico de llamadas. Zoncolan crea después un resumen del comportamiento de cada función, y registra solo propiedades relevantes para flujos de información potencialmente peligrosos.

La ejecución abstracta sigue todas las rutas del control, y analiza las ramas del código (como un "if"), individualmente y luego uniendo los resultados, de forma que se evalúan todos los caminos posibles a la vez. Facebook afirma estar trabajando para hacer proporcionar las herramientas de Zoncolan como código abierto para que otras compañías y desarrolladores puedan utilizarlas en sus productos.

Vía | Wired

Paquetes en Java: qué son, para qué se utilizan, y cómo se usan (con vídeo)

14/08/2019
Artículo original

Imagen ornamental. Cajas con Java escrito en la tapa. Foto original de Leone Venter en Unsplash

Los paquetes son el mecanismo que usa Java para facilitar la modularidad del código. Un paquete puede contener una o más definiciones de interfaces y clases, distribuyéndose habitualmente como un archivo. Para utilizar los elementos de un paquete es necesario importar este en el módulo de código en curso, usando para ello la sentencia import.

La funcionalidad de una aplicación Java se implementa habitualmente en múltiples clases, entre las que suelen existir distintas relaciones. Las clases se agrupan en unidades de un nivel superior, los paquetes, que actúan como ámbitos de contención de tipos. Cada módulo de código establece, mediante la palabra clave package al inicio, a qué paquete pertenece. Como ya sabrás, con la cláusula import cualquier módulo de código puede hacer referencia a tipos definidos en otros paquetes.

Vamos a familiarizarnos con los procedimientos para construir paquetes, para referenciarlos desde otros puntos y también veremos la relación existente entre paquetes, clases y el sistema de archivos donde se almacena el proyecto.

Creación de paquetes

Un paquete Java se genera sencillamente incluyendo la palabra clave package al inicio de los módulos de código en los que se definen las clases que formarán parte del mismo. Trabajando en un proyecto con NetBeans, comprobaremos que en la ventana Projects los paquetes se representan con un icono específico y actúan como nodos contenedores, alojando los módulos .java con el código fuente. El menú contextual del proyecto nos ofrece la opción New>Java Package, que será el que usemos habitualmente para crear un nuevo paquete:

Creación de un nuevo paquete en Netbeans

Nota: cada vez que se crea un nuevo proyecto con NetBeans se propone la definición de un nuevo paquete, cuyo nombre sería el mismo del proyecto, donde se alojarían los módulos de código. En proyectos complejos, no obstante, puede ser necesaria la creación de paquetes adicionales.

Un paquete puede contener, además de definiciones de tipos como las clases e interfaces, otros paquetes, dando lugar a estructuras jerárquicas de contenedores. La denominación de los subpaquetes, paquetes contenidos en otros, se compondrán del identificador del contenedor seguido de un punto y el nombre del subpaquete. De existir niveles adicionales se agregarían los distintos identificadores separados por puntos, formando así el nombre completo del paquete.

El diagrama siguiente representa el contenido de un paquete llamado campusmvp, teóricamente correspondiente a un proyecto de aplicación de contabilidad. En ese paquete de primer nivel tenemos un subpaquete con utilidades, llamado campusmvp.util, no directamente vinculadas con la aplicación de contabilidad. El subpaquete campusmvp.conta contendría todos los elementos asociados a dicha aplicación, distribuidos a su vez en un tercer nivel de paquetes que contienen las clases correspondientes al modelo, la vista, etc., siguiendo al patrón arquitectónico MVC. Cada uno de los módulos de definición de clase, denominados Cuenta.java, Movimiento.java, Vista.java, etc., comenzarían con una cláusula package indicando el nombre completo del paquete al que pertenecen:

Estructura jerárquica de paquetes

Nota: todas las clases que pertenecen a un mismo paquete comparten un ámbito común, al que pertenecerán aquellos miembros que no especifiquen explícitamente otro tipo de visibilidad.

Importación de paquetes

Los paquetes Java son como cajas de herramientas, cada una de ellas con una colección distinta de instrumentos útiles para nuestro trabajo, a las que podemos necesitar acceder cada vez que abordamos el desarrollo de un nuevo proyecto. Es en este contexto donde recurriremos a la cláusula import, a fin de importar en el ámbito actual las definiciones de otro paquete y poder usarlas según el procedimiento habitual, creando objetos, accediendo a los servicios de las clases, etc.

La cláusula import puede utilizarse para importar un elemento concreto de un paquete, facilitando el nombre de este seguido de un punto y el identificador de dicho elemento. Por ejemplo, para importar la clase Math del paquete java.lang, pudiendo así acceder a la constante PI y las funciones matemáticas que aporta, bastaría con la siguiente línea:

import java.lang.Math;

Es habitual que al importar un paquete nos interesen muchas de las clases definidas en el mismo. En este caso podríamos importarlas individualmente, usando la sintaxis anterior, o bien podríamos recurrir a la siguiente alternativa. Esto nos permitiría usar la clase Math, así como la clase System, la clase Thread y muchas otras definidas en el paquete java.lang:

import java.lang.*;

En ocasiones, como ocurre con la clase Math, importamos una clase para acceder directamente a sus miembros estáticos, constantes y métodos, no para crear objetos a partir de ellas, lo que nos fuerza a utilizar constantemente la sintaxis Clase.miembro, por ejemplo Math.PI o Math.sin(). Si tras importar la clase Math intentamos referirnos a estos miembros simplemente por su nombre, como se hace en la mitad superior de la siguiente imagen, obtendremos un error. En estos casos podemos recurrir a la sintaxis import static paquete.clase.*, cuya finalidad es incluir en el ámbito actual los miembros estáticos de la clase indicada. Es lo que se hace en la mitad inferior de la siguiente imagen:

Importación de paquetes

Relación entre clases, paquetes y el sistema de archivos

En Java existe una estrecha relación entre las definiciones de paquetes y clases y el sistema de archivos local, en el que se almacenan los módulos conteniendo el código. Es un hecho que puede pasarnos totalmente inadvertido al trabajar con un IDE como el de NetBeans, ya que sus opciones se encargan de ocultar estos detalles. No obstante, es interesante que conozcamos dicha relación ya que esto nos permitirá, en caso de necesidad, trabajar directamente con el JDK.

Cada módulo de código de un proyecto Java únicamente puede contener una clase pública, cuyo nombre, respetando mayúsculas y minúsculas, debe coincidir con el del módulo. Es decir, existe una correspondencia directa entre los identificadores de clase y archivos en los que se alojan. Esto no afecta a las clases anidadas y otras clases no públicas que pudiesen definirse en el mismo módulo.

El nombre del paquete establece además el nombre de la carpeta donde se alojan los módulos de código contenidos en el paquete. Los nombres de paquete pueden ser compuestos, usándose el punto como separador de las diferentes porciones del identificador. Cada parte identificaría a un subdirectorio, según se muestra en el siguiente esquema:

Esquema sistema de archivos

Al trabajar desde la línea de comandos, usando directamente el JDK, hemos de tener en cuenta que tanto la compilación como la ejecución verificarán que se satisface la correspondencia entre el nombre de paquete y clase y la estructura de directorios y nombre de archivo. Si esta no se cumple en algún punto, como ocurre en la parte inferior de la siguiente imagen, se obtiene un error.

Relación entre paquete y sistema de archivos

Nota: la estructura de directorios de un paquete puede almacenarse completa, una vez se compila el proyecto, en un archivo JAR. Este contendría asimismo los archivos de clase de cada módulo de código.

A continuación puedes ver un vídeo práctico explicativo de todo lo anterior, que está extraído directamente del curso de programación con Java de campusMVP:

[youtube:x4BDc-VGeZY]

De Linux a Python: iníciate en el mundo del hacking ético con este curso gratuito de 15 horas para principiantes

12/08/2019
Artículo original

De Linux a Python: iníciate en el mundo del hacking ético con este curso gratuito de 15 horas para principiantes

En Genbeta siempre estamos buscando las mejores opciones que ofrece Internet para aprender algo nuevo y compartirlas con ustedes. Esta vez nos hemos encontrado con un interesante curso ofrecido por la plataforma de freeCodeCamp desde su canal de YouTube.

Se trata de un curso de 15 horas sobre penetration testing orientado a principiantes que se quieren iniciar en el mundo del hacking ético. En él aprenderás todas las habilidades prácticas para trabajar en ese campo.

Sin embargo, aunque está orientado a principiantes, el curso tiene bastante profundidad, te enseñarán a desarrollar un Active Directory en Windows, a hacerlo vulnerable, a hackearlo y a parchearlo.

Curso completo de hacking ético

El curso está dividido en 11 partes, los temas a tratar incluyen desde Linux, a Python, pasando por todo tipo de herramientas de escaneo y tácticas de explotación, hasta un final sobre cómo escribir reportes y consejos para tu carrera.

Para las tareas que se te darán durante el curso tienes disponible un repositorio en GitHub que además contiene el plan de estudios completo con todas las lecciones organizadas y bien descritas.

Sobra decir que todo el material está completamente en inglés. Este curso fue dictado inicialmente en Twitch por The Cyber Mentor que también tiene el material alojado en su web personal. Además, varios participantes del curso y otros miembros de sas comunidad tienen un canal en Discord donde comparten información y al que puedes acudir si tienes dudas.

¿Cómo edito metadatos de archivos de word?

06/08/2019
Artículo original

Hola comunidad, solicitando su valioso apoyo, estoy tratando de modificar los metadatos de un archivo de word de office 365, con la librería de POI 3.9 como muestro a continuación.

       public static void main(String[] args) throws FileNotFoundException, InvalidFormatException, IOException {
        FileInputStream fs = new FileInputStream("D:\\text2.docx");
        OPCPackage opc = OPCPackage.open(fs);
        opc.getPackageProperties().setDescriptionProperty("pprrueba");
        opc.getPackageProperties().setTitleProperty("seeeee");
        opc.getPackageProperties().setRevisionProperty("666");
        opc.flush();
        opc.close();
        fs.close();
    }
//hasta este punto si los modifica en tiempo de ejecución, pero al archivo físico no le hace nada.

En todas las fuentes que consulté no alcanzo a visualizar en que momento está modificación se guarda en mi archivo. Por lo tanto aunque ejecute esta rutina no sucede nada, en el archivo no cambia los metadatos cuando los veo desde las propiedades del documento.

leer más

Aprende como un atleta

01/08/2019
Artículo original

Este artículo es una traducción del artículo "Learn Like an Athlete" de David Perell realizada con su permiso expreso. El énfasis en negrita es nuestro. David es un conocido escritor, blogger, conferenciante y emprendedor nacido en San Francisco pero residente en Nueva York. Es el anfitrión del podcast Northstar en el que entrevista a multitud de gente interesante y conocida del mundo del emprendimiento tecnológico, ciencia, sociedad...

LeBron James no ha tenido siempre tríceps poderosos, unos tremendos abdominales, y los brazos del Increíble Hulk.

Si le preguntases a LeBron sobre su pauta de entrenamiento fuera de temporada, te pasaría un resumen detallado de su plan de ejercicios y de la rutina de práctica en la cancha. Cuando entró en la NBA, LeBron no era un tirador potente. Me apuesto lo que quieras a que al principio de su carrera, LeBron construyó su régimen de entrenamiento fuera de temporada alrededor de su debilidad en el tiro en salto y su decepcionante porcentaje de aciertos de campo del 42% durante su temporada de novato. Como revelan sus publicaciones en Instagram, LeBron trabajó en mejorar su fuerza, su agilidad, su historial impecable de evitar lesiones y un sobresaliente porcentaje de aciertos de campo del 54% durante su 14ª temporada en la NBA.

Evolución de aciertos de Lebron James por temporada - Dibujo original de David Perell

Los atletas entrenan. Los músicos entrenan. Los artistas entrenan. Sin embargo. los trabajadores del conocimiento no lo hacen.

Los trabajadores del conocimiento deberían entrenarse como LeBron e implementar estrictos "planes de aprendizaje". Sin duda, la vida intelectual es diferente del baloncesto. El éxito es más difícil de medir y las métricas de mejora no son tan claras. Aún así, tenemos mucho que aprender de la forma en la que entrenan los mejores atletas. Son claros en sus objetivos y premeditados en su búsqueda de mejora.

Los trabajadores del conocimiento deberían imitarlos.


¿Cómo debe ser un plan de aprendizaje?

De manera similar a como LeBron estructura su entrenamiento para ganar campeonatos de la NBA, los trabajadores del conocimiento deberían entrenarse para desarrollar habilidades, completar proyectos y aumentar su capacidad productiva. Armados con un sistema efectivo, aprenderemos más rápido y nos divertiremos más haciéndolo.

Mi amigo Nick Maggiulli es un caso de estudio sobre cómo construir de un plan de aprendizaje.

En 2015 decidió aprender un lenguaje de programación llamado R. Dos años después, era un experto en ciencia de datos. Esa nueva habilidad impulsó a Nick a su próximo esfuerzo a largo plazo, un blog personal. Nick comenzó a escribir una publicación en su blog todos los martes, a partir del 1 de enero de 2017. Adelantamos la película rápidamente al día de hoy, y resulta que ha hecho una publicación cada semana durante las últimas 131 semanas seguidas. A pesar de su éxito, su búsqueda del conocimiento es implacable. La última vez que visité su apartamento, vi un libro de 850 páginas sobre leyes fiscales en la mesa de su sala. Lo que planea es dedicar el próximo año a estudiar el código tributario estadounidense para poder saber tanto sobre la legislación fiscal como cualquier persona en su empresa.

Nick debería servir como un modelo a seguir para todos nosotros.

Incluso entre los individuos más ambiciosos, los planes de aprendizaje son raros. La mayoría de las personas son reactivas. No hacen planes. Como los surfistas en un océano violento, se rinden a su entorno. Dirigen su atención hacia los interminables gritos de newsletters, recomendaciones de amigos y feeds de redes sociales.

Podemos hacerlo mejor.


¿Qué debes hacer?

Aprende en sprints de tres meses y comprométete con un nuevo proyecto de aprendizaje cada trimestre.

Incluso los proyectos más largos son simplemente una colección de tareas a corto plazo. Sabiendo eso, debes desglosar el proyecto en incrementos diarios y crear una serie de objetivos diarios y semanales que te permitan aprender las habilidades necesarias para completar el proyecto a tiempo.

El objetivo final debe estar claro. Comienza por escribir una visión positiva para tu futuro. Enfócate en el objetivo final, no en la habilidad en sí misma. Por ejemplo, yo en lugar de decir "Quiero aprender a dibujar", me centré en el objetivo final: "de hoy en adelante, todos los cuadros, gráficos e imágenes de mi sitio web los dibujaré a mano".

Esquema del proceso de aprendizaje propuesto, dibujado por David Perell

Me gusta el framework de Daniel Gross para el aprendizaje. Cuando lo entrevisté, me dijo que construyera un videojuego para mi propio uso. Al igual que un videojuego, los proyectos productivos tienen múltiples niveles. Siguen el principio de "Ricitos de oro": ni demasiado fácil, ni demasiado difícil. El proyecto de aprendizaje debe ser lo suficientemente desafiante para exigir foco, pero lo suficientemente fácil como para lograr un progreso constante. De esta manera, puedes acceder al estado óptimo del aprendizaje.

Si te quedas atascado, el "videojuego" es demasiado difícil. Cuando esto suceda, deberías parar. Busca dar un paso más pequeño o cambia a un desafío más manejable. De otro modo perderás la motivación para seguir aprendiendo. Por el contrario, si estás aburrido, el "videojuego" no es lo suficientemente difícil, por lo que deberías intentar un desafío más difícil que no hayas hecho antes.

Todo el mundo adora las cosas nuevas. Incluso si tu plan de aprendizaje está limitado por un objetivo estricto, los detalles deben ser flexibles. Las actividades deben ser lo suficientemente cohesivas para mantenerte en el camino, pero lo suficientemente diversas para mantenerte interesado. Por ejemplo, si deseas aprender sobre la carrera espacial entre Estados Unidos y la Unión Soviética, puedes leer libros, ver documentales, escuchar podcasts con astronautas, y explorar artículos de periódicos de ese período. Elige lo que te emocione, siempre que sirva al objetivo final.

Te animo también a compartir tus aprendizajes. Publica un ensayo, una reseña de un libro, un proyecto de arte o haz tu proyecto Open Source. Compartir tus ideas te ayudará a digerirlas, y si tus publicaciones son interesantes, puedes atraer expertos en el campo que te interesa.

Si puedes publicar los hallazgos que hagas por el camino, aún mejor. Compartir tu trabajo es la mejor manera de acelerar tus bucles de retroalimentación, lo que te ayudará a aprender más rápido y mejorar tu plan en función de los comentarios que recibas. Por ejemplo, estoy aprendiendo a dibujar, y es por eso que he incluido dibujos en este artículo.

Si quieres aprender a programar, publica tu software en Github. Si quieres aprender a tocar la guitarra, comparte tu música en Instagram. Y si quieres mejorar tu escritura, comienza un blog. Compartir tu trabajo es como invitar a amigos a tu casa. Te obliga a tener todo limpio y a revisarlo, lo que acelera el proceso de aprendizaje.


Aprende como un atleta

Cuanto más aprendes, más fácil es aprender. Elige los proyectos correctos y desarrollarás un efecto de red sobre tu persona, gracias al cual cada nueva habilidad aumentará el valor de las habilidades que ya posees.

Cada vez que completes un desafío de aprendizaje mejorarás tu proceso. Cada vez que pases por todo el ciclo, de principio a fin, descubrirás facetas sobre ti mismo, acelerarás tu proceso de aprendizaje y, en última instancia, aprenderás como un atleta.

Por cierto, he creado una plantilla en Google Sheets para ayudarte a aprender como un atleta.

Uno de los cursos gratis sobre Python más populares a nivel mundial ahora está disponible en español y puedes inscribirte ya

24/07/2019
Artículo original

Uno de los cursos gratis sobre Python más populares a nivel mundial ahora está disponible en español y puedes inscribirte ya

Si alguno de tus planes de verano incluyen aprender algo nuevo, en Genbeta tenemos una buena selección de cursos online gratuitos que comienzan en julio y que en muchos casos puedes tomar a tu propio ritmo.

Si en tu caso lo que te interesa es la programación, quizás te venga de perlas este excelente curso de Python de la Universidad de Michigan alojado en la plataforma edX. Es uno de los más populares en la web, y por primera vez ha sido traducido completamente al español.

Programación para todos (empezando con Python)

Python

Es un curso básico para principiantes sin ningún requisito previo, en él aprenderás todo lo básico de la programación usando Python. Python es uno de los lenguajes de programación con más demanda y aplicaciones a nivel mundial, además de ser el favorito de muchos programadores.

El curso fue desarrollado por Charles Severance, profesor asociado en la Escuela de Información de la Universidad de Michigan, quien ha enseñado varios cursos enfocados en tecnología, incluyendo programación, diseño de base de datos, y desarrollo web.

Charles se dedicó a crear este curso con la premisa en mente de que a pesar de que ya existían muchos cursos de Python para principiantes, ninguno parecía dirigido realmente a principiantes reales, es decir, estudiantes sin ninguna capacitación técnica o conocimiento de matemáticas.

Como todos los cursos en edX, la inscripción es completamente gratuita y está abierta a partir de este 24 de julio de 2019. Solo la obtención de un certificado cuesta dinero. La duración es de unas 7 semanas y requiere un esfuerzo de aproximadamente unas 2 a 4 horas semanales.

¿Aprender SQL en Agosto?, gratis y por email. Descubre nuestra Escuela de Verano

23/07/2019
Artículo original

CampusMVP no para en verano y, aunque el cuerpo nos pide descanso, queremos aprovechar para ayudaros un poquito a mejorar como programadores. Lanzamos nuestra ESCUELA DE VERANO con un programa para aprender SQL.

Se trata de una formación abierta, gratuita y disponible para todos los que quieran aprender los fundamentos de uno de los lenguajes indispensables en el día a día de un programador, SQL.

Este micro-curso a través de email te llevará de la mano para que puedas aprender los fundamentos de hacer consultas a bases de datos. Parte de cero absoluto y te enseña a extraer información de cualquier base de datos: SQL Server, Oracle, MySQL, PostgreSQL...

El programa está formado por un temario de 7 lecciones que permitirán al alumno descubrir los fundamentos de esta tecnología. Las clases se abrirán paulatinamente durante las 4 semanas del mes de Agosto.

Si estás interesado solicita tu plaza aquí.

 

Rust no es solo el más amado por los programadores, también podría ser el lenguaje que reemplace a C/C++ en Microsoft

18/07/2019
Artículo original

Rust no es solo el más amado por los programadores, también podría ser el lenguaje que reemplace a C/C++ en Microsoft

A pesar de ser relativamente desconocido, especialmente frente a lenguajes del tope de la lista de favoritos como Java, Python o JavaScript, Rust se ha convertido en el lenguaje más amado de muchos programadores a pesar de haber surgido apenas en 2010.

Rust nació dentro de Mozilla como una solución para escribir código muy rápido al mismo nivel que con C o C++, pero sin los problemas de gestión de memoria de estos, y es justamente esa la razón por la que en Microsoft también están considerando pasarse a Rust.

Como ha explicado Gavin Thomas, director principal de ingeniería de seguridad para el Microsoft Security Response Center (MSRC), la empresa está explorando formas de crear código más seguro, enfocándose especialmente en los problemas que afectan mayoritariamente no solo a sus productos, sino a la industria en general: los bugs en la gestión de memoria.

El 70% de las vulnerabilidades que Microsoft parchea están relacionadas con problemas en la gestión de memoria

Graph 1024x398 Azul oscuro: vulnerabilidades en la gestión de memoria - Azul claro: vulnerabilidades que no son de gestión de memoria

Desde el 2004, el MSRC ha rastreado cada vulnerabilidad de seguridad de Microsoft reportada. De todo ese triaje se desprende un hecho asombroso: la mayoría de las vulnerabilidades corregidas son causadas por desarrolladores que sin darse cuenta insertan errores de corrupción de memoria en su código C y C++.

Y, ahora que Microsoft está aumentando su base y usando cada vez más software open source en su código, el problema está empeorando. La solución: optar por lenguajes de programación con gestión de memoria segura.

Tanto Windows como la mayoría de los productos de Microsoft están escritos principalmente en C y C++, estos tienen la ventaja de ser sumamente rápidos, son lenguajes maduros y extremadamente eficientes.

Sin embargo, son dos lenguajes de programación considerados como inseguros en cuanto a la gestión de memoria, esto quiere decir que errores en el código pueden causar una cascada de bugs que los atacantes pueden explotar con consecuencias graves, como en vulnerabilidades de ejecución remota de código o de privilegios elevados.

Por qué Rust

Rust

Rust es uno de los lenguajes más prometedores a la hora de subsanar los problemas de C/C++ sin perder esa eficacia y rapidez característica. Aunque en Microsoft desarrollaron C#, un lenguaje que mejora la gestión de memoria en comparación con estos, sigue siendo menos avanzado que Rust.

Rust fue desarrollado desde cero con protecciones pensadas especialmente para una excelente gestión de memoria segura garantizada en tiempo de compilación. Rust incluso logra tener valores muy cercanos o hasta mejores que C/C++ en los tiempos de ejecución.

Microsoft continuará explorando más lenguajes de programación seguros, de momento van a comenzar con Rust, que además de tener el amor de muchos programadores ya es usado en amplia variedad de proyectos importantes, no solo es parte esencial de Firefox Quantum, sino que también es usado por empresas como Dropbox, Yelp, Amazon, RedHat, LINE, System76, Coursera, CloudFlare, Reddit, Twitter, y muchas más.

Página Anterior Página Siguiente