Red de conocimientos sobre prescripción popular - Conocimiento del confinamiento - ¿Qué conocimientos deberían aprender en profundidad los programadores? La configuración del curso de Ambo Zhiyuan es 1, C++/Java, orientado a objetos. Personalmente, creo que aprender C++ y Java es pan comido. Pero la curva de aprendizaje de C++ es bastante pronunciada. Sin embargo, creo que C++ es el lenguaje más importante que hay que aprender. Lea dos artículos interesantes "Mapa de confianza para aprender C++" y "Aprenda C++ en 21 días" (curso gratuito del MIT Programación orientada a objetos de C++ y lea al menos el doble de los libros recomendados en mi libro "Cómo aprender C++" (si). Su comprensión de C++ puede ser tan profunda como el análisis de la tabla de funciones virtuales de C++ o la biblioteca de memoria de objetos de C++ como escribí). Debe aprender a comparar las diferencias entre C++ y Java. Por ejemplo, inicialización, recolección de basura, interfaces, excepciones, funciones virtuales, etc. en Java. Tarea real: use C ++ para implementar un BigInt que admita operaciones de suma, resta, multiplicación y división de enteros de 128 bits. Utilice C++ para encapsular la capacidad de una estructura de datos, como una tabla hash. Utilice la encapsulación de C++ para implementar punteros inteligentes (se deben utilizar plantillas). Asegúrese de leer "Patrones de diseño" una o dos veces. Piense en los escenarios de aplicación de estos 23 modos. Hay dos puntos principales: 1) ama la composición en lugar de la herencia, 2) ama las interfaces en lugar de la implementación. (También se recomienda un patrón de diseño simple) Tarea práctica: utilice el patrón de fábrica para implementar un grupo de memoria. Utilice un patrón de estrategia para crear una clase que pueda alinear archivos de texto a la izquierda, a la derecha y al centro. Implemente una calculadora de línea de comandos usando el modo de comando y admita deshacer y rehacer. Utilice el modelo de decoración para implementar una estrategia de precios de habitaciones de hotel: temporada alta, servicio, VIP, grupos turísticos y otros factores que afectan el precio. Aprenda el uso de STL y sus conceptos de diseño: contenedores, algoritmos, iteradores y funtores. Si es posible, lea su código fuente. Tareas prácticas: utilice diversas habilidades de programación de gráficos orientada a objetos, STL, patrones de diseño y WindowsSDK para intentar crear un juego Snake o Tetris. Se admiten diferentes niveles y dificultades. Cree un explorador de archivos que pueda explorar archivos en un directorio y realizar diferentes operaciones en diferentes archivos. Los archivos de texto se pueden abrir para editarlos y se pueden ejecutar archivos ejecutables. Puede reproducir archivos mp3 o avi, y los archivos de imágenes pueden mostrar imágenes. Puede resultar demasiado difícil aprender el diseño de algunas bibliotecas de clases en C++, como MFC (consulte "Fácil de entender MFC" de Hou Jie), Boost, ACE, CPPUnit, STL (STL), pero si puede comprender los patrones de diseño y diseño Eso sería genial, sería genial si pudieras profundizar en mi "Tecnología de copia en escritura de clase de cadena STL", ACE requiere un sistema potente. Consulte "Fortalecer la comprensión del sistema" más adelante). Java es un verdadero lenguaje orientado a objetos. Hay demasiados patrones de diseño en Java y también es el mejor lenguaje para aprender patrones de diseño orientado a objetos (consulte Patrones de diseño en Java). Se recomienda leer "Java efectivo" y "Java Jigsaw" para conocer el marco de Java. Existen muchos frameworks Java, como Spring, Hibernate, Struts, etc. , Principalmente para aprender diseño Java, como IoC, etc. La tecnología Java también es muy diferente y se centra principalmente en la arquitectura J2EE y JMS, RMI y otras tecnologías de mensajería y llamadas remotas. Aprenda a utilizar Java para realizar servicios web (el tutorial oficial está aquí). Tarea de práctica: intente crear un programa de llamadas remotas de servicios web utilizando la red en el marco de Spring o Hibernate y transfiera mensajes a través de JMS en los dos servicios. Ni C++ ni Java se pueden aprender en poco tiempo. C++ es profundo y Java es amplio. Recomiendo elegir uno de estos. Mi experiencia de aprendizaje personal es: aprender C ++ (he estado aprendiendo C / C ++ durante más de diez años) y aprender varios patrones de diseño de Java. 2. Fortalecer la importancia de la comprensión de sistemas leyendo los siguientes libros: "El arte de la programación Unix" para comprender los conceptos de diseño y desarrollo, sistemas ideológicos y culturales, principios y experiencias en el campo de los sistemas Unix. Debes tener una sensación de claridad. Programación de redes Unix Volumen 1, Socket Este es un libro que comprenderá la programación de redes después de leerlo. Es importante tener en cuenta las diferencias entre TCP, UDP y las llamadas al sistema de multiplexación select/poll/epoll. Explicación detallada de TCP/IP Volumen 1: Protocolo: este es un libro en el que puedes convertirte en un hacker de red después de leerlo.
¿Qué conocimientos deberían aprender en profundidad los programadores? La configuración del curso de Ambo Zhiyuan es 1, C++/Java, orientado a objetos. Personalmente, creo que aprender C++ y Java es pan comido. Pero la curva de aprendizaje de C++ es bastante pronunciada. Sin embargo, creo que C++ es el lenguaje más importante que hay que aprender. Lea dos artículos interesantes "Mapa de confianza para aprender C++" y "Aprenda C++ en 21 días" (curso gratuito del MIT Programación orientada a objetos de C++ y lea al menos el doble de los libros recomendados en mi libro "Cómo aprender C++" (si). Su comprensión de C++ puede ser tan profunda como el análisis de la tabla de funciones virtuales de C++ o la biblioteca de memoria de objetos de C++ como escribí). Debe aprender a comparar las diferencias entre C++ y Java. Por ejemplo, inicialización, recolección de basura, interfaces, excepciones, funciones virtuales, etc. en Java. Tarea real: use C ++ para implementar un BigInt que admita operaciones de suma, resta, multiplicación y división de enteros de 128 bits. Utilice C++ para encapsular la capacidad de una estructura de datos, como una tabla hash. Utilice la encapsulación de C++ para implementar punteros inteligentes (se deben utilizar plantillas). Asegúrese de leer "Patrones de diseño" una o dos veces. Piense en los escenarios de aplicación de estos 23 modos. Hay dos puntos principales: 1) ama la composición en lugar de la herencia, 2) ama las interfaces en lugar de la implementación. (También se recomienda un patrón de diseño simple) Tarea práctica: utilice el patrón de fábrica para implementar un grupo de memoria. Utilice un patrón de estrategia para crear una clase que pueda alinear archivos de texto a la izquierda, a la derecha y al centro. Implemente una calculadora de línea de comandos usando el modo de comando y admita deshacer y rehacer. Utilice el modelo de decoración para implementar una estrategia de precios de habitaciones de hotel: temporada alta, servicio, VIP, grupos turísticos y otros factores que afectan el precio. Aprenda el uso de STL y sus conceptos de diseño: contenedores, algoritmos, iteradores y funtores. Si es posible, lea su código fuente. Tareas prácticas: utilice diversas habilidades de programación de gráficos orientada a objetos, STL, patrones de diseño y WindowsSDK para intentar crear un juego Snake o Tetris. Se admiten diferentes niveles y dificultades. Cree un explorador de archivos que pueda explorar archivos en un directorio y realizar diferentes operaciones en diferentes archivos. Los archivos de texto se pueden abrir para editarlos y se pueden ejecutar archivos ejecutables. Puede reproducir archivos mp3 o avi, y los archivos de imágenes pueden mostrar imágenes. Puede resultar demasiado difícil aprender el diseño de algunas bibliotecas de clases en C++, como MFC (consulte "Fácil de entender MFC" de Hou Jie), Boost, ACE, CPPUnit, STL (STL), pero si puede comprender los patrones de diseño y diseño Eso sería genial, sería genial si pudieras profundizar en mi "Tecnología de copia en escritura de clase de cadena STL", ACE requiere un sistema potente. Consulte "Fortalecer la comprensión del sistema" más adelante). Java es un verdadero lenguaje orientado a objetos. Hay demasiados patrones de diseño en Java y también es el mejor lenguaje para aprender patrones de diseño orientado a objetos (consulte Patrones de diseño en Java). Se recomienda leer "Java efectivo" y "Java Jigsaw" para conocer el marco de Java. Existen muchos frameworks Java, como Spring, Hibernate, Struts, etc. , Principalmente para aprender diseño Java, como IoC, etc. La tecnología Java también es muy diferente y se centra principalmente en la arquitectura J2EE y JMS, RMI y otras tecnologías de mensajería y llamadas remotas. Aprenda a utilizar Java para realizar servicios web (el tutorial oficial está aquí). Tarea de práctica: intente crear un programa de llamadas remotas de servicios web utilizando la red en el marco de Spring o Hibernate y transfiera mensajes a través de JMS en los dos servicios. Ni C++ ni Java se pueden aprender en poco tiempo. C++ es profundo y Java es amplio. Recomiendo elegir uno de estos. Mi experiencia de aprendizaje personal es: aprender C ++ (he estado aprendiendo C / C ++ durante más de diez años) y aprender varios patrones de diseño de Java. 2. Fortalecer la importancia de la comprensión de sistemas leyendo los siguientes libros: "El arte de la programación Unix" para comprender los conceptos de diseño y desarrollo, sistemas ideológicos y culturales, principios y experiencias en el campo de los sistemas Unix. Debes tener una sensación de claridad. Programación de redes Unix Volumen 1, Socket Este es un libro que comprenderá la programación de redes después de leerlo. Es importante tener en cuenta las diferencias entre TCP, UDP y las llamadas al sistema de multiplexación select/poll/epoll. Explicación detallada de TCP/IP Volumen 1: Protocolo: este es un libro en el que puedes convertirte en un hacker de red después de leerlo.
Comprenda cómo funciona Ethernet, comprenda el protocolo y los principios de funcionamiento de TCP/IP y cómo ajustar TCP. Tareas prácticas: comprender qué son las tecnologías IO de bloqueo (IO síncrona), no bloqueo (IO asíncrona) y multiplexación (select, poll, epoll). Escriba un programa de chat en red con un servidor de chat y múltiples clientes de chat (el servidor usa UDP para multidifusión o transmisión de algunos o todos los clientes de chat). Escriba un servidor HTTP simple. Programación de redes Unix Volumen 2, comunicación entre procesos, semáforos, canalizaciones, * * * memoria compartida, mensajes y otros IPC... Estas tecnologías pueden parecer un poco anticuadas, pero aún así vale la pena conocerlas. Tareas prácticas: Practique principalmente varios métodos de comunicación de IPC. Intente escribir un programa de canalización a través del cual los procesos padre e hijo intercambien datos. Intente escribir un * * * programa para compartir memoria. Dos procesos intercambian una matriz de estructura C a través de * * * memoria compartida. Aprenda la programación básica de Windows con este libro. Domine CreateProcess, subprocesos de Windows, programación de subprocesos, sincronización de subprocesos (eventos, semáforos, mutex), E/S asíncrona, gestión de memoria y DLL. Tarea real: use CreateProcess para iniciar el Bloc de notas o IE y monitorear la ejecución del programa. Utilice el grupo de subprocesos para implementar el servicio HTTP simple escrito anteriormente. Escriba un programa de enlace DLL para monitorear el evento de cierre de una ventana específica o registrar las pulsaciones de teclas de una ventana. Con la base de comunicación multiproceso multiproceso, TCP/IP, sockets, C++ y patrones de diseño, puede aprender ACE. Utilice ACE para reescribir el programa de chat anterior y la tarea de práctica del servidor HTTP (con grupo de subprocesos): con todo el conocimiento anterior, intente escribir un servidor para enviar archivos grandes al cliente, lo que requiere más del 80% del ancho de banda de 100 M para usar. . (Tenga en cuenta que puede haber problemas de E/S de disco y de E/S de red, así que piense en cómo resolverlos. Además, preste atención a la unidad MTU máxima de transmisión de red). Comprenda el principio de funcionamiento de la descarga de BT y Simule la descarga de BT en un principio de forma multiproceso. 3. Equilibrio de carga de la arquitectura del sistema. Tipo hash, tipo puramente dinámico. (Puede leer algunos artículos sobre equilibrio de carga en Google Scholar) Sistema distribuido multicapa: capa de nodo de servicio al cliente, capa de nodo informático, capa de caché de datos, capa de datos. J2EE es una estructura multicapa típica. Sistema CDN: acceso cerrado, contenido marginado. Sistema P2P, aprende los algoritmos de BT y eDonkey. Por ejemplo: algoritmo DHT. Copia de seguridad del servidor, sistema de copia de seguridad de dos máquinas (sistema Live-Standby y Live-Live), ¿cómo se monitorean dos máquinas entre sí mediante latidos del corazón? Copia de seguridad del nodo maestro del cluster. Tecnología de virtualización a través de la cual los sistemas operativos se pueden cambiar o reconfigurar e implementar como aplicaciones. Aprenda Thrift, un middleware de comunicación binaria de alto rendimiento que admite la serialización de datos (objetos) y varios tipos de servicios RPC. Aprenda Hadoop. Los diseños principales en el marco de Hadoop son MapReduce y HDFS. Google mencionó la idea de MapReduce en un artículo y tuvo una amplia circulación. En una oración simple, MapReduce es "la descomposición de tareas y el resumen de resultados". HDFS es la abreviatura de Hadoop Distributed File System, que proporciona soporte subyacente para la informática y el almacenamiento distribuidos. Comprenda la base de datos NoSQL (algunas personas dicen que puede ser una tecnología sobrevalorada), pero a medida que los sitios web puramente dinámicos de gran escala y alta concurrencia se han vuelto cada vez más comunes, y los sitios web SNS tienen requisitos rígidos para el acceso a los datos en tiempo real, las bases de datos NoSQL Se ha convertido gradualmente en el foco de atención de la gente y es muy probable que reemplace la base de datos relacional y se convierta en el método de almacenamiento de datos principal en el futuro. Actualmente existen muchas bases de datos NoSQL, la mayoría de las cuales son de código abierto. Entre las más conocidas se encuentran: MemcacheDB, Redis, Tokyo Cabinet (la versión mejorada es Kyoto Cabinet), Flare, MongoDB, CouchDB, Cassandra, Voldemort, etc. Después de escribir tanto, mirando hacia atrás, me siento bastante realizado. Espero que no tengas miedo. Yo mismo lo he estado estudiando durante diez años y todavía lo sigo estudiando hoy. La vida es un proceso de aprendizaje y mejora continua. Sin embargo, debe haber omisiones y errores y espero que me corrijan. Palabras clave: profundidad avanzada para programadores