computer-science - mit - computer science pdf
¿Qué conceptos de informática debo saber? (30)
¿Qué conceptos en Informática crees que te han convertido en un mejor programador?
Mi título fue en Ingeniería Mecánica, por lo que al terminar como programador, me falta un poco lo básico. Hay algunos conceptos estándar de CS que he aprendido recientemente que me han dado una comprensión mucho más profunda de lo que estoy haciendo, específicamente:
Características del lenguaje
- Punteros y recursión (Gracias Joel!)
Estructuras de datos
- Listas vinculadas
- Hashtables
Algoritmos
- Clases de burbujas
Obviamente, la lista es un poco corta en este momento, así que esperaba sugerencias sobre:
- Qué conceptos debería entender,
- Cualquier buen recurso para entenderlos adecuadamente (ya que Wikipedia puede ser un poco densa y académica a veces).
Algoritmos.
Aprender a utilizar un lenguaje de programación de forma descendente es algo que puedes aprender sobre la marcha, pero es virtualmente imposible inventar todos los algoritmos ampliamente utilizados por ti mismo. Uno debería al menos estar al tanto de lo que se puede y no se puede hacer con algunos problemas
Por ejemplo, uno simplemente no puede escribir algunos programas con bubble-sort y espera que se considere bueno, sin importar qué tan bueno sea el código.
Para resumir, eche un vistazo a Introducción a los algoritmos
No es necesario dominarlo, solo saber qué está pasando ...
Algunos conceptos que ayudaron a mi desarrollo (intelecto y código):
- Lexing, Parsing, Cadena de coincidencia, Regex
- Memoization
- encapsulación / alcance / cierres
- almacenamiento en caché
- Recursión
- Iteradores / Generadores
- Programación funcional: el sorprendente article John Hughes me contó "por qué"
Estos son dominios completos de matemática discreta, pero se requiere una introducción seria para CS:
- Matriz / álgebra lineal
- Teoría de grafos
Aunque las conferencias y los artículos de Mark Jason-Dominus a menudo se dirigen a los hackers de Perl, creo que cualquier programador se beneficiaría de su presentación clara y código real, especialmente en Higher Order Perl .
Algunos de los conceptos de SO
( memory, IO, Scheduling, process/Threads, multithreading )
[un buen libro " Sistemas operativos modernos , 2da edición, Andrew S. Tanenbaum"]
Conocimiento básico de redes de computadoras
[un buen libro de Tanenbaum
Conceptos de OOPS
Autometa finita
Un lenguaje de programación (aprendí C primero y luego C ++)
Algoritmos (Tiempo / complejidad del espacio, ordenación, búsqueda, árboles, lista vinculada, pila, cola)
[un buen libro Introducción a los algoritmos ]
Bueno, la lata de gusanos está abierta ahora! :)
Empecé en Ingeniería Eléctrica.
Diseño de bases de datos relacionales: hacer un seguimiento de los datos es como Arnold en "Kindergarden Cop".
Puede ser un caos total. Debe ser controlado.
Cómo mantener sus datos, en el menor número de ubicaciones, con la menor cantidad de duplicaciones de información. Cómo mantener sus datos livianos y de fácil acceso. Cómo controlar el crecimiento e integridad de los datos.
Diseño de la interfaz de usuario (UI): así es como el usuario debe acceder a los datos que estamos siguiendo.
La mayoría de las IU están diseñadas por desarrolladores. Por lo tanto, la mayoría de las IU, desafortunadamente, son paralelas al diseño de la base de datos. A los usuarios no les importa el diseño de los datos en absoluto. Simplemente quieren, lo que quieren. Quieren obtenerlo fácilmente. Por lo general, esto exige una gran separación del diseño de datos y la interfaz de usuario. Aprenda a separar la "ingeniería" de usted de la "hospitalidad sureña".
Programación orientada a objetos: muchos idiomas se reducen a este formato.
Procesamiento en paralelo - Multi-Threading: ¡ Muchos procesadores hacen que el trabajo sea rápido!
Las computadoras paralelas han existido por décadas. Han estado en nuestros escritorios desde hace un tiempo. Con el evento de "computación en la nube", el procesamiento paralelo masivo no solo es mandorio sino también preferible. ¡Es increíblemente poderoso! Existe un gran potencial de trabajo para desarrolladores paralelos.
Entender las Reglas de Negocio: Esto le ayuda a hacer una gran parte de su lógica, basada en tablas.
Muchas condiciones IFblock pueden sentarse en las tablas de reglas de negocios. Para cambiar la lógica, simplemente cambie la información en una tabla. Poca / Sin recodificación. Poco / Sin recompilar.
Eventos Supervisar ... Los métodos hacen el trabajo:
Mantenga las cosas separadas en su código. Hace que sea más fácil para otros hacer actualizaciones en el futuro. También es un poco paralela al marco Modelo / Vista / Controlador (MVC).
PJ
Comenzaría con la cita:
"si la única herramienta que tienes es un martillo, tratas todo como un clavo". (Abraham Maslow)
El principio más importante, la OMI, es conocer muchos paradigmas de programación diferentes, idiomas e informarse bien sobre las herramientas a su disposición. Cualquier problema puede resolverse en casi cualquier idioma que elija, ya sea en su versión principal con su enorme biblioteca predeterminada o un pequeño lenguaje especializado como AutoHotKey. El primer trabajo del programador es determinar qué usar según la especificación del problema. Algunos conceptos proporcionan un mejor enfoque del tema, cualquiera que sea su objetivo principal: sofisticación, ofuscación, rendimiento, portabilidad, mantenimiento, tamaño de código pequeño ...
De lo contrario, terminarás como algunos de los programadores que intentan desesperadamente hacer algo en un idioma que se especializan, mientras que el problema podría ser trivial para resolver en diferentes contextos de programación.
Este consejo va de la mano con la tendencia actual de proyectos en varios idiomas (por ejemplo, aplicaciones web, que pueden involucrar varios idiomas en una sola aplicación, como C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp ... e incluso diferentes paradigmas de programación (por ejemplo, C # introdujo recientemente algunos conceptos de paradigmas de programación funcional, lambdas).
Entonces, lo básico es el aprendizaje constante, para siempre :)
Como recién graduado de un título en ciencias de la computación, recomendaría lo siguiente:
Como se menciona en varios mensajes de notación Big O
OO Design
Estructuras de datos y algoritmos (no puedo recordar el título exacto del libro que utilicé se actualizará si lo recuerdo)
Sistemas operativos http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580
Problemas NP
Creo que 3D-Graphics es algo que todos deberían aprender. O al menos cómo usar correctamente vectores homogéneos y transformaciones de matriz.
Puede ser útil no solo para crear aplicaciones en 3D, sino también en campos mecánicos como la cinemática inversa de robots, el cálculo de momentos y muchas otras cosas.
No entendí completamente el álgebra lineal hasta que no leí gráficos en 3D, uno de los mejores cursos que he tomado, aunque nuestro profesor era malo.
Creo que es bueno saber una buena comprensión de cómo funciona un compilador. Aho tiene el libro clásico sobre los conceptos utilizados en la creación de un compilador. El título es compiladores: principios, técnicas y herramientas. Su apodo es el Libro del Dragón. Para entender realmente ese libro, debes tener una comprensión de los lenguajes formales. Hopcroft tiene un buen libro sobre eso: Introducción a la teoría de los autómatas, los lenguajes y la computación.
Creo que es esencial comprender la teoría básica detrás del multi-threading, sin esto puede ser difícil incluso ver que puede haber un problema, hasta que esté depurando en un servidor en vivo a las 4 en punto de la mañana del domingo.
Semáforos, secciones críticas y eventos.
Dado que las máquinas con múltiples núcleos (tanto CPU y GPU) se están convirtiendo en el estándar, yo diría que para incluir Algoritmos Distribuidos (desde múltiples hilos a múltiples máquinas). Es fundamental comprender el procesamiento multiproceso y distribuido. Lamento que el enlace realmente no brinde mucha ayuda.
Definitivamente debe comprender la notación de Big-O y las estimaciones de algoritmos de Big-O: qué es, cómo se usa, por qué es importante, cómo se comparan dos algoritmos a partir de sus estimaciones de Big-O, cómo se construyen las estimaciones de Big-O para los algoritmos simples.
Diría que hoy en día es imprescindible comprender la Programación Orientada a Objetos, incluso si no necesita usarla día a día.
De esto también diría que entender los patrones más comunes también puede ayudar.
Eche un vistazo a esta publicación de blog de Steve Yegge (anteriormente de Amazon, ahora en Google):
Se detallan algunos de los cinco conceptos más importantes que los desarrolladores deben conocer:
- Programación básica (incluida la recursión, E / S de archivos, salida formateada, bucles, etc.)
- Diseño orientado a objetos (incluidos patrones de diseño, etc.). Debería poder producir diseños de OO sensibles además de comprender los conceptos.
- Scripting y expresiones regulares
- Estructuras de datos: listas, conjuntos, tablas hash, árboles, gráficos, etc., así como la notación Big O y la complejidad algorítmica.
- Bits, bytes y números binarios: cómo se representan los números dentro de la computadora y cómo manipularlos.
Encuentro los gráficos y algunos algoritmos aplicados, como la profundidad primero, la primera búsqueda de aliento, los caminos más cortos, etc. muy útiles. La orientación a objetos también es un concepto muy común.
Es claramente una buena comprensión de la programación orientada a objetos, buenos principios rectores, como los principios sólidos y siguiendo los patrones y prácticas establecidos.
Si observas SOA o DDD, todos recurren a algún tipo de conceptos de OOP.
Te recomendaría que obtuvieras algunos buenos libros OOP y alos elegir un lenguaje rico como C # o Java para empezar
(PHP, chicos ruby, por favor no me voten, solo estoy dando algunos ejemplos para él, pueden proporcionar sus propias respuestas y sugerencias aquí)
Esforzarse por bajo acoplamiento, alta cohesión .
(Robé esta imagen del sitio web vinculado anteriormente)
Intenta comprender todos los niveles de programación. Desde el nivel más bajo (ensamblaje) hasta el nivel más alto.
Tome recursión, por ejemplo, que es una característica fácil :) Intente aprender a ensamblar y cree un programa que usará recursividad en el ensamblaje.
Me parece un poco extraño que estés buscando asignaturas de ciencias de la computación , pero también encuentras que la wikipedia es académica: D
De todos modos, aquí va, sin ningún orden en particular:
- El modelo relacional: Introducción a los sistemas de bases de datos
- Orientación del objeto: pensamiento del objeto
- Complejidad y teoría de cálculo (piense en máquinas y autómatas de Turing): Introducción a la teoría de la computación
- Un pequeño diseño de compilador: The Dragon Book , aunque esto podría ser un poco demasiado profundo para sus necesidades.
- Conceptos del sistema operativo: sistemas operativos modernos
- Habilidades de las personas: cómo ganar amigos e influenciar a las personas
- Trabajo en equipo: Peopleware
- Diseño de interfaz de usuario: los presos están ejecutando el asilo
Muchas de las buenas respuestas ya se han mencionado aquí, pero quería agregar un subconjunto de lo que es importante, pero hasta ahora no se ha cubierto.
Después de 15 años de desarrollo de software profesional después de la licenciatura, encuentro que utilizo regularmente algunos de los siguientes conceptos en la escuela:
- Conceptos generales de OO y características modernas del lenguaje de programación (clases, ocultación de datos, etc.).
- Métricas de rendimiento del algoritmo (notación Big O). Al diseñar un algoritmo, realizar un análisis Big O para determinar el costo del algoritmo y buscar alternativas más eficientes en áreas con cuellos de botella.
- Listas enlazadas y otras estructuras de datos complejas.
- Clasificación rápida y diferentes conceptos de clasificación.
- Árboles y manipulación rápida de árboles.
Si su lenguaje / plataforma no es compatible con la recolección de basura, la asignación de memoria y la limpieza son fundamentales, y se agregarían a la lista.
No voy a decirle ningún concepto específico para estudiar, sino que le recomendaría que lea un poco sobre una amplia gama de temas. No se preocupe por obtener una comprensión profunda de cada tema sobre el que lee, en este punto, es más importante que pueda reconocer qué tipo de problema está viendo, para poder hacer algo justo. a tiempo estudiando cuando en realidad te enfrentas a él. En otras palabras, está bien si no sabes cómo resolver un problema combinatorio, siempre que sepas lo suficiente como para buscar "combinatoria" cuando necesites ver cuántas formas puedes organizar un conjunto de objetos o elegir un subconjunto .
Wikipedia es un recurso bastante bueno para este tipo de navegación de amplio alcance, especialmente si solo está hojeando para empezar. Una aún mejor, especialmente si encuentras Wikipedia demasiado académica o inaccesible, es la wiki C2 . (Esto es, curiosamente, el wiki original inventado por Ward Cunningham).
No, no sort de burbuja, quicksort. Es la gran O-cosa, la clase de burbuja promedia O (n ^ 2), la ordenada es O (n * log (n)).
Para mí obtuve mucho del siguiente curso en el equipo universitario
- Gestión de proyectos
- Interacción de computadora humana (Nos ayuda a geeks a hacer pantallas más amigables para el usuario)
- Diseño de base de datos (incluyendo cómo funcionan las bases de datos, registros de transacciones, bloqueo, etc.)
- Almacenamiento de datos
- Gráficos (OpenGL)
- Algoritmos avanzados
- Estructuras de datos
Cosas que me gustaría haber hecho en el equipo universitario
- Construcción del compilador
- Patrones de diseño
- Teoría de autómatas
Regla 1: El software es captura de conocimiento . El software significa algo. Si no está seguro del significado, pase más tiempo hablando con los usuarios para comprender lo que hacen.
Los algoritmos y las estructuras de datos son dos caras de la misma moneda. El algoritmo depende de la estructura de datos, la estructura de datos depende del algoritmo.
Desaprender la clasificación de burbujas lo más rápido posible. Seriamente. Todos los lenguajes modernos (Java, Python, etc.) tienen clases de colección que implementan una clasificación mejor que sort de burbuja. No hay absolutamente ninguna circunstancia bajo la cual se deba usar sort de burbuja para nada. Deberías buscar una clase de colección que incluya un método de clasificación. Mejor, debería buscar un algoritmo que evite la clasificación por completo.
Debes aprender varios idiomas
Lenguaje de programación (Java, Python, etc.)
Lenguaje de Shell.
Lenguaje de base de datos (SQL)
Idiomas de presentación (HTML y CSS)
Otros lenguajes de representación de datos (XML, JSON)
Debes aprender varias estructuras de datos.
Secuencias (listas, tuplas, archivos)
Jerárquico (como documentos XML y HTML, así como el sistema de archivos básico)
Relacional (como bases de datos y el sistema de archivos con enlaces duros y blandos)
Mapas (o índices o matrices asociativas), incluidos los mapas Hash y los mapas de árbol
Conjuntos
Además de algunos análisis algorítmicos de complejidad. A veces llamado "Big O". Por qué un tipo de burbuja es malo es que es O ( n ^ 2), donde un quicksort es O ( n log n ).
Remonté las matemáticas discretas. La informática es abstracción. aprender a pensar como un matemático es muy útil.
También quería agregar lo que S.Lott dijo sobre los idiomas. Aprender un montón de TIPOS de idiomas también es importante. No solo compilado vs scripting. Pero funcional (ML, Lisp, Haskell) lógica (Prólogo) orientada a objetos (C ++, Java, Smalltalk) imperativa (C, Pascal, incluso FORTRAN).
Cuantos más paradigmas de programación conozcas, más fácil será elegir nuevos idiomas cuando aparezca el nuevo y atractivo lenguaje.
Veo varios buenos conceptos de CS identificados pero poca charla sobre matemáticas.
Sugiero que estudien las matemáticas discretas . Tiene una amplia gama de problemas útiles que comienzan con pruebas lógicas que le ayudan a escribir condiciones en el código. La teoría de gráficos y la combinatoria también ayudan con la resolución de problemas complejos y la optimización de algoritmos.
Si bien estamos en el tema de las matemáticas, el álgebra lineal suele ser un requisito previo para las clases avanzadas de gráficos por computadora.
Yo diría a continuación son las cosas más importantes
- Programación orientada a objetos
- Conceptos del sistema operativo
- Proceso e hilo
- Algoritmos de programación
- Estructura de datos
- Tipo de almacenamiento y recopilación de datos, tipos (lista de enlaces, hash, matriz, etc.)
- Algoritmos de clasificación
- Complejidad de algoritmos
Luego vaya a material específico relacionado con el idioma. ¡¡Espero que esto sea útil!!
Estructura e interpretación de programas informáticos . Si entiende este libro, todo lo demás se puede construir fácilmente sobre esa base. Si tiene problemas con los conceptos del libro, puede ser un desarrollador de software pero no un científico de la computación.
La Matriz de Competencia del Programador cubrió esto en detalle, pero resaltaré un par:
- Estructuras de datos
- Estructuras de datos avanzadas como B-trees, binomial y fibonacci montps, AVL / Red Black trees, Splay Trees, Skip Lists, tries, etc.
- Algoritmos
- Los algoritmos Tree, Graph, Simple greedy y divide y conquista, es capaz de comprender la relevancia de los niveles de esta matriz.
- Programación de sistemas
- Comprende toda la pila de programación, hardware (CPU + memoria + caché + interrupciones + microcódigo), código binario, ensamblado, enlace estático y dinámico, compilación, interpretación, compilación JIT, recolección de basura, montón, pila, direccionamiento de memoria ...
- Control de versión del código fuente
- Conocimiento de sistemas distribuidos de VCS. Ha probado Bzr / Mercurial / Darcs / Git
- Automatización de compilación
- Puede configurar una secuencia de comandos para construir el sistema y también la documentación, los instaladores, generar notas de la versión y etiquetar el código en el control de la fuente
- Pruebas automatizadas
- Entiende y es capaz de configurar pruebas automáticas funcionales, de carga / rendimiento y UI
- Descomposición del problema
- El uso de estructuras de datos y algoritmos apropiados y genera un código genérico / orientado a objetos que encapsula aspectos del problema que están sujetos a cambios.
- Descomposición de sistemas
- Capaz de visualizar y diseñar sistemas complejos con múltiples líneas de productos e integraciones con sistemas externos. También debería ser capaz de diseñar sistemas de soporte de operaciones como monitoreo, informes, fallas, etc.
LÓGICA : exagero la importancia de la lógica en la programación. Dijiste que habías hecho Ingeniería Mecánica, así que debes saber cuánto las matemáticas pueden hacerte la vida más fácil.
Lógica proposicional , lógica de primer orden , lógica de segundo orden : estas son herramientas muy poderosas. Probablemente las cosas más importantes (y únicas) que he aprendido en la universidad. La lógica es como la artillería pesada de un programador: muchos problemas muy complejos (y los menos complejos) se vuelven mucho más simples una vez que los has puesto en una forma organizada y lógica. Es como lo que Linear Algebra es para Ingenieros Mecánicos.