¿Cómo puede alguien aprender ciencias de la computación usando el pensamiento de los primeros principios?

El mejor libro que he encontrado sobre el tema es Código: el lenguaje oculto del hardware y software de computadoras de Charles Petzold. Si los dos párrafos siguientes leen más como una revisión, solo puedo disculparme.

De todos modos, Code hace exactamente eso. Demuestra, paso a paso, los componentes básicos de la computadora común. Discute la representación binaria de números, puertas lógicas, flip-flops, memoria, lógica booleana y todo lo demás requerido. Cada capítulo se basa en conceptos anteriores, para culminar en una computadora que funciona y un lenguaje ensamblador rudimentario.

El código es una lectura tremendamente divertida, y aunque todavía tengo que implementar sus ejemplos, Petzold escribe con suficiente garbo para convencer al lector de que cualquiera, y ciertamente el lector, podría construir una computadora digital desde cero.

(movido del perfil incorrecto)

Bricolaje.

En principio, cualquier software que vea, cualquier sitio web, puede programarlo usted mismo. La programación parece muy complicada y difícil de entender, y una razón para esto es que, bueno, no siempre estamos enfocados en entender. Nos convertimos en usuarios. Usuarios de programas, bibliotecas, sitios web, etc. ya existentes.

Al tomar algo que ves e intentar replicar ese comportamiento puedes crear una comprensión profunda. Es posible que cualquiera pueda crear su propio “facebook”, “twitter”.

Por ejemplo, para comprender cómo funciona y se implementa la multitarea cooperativa, con mutexes y semáforos, rendimiento, etc., puede comenzar con un código C simple y mirando setjmp y longjmp. Cuando tenga estos “hilos” definidos por software, puede extenderlos fácilmente a las devoluciones de llamada. Esto le permitiría comprender los sistemas controlados por eventos como nodejs y muchas tecnologías web de navegador.

Por ejemplo, para comprender REST, solo puede implementar una aplicación donde todo el estado esté en la URL y su script no tenga una base de datos / almacenamiento que cambie en absoluto. Cuando cambia el estado por POST, puede optar por implementar esto agregando el cambio a un archivo de hechos. Cuando se inicia el programa, lee este archivo y reproduce el estado desde el principio de los tiempos hasta que se hayan producido todos los cambios históricos, y luego su aplicación puede continuar desde allí. Así es, en principio, cómo funciona un sistema de base de datos. Con los métodos REST, puede implementar consultas de base de datos simples (especializadas). ¿Puedes usar esto para implementar un twitter de una persona para ti? ¿Puede extenderlo para que varios usuarios puedan usarlo para tener sus propios feeds? ¿Puedes extenderlo con respuestas y mensajes?

Hay mucho que puede hacer para comprender la informática, la mayor parte puede implementarlo usted mismo. Se ha “creído” que ningún individuo puede implementar un sistema operativo. Bueno, sorpresa: ¡un tipo lo hizo (Linus Torvalds) y ahora tenemos Linux!

Con estos métodos, puede implementar un programa que se comporte como un “linux”, por supuesto, se ejecuta en su computadora. Pero en algún nivel puedes escribir un simulador de esta computadora. Como el infierno. ls, cat, cp, mv, mkdir, cd. No es tan dificil. Ahora, extiéndalo con sus propias funciones / programas. Crea tu propio pequeño compilador / intérprete de idiomas. Puede ser BÁSICO, o un lenguaje mini C. Encuentre una manera de escribir archivos en su idioma, puede que necesite crear un pequeño mini editor, o puede “hacer trampa” y hacer que su programa de edición haga ‘system (“emacs -nw hangman.bac”);’. Ahora que tiene archivos que contienen código fuente, puede permitir que se ejecuten escribiendo “ahorcado” que invocará su código de intérprete y ejecutará su programa. ¿Puedes capturar ^ C para volver a tu mensaje y no romper tu “computadora”? ¿Se puede hacer un pequeño sistema de ventanas? Como terminal de salida, puede usar un navegador web que se conecta a su programa. ¿Puedes hacerlo para que varios programas puedan ejecutarse al mismo tiempo?

Ninguna de estas tareas es imposible. ¡El único límite es tu imaginación!

¡Buena suerte!

La informática desde los primeros principios comienza con la lógica formal, la axiomatización de la aritmética, el cálculo lambda (la teoría de las funciones recursivas parciales) y la teoría de los autómatas hasta las máquinas de Turing. Si estudias ciencias de la computación, no solo programación e ingeniería de software, deberías acertar en todo esto. Si es mejor comenzar allí, en lugar de visitar estos temas después de una introducción a la programación, es una pregunta pedagógica. Pero así es como lo haces.

Hay un curso CS 101 basado en los primeros principios llamado nand2tetris en Coursera: https://www.coursera.org/course/… .
El curso explica todo lo que sucede en una computadora desde las puertas lógicas, el diseño del chip de ALU, CPU, Unidad de memoria hasta la arquitectura total de la computadora al hacer que construya su propia computadora desde cero desde sus propios chips en un simulador de hardware y es seguido por una segunda parte que introduce un lenguaje ensamblador para la computadora primitiva que desarrolló y también lo hace escribir un compilador para un lenguaje de alto nivel, ensamblador y su propio sistema operativo para que su computadora funcione. Cuan genial es eso ? Comencé este código hoy y es increíble.
los materiales están disponibles de forma gratuita en The Elements of Computing Systems

No es posible. La ciencia de la computación ha estado funcionando durante 60 años y muchos cientos de miles de personas han contribuido a ella a través de la investigación y aprendiendo de su experiencia práctica. Ninguna persona podría llegar tan lejos como nosotros, en una vida humana; y ninguna persona, por brillante que sea, puede lograr tanto como un equipo dedicado de personas inteligentes.

Aconsejaría comenzar por ver si Von Neumann presentó un enfoque.

De lo contrario, para el caso de las máquinas binarias *, suponga que existe una entidad, llamada “bit”, cuyo estado puede ser cero o uno y tomarlo desde allí.

* Tenga en cuenta que uno está obligado a usar el término “máquina”, lo que implica que la Ingeniería de Computadores NO es una Ciencia 🙂