Si eres un autodidacta para estudiar ciencias de la computación, debes aprender ciencias de la computación. Afortunadamente, puedes darte una educación CS de clase mundial sin invertir años y una pequeña fortuna en un programa de estudios.
Hay muchos recursos disponibles, pero algunos son mejores que otros. No necesitas otra lista de “Más de 200 cursos gratuitos en línea”. Necesita respuestas a estas preguntas:
- ¿Qué materias deberías aprender, y por qué?
- ¿Cuál es el mejor libro o serie de conferencias de video para cada materia?
Esta guía es nuestro intento de responder de manera definitiva a estas preguntas.
TL; DR:
- ¿Por qué crees que la gente debería aprender a programar?
- Cómo aprender sobre energía solar en 1 hora.
- ¿Cómo se convierte uno en un dentista en Alemania?
- Desde una perspectiva informada por el aprendizaje automático, ¿qué tipo de proceso cognitivo es la curiosidad?
- Cómo enseñar a los estudiantes lentos en quinto grado
Estudie los nueve temas a continuación, aproximadamente en el orden presentado, utilizando el libro de texto sugerido o la serie de conferencias en video, pero idealmente ambos. Apunta a realizar entre 100 y 200 horas de estudio de cada tema, luego revisa los favoritos a lo largo de tu carrera.
Tema
¿Por qué estudiar?
Mejor libro
Mejores videos
Programación
No seas la persona que “nunca entendió” algo como la recursión.
Estructura e interpretación de programas informáticos.
Berkeley CS 61A de Brian Harvey
Arquitectura de Computadores
Si no tiene un modelo mental sólido de cómo funciona realmente una computadora, todas sus abstracciones de alto nivel serán frágiles.
Organización y diseño informático
Berkeley CS 61C
Algoritmos y estructuras de datos
Si no sabe cómo utilizar estructuras de datos ubicuas como pilas, colas, árboles y gráficos, no podrá resolver problemas difíciles.
El manual de diseño de algoritmos
Conferencias de Steven Skiena
Matemáticas para CS
CS es básicamente una rama fuera de control de las matemáticas aplicadas, por lo que aprender matemáticas te dará una ventaja competitiva.
Matemáticas para la informática
MIT 6.042J de Tom Leighton
Sistemas operativos
La mayoría del código que escribes es ejecutado por un sistema operativo, por lo que debes saber cómo interactúan.
Sistemas operativos: Tres piezas fáciles
Berkeley CS 162
Redes de computadoras
Internet resultó ser un gran problema: comprende cómo funciona para desbloquear todo su potencial.
Redes informáticas: un enfoque de arriba hacia abajo
Stanford CS 144
Bases de datos
Los datos están en el corazón de los programas más importantes, pero pocos entienden cómo funcionan realmente los sistemas de bases de datos.
Lecturas en sistemas de bases de datos
Berkeley CS 186 de Joe Hellerstein
Idiomas y compiladores
Si comprende cómo funcionan realmente los idiomas y los compiladores, escribirá un mejor código y aprenderá nuevos idiomas más fácilmente.
Compiladores: Principios, Técnicas y Herramientas.
Curso de Alex Aiken sobre Lagunita.
Sistemas distribuidos
En estos días, la mayoría de los sistemas son sistemas distribuidos.
Sistemas distribuidos, 3ª edición por Maarten van Steen
Screencasts de van Steen
¿Por qué aprender ciencias de la computación?
Hay dos tipos de ingenieros de software: aquellos que entienden la ciencia de la computación lo suficientemente bien como para realizar un trabajo desafiante e innovador, y aquellos que simplemente se las arreglan porque están familiarizados con algunas herramientas de alto nivel.
Ambos se llaman a sí mismos ingenieros de software, y ambos tienden a ganar salarios similares en sus primeras carreras. Pero los ingenieros de Tipo 1 se convierten en trabajo más completo y bien remunerado a lo largo del tiempo, ya sea trabajo comercial valioso o proyectos innovadores de código abierto, liderazgo técnico o contribución individual de alta calidad.
Los ingenieros de Tipo 1 encuentran formas de aprender ciencias de la computación en profundidad, ya sea a través de medios convencionales o aprendiendo sin descanso a lo largo de sus carreras. Los ingenieros de Tipo 2 normalmente permanecen en la superficie, aprendiendo herramientas y tecnologías específicas en lugar de sus fundamentos subyacentes, y solo adquieren nuevas habilidades cuando cambian los vientos de la moda técnica.
Actualmente, el número de personas que ingresan a la industria está aumentando rápidamente, mientras que el número de graduados de CS es esencialmente estático. Este exceso de oferta de ingenieros de Tipo 2 está empezando a reducir sus oportunidades de empleo y mantenerlos fuera del trabajo más satisfactorio de la industria. Ya sea que esté tratando de convertirse en un ingeniero de Tipo 1 o simplemente esté buscando más seguridad en el trabajo, aprender la informática es el único camino confiable.
Redes de computadoras
Dado que gran parte de la ingeniería de software se encuentra en servidores y clientes web, una de las áreas de valor más inmediato de la informática es la red de computadoras. Nuestros estudiantes autodidactas que estudian metódicamente la creación de redes descubren que finalmente comprenden los términos, conceptos y protocolos por los que habían estado rodeados durante años.
Bases de datos
Se necesita más trabajo para aprender sobre los sistemas de bases de datos que con la mayoría de los otros temas. Es un campo de estudio relativamente nuevo (es decir, posterior a la década de 1970) con fuertes incentivos comerciales para que las ideas permanezcan a puerta cerrada. Además, muchos autores de libros de texto potencialmente excelentes han preferido unirse o iniciar empresas en su lugar.
Idiomas y compiladores
La mayoría de los programadores aprenden idiomas, mientras que la mayoría de los informáticos aprenden sobre idiomas. Esto le da al científico informático una clara ventaja sobre el programador, ¡incluso en el dominio de la programación! Su conocimiento generaliza; son capaces de comprender el funcionamiento de un nuevo idioma de manera más profunda y rápida que aquellos que simplemente han aprendido idiomas específicos.
Sistemas distribuidos
Como las computadoras han aumentado en número, también se han extendido . Mientras que las empresas compraban previamente mainframes más y más grandes, ahora es típico que incluso aplicaciones muy pequeñas se ejecuten en múltiples máquinas. Los sistemas distribuidos es el estudio de cómo razonar acerca de las compensaciones involucradas al hacerlo, una habilidad cada vez más importante.