jueves, 30 de agosto de 2018

Lectura recomendada: "Computer Science Distilled: Learn the Art of Solving Computational Problems". Wladston Ferreira Filho

Para todos aquellos que quieren conocer de manera no excesivamente reglada, los fundamentos de las ciencias de computación o, aquellos que hace tiempo que no refrescan conceptos técnicos, este es un libro interesante que nos adentra de una manera amena los conceptos clave para aprender como resolver problemas mediante algoritmos.

Existen muchos libros con literatura técnica reglada, obviamente que hacen una tremenda función a los profesionales y estudiantes de ingenierías informáticas, grados o módulos...el motivo de esta entrada es no debatir sobre ellos.

    
Básicamente ante la amalgama de cursos, webs y libros para aprender de manera "relativamente" fácil la creación de código mediante algoritmos, quizás una aproximación inicial "no reglada", puede hacernos ver si vemos interesante pivotar nuestra carrera para adentrarnos en el mundo de las ciencias de computación.



EL libro puede servir de consulta o leerse en su totalidad como una novela, sin demasiada dificultad en el idioma. Con  un inglés accesible y algunos emoticones, el autor profundiza en los conceptos mas interesantes de consolidar, mediante enunciados que desarrollan un problema a resolver.


El idioma no es un handicap. Para todos aquellos que estemos acostumbrados a leer en inglés (nivel medio), se entiende todo lo que nos intenta instruir el autor. Citaré cada capitulo indicando un pequeño resumen de los temas tratados.

- "Basics": En el capítulo inicial el autor da nociones básicas de lógica, enumeraciones o recuentos y nos habla de probabilidades.


- Complexity: Dentro del capítulo de complejidad, intenta enseñarnos el concepto de cómo medir la eficiencia en tiempo y recursos de memoria de un determinado algoritmo. Determinados programas pueden consumir un espacio de memoria muy grande o necesitar mucho tiempo si y sólo si, la cantidad de datos en la entrada es ingente o desmesurado.

- "Strategy": Nos instruye en cómo elegir la mejor estrategia de diseño de algoritmo para un problema particular. Argumenta las estrategias de diseño siguientes: fuerza bruta, algoritmo codicioso, divide y vencerás, programación dinámica, algoritmo de retroceso, algoritmo de ramificación y acotamiento, decrementa y vencerás, método heurístico. Todos con ejercicios de ejemplo con su correspondiente pseudo-codificación.

- "Data": Cuando los programas (algoritmos) necesitan operar con datos, generalmente usamos módulos externos (librerías) que tienen "clases" y a su vez métodos definidos en cada uno de los tipos de datos abstractos (ADT). Nos habla de colas, pilas, árboles, arrays y tablas hash.

- "Algorithms": Introduce los algoritmos que un buen programador debe estar familiarizado (listas, grafos...). Ademas muestra algoritmos de búsqueda y ordenación.

- "Databases": Habla del software específico para el tratamiento de datos almacenados en memoria externa (disco duro). Los DBMS son vitales para cualquier solución sectorial de informática. Introduce el SQL, los conceptos de indexado, transacciones y relaciones entre tablas. Además indica que para determinadas soluciones, es mejor utilizar las bases de datos no relacionales (NoSQL). Obviamente teniendo en cuenta de no duplicar información en diferentes columnas de diferentes tablas...


Menciona las bases de datos distribuidas, así como pinceladas conceptuales de las bases de datos distribuidas (replicación y compartición). También cita los formatos de serialización mas conocidos: SQL, XML, JSON y CSV. Sirven para poder hacer un backup de los datos de la base de datos o, para poder exportarlo a otro sistema (restaurando los datos serializados). 



- "Computers": Entender las velocidades de acceso en el tiempo a la  memoria RAM, como mejora el computador ese cuello de botella mediante cache L1 y L2, entender las diferencia entre lenguajes de programación interpretados por una máquina virtual en lugar de ejecutados por un traductor (compilador) directamente al hardware de la máquina (CPU, RAM y HD o SSD), son conceptos tratados en este capítulo. Habla de código máquina con ejemplos de acceso al bus de datos + bus de direcciones.

- "Programming": Básicamente en este último capítulo el autor, usando pequeños trozos de pseudo-código, nos enseña los conceptos básicos de codificación. Variables, métodos, funciones, controles de flujo, iteraciones...diciéndonos al final que tendremos las agallas para poder abordar la codificación en cualquier lenguaje de programación.



Totalmente recomendable su lectura, para poder sacar polvo de los conocimientos adquiridos en la universidad o, para saber que es lo mas importante consolidar si la estamos cursando. O para dictaminar si no es lo que os puede gustar en el caso de escoger un camino de "developer" en este mundo IT.

Existirán pasajes técnicos del libro que no serán usados de manera práctica en nuestro día a día. Sólo en el caso de formar parte de equipos de desarrollo de fabricantes conocidos, la estrategia y la estructura de los datos, serán consumidos y explotados en nuestros proyectos.

Procesos de entornos de programación empresarial (ERP), precisan de ordenadores (hardware) muy potentes. Y aún así, ciertas demandas de los usuarios pueden presentar lentitud en sus respuestas por pantalla. Es importante conocer donde podemos tener un cuello de botella en nuestros algoritmos y, intentar refinar el desarrollo de software para mejorar su rendimiento.

Remarcar también la excelsa referencia al final de cada capítulo. En el caso de necesitar ampliar conocimientos, los links indicados son muy buenos.

Buen trabajo de Wladston Ferreira. Felicidades.

La cita:

"No tengo ningún talento especial. Sólo soy apasionadamente curioso." Albert Einstein.