¿Qué conceptos de informática debo conocer? [cerrado]


94

¿Qué conceptos de Ciencias de la Computación crees que te han convertido en un mejor programador?

Mi título fue en Ingeniería Mecánica, así que habiendo terminado como programador, me faltan un poco los conceptos básicos. 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:

Funciones de idioma

  • Punteros y recursividad (¡Gracias Joel!)

Estructuras de datos

  • Listas vinculadas
  • Hashtables

Algoritmos

  • Clasificaciones de burbujas

Obviamente, la lista es un poco corta en este momento, así que esperaba sugerencias sobre:

  1. Qué conceptos debo entender
  2. Cualquier buen recurso para comprenderlos correctamente (ya que Wikipedia puede ser un poco denso y académico a veces).

5
¿Clases de burbujas? ¡Manténgase lo más lejos posible de ellos! Más bien, aprenda cómo funcionan las clasificaciones rápidas / ordenadas en montón.
Carra

18
Sí, aprende bubbleort. Aprenda por qué es terrible. Aprenda ordenación rápida, ordenación combinada y todo lo demás, incluidas sus debilidades individuales. Pero no los escriba en el código de producción: llame a las funciones de clasificación proporcionadas por cualquier plataforma en la que se encuentre.
Brian Ensink

@Roger Pate - +1 para usted, uno debe saber para qué es bueno un algoritmo o estructura de datos y en qué apesta. Tanto Quicksort como Bubblesort tienen el mismo rendimiento en el peor de los casos [O (n ^ 2)], pero para tipos de entrada muy diferentes, y Bubblesort tiene el mejor rendimiento de caso de O (n), donde QS sigue siendo O (n log n). Por supuesto, si está considerando Bubblesort, puede optar por la ordenación por inserción.
Andre Artus

Respuestas:


60

Eche un vistazo a esta publicación de blog de Steve Yegge (anteriormente en Amazon, ahora en Google):

Entra en algunos detalles sobre los cinco conceptos más importantes que los desarrolladores deben conocer:

  1. Programación básica (incluida la recursividad, E / S de archivos, salida formateada, bucles, etc.)
  2. Diseño orientado a objetos (incluidos patrones de diseño, etc.). Debería poder producir diseños orientados a objetos razonables y comprender los conceptos.
  3. Scripting y expresiones regulares.
  4. Estructuras de datos: listas, conjuntos, tablas hash, árboles, gráficos, etc., así como la notación Big O y la complejidad algorítmica.
  5. Bits, bytes y números binarios: cómo se representan los números en la computadora y cómo manipularlos.

Buen enlace. Un poco enfocado en el lado de Unix, (falta completamente .NET) pero aún así es bueno.
Toon Krijthe

Gran enlace: hay muchas cosas en las que puedo trabajar, solo desearía que tuviera algunos enlaces a buenas páginas que expliquen esas cosas.
Jon Artus

El enlace me será muy útil para revisarme y ponerme al día con los fundamentos. Gracias ..
rpr

De acuerdo, gran enlace. Si bien muchas de las posibles soluciones identificadas están basadas en Unix, los conceptos generales involucrados son muy independientes del lenguaje / plataforma. Para la mayoría de los programadores, cosas como la recursividad, la escritura de ADT como árboles y las operaciones bit a bit son bastante raras, sin embargo, son una base importante.
Zach Burlingame

4
Estoy de acuerdo con todo excepto las expresiones regulares. Esas son una buena ventaja, pero la mayoría de las cosas son conceptos básicos a nivel del suelo, la base sobre la que se construye todo ... las expresiones regulares son geniales, pero conozco a muchos programadores geniales que nunca las usan, y nunca las necesitan.
Beska

35

Definitivamente debe entender el Big-O notación y Big-O estimaciones de algoritmos - lo que es, cómo se utiliza, por qué es importante, cómo se comparan dos algoritmos reciben sus estimaciones de Big-O, la forma de construir estimaciones de Big-O para los algoritmos simples.


1
Puede comenzar con un artículo de Wikipedia al que he vinculado: es bastante simple y matemáticamente correcto.
diente afilado

3
Debes tener una opinión bastante baja de las matemáticas avanzadas. Entendí esto en mi primer año de universidad, cuando solo estaba a mitad de camino en cálculo.
GoatRider

1
No olvide el concepto de NP y cuando un problema está contenido en él, un desarrollador que intenta codificar un TSP (vendedor ambulante) en cada transacción de la base de datos para un propósito de búsqueda o alguna otra idiotez similar es un problema importante =]
Ed James

2
También debe saber que la gran O no le dice qué algoritmo lleva menos tiempo. Algo que la mayoría de los graduados de CS no comprenden
Martin Beckett

3
De alguna manera lo hace. Le dice cuál tiene el mejor caso en el peor de los casos, no necesariamente cuál es 'más rápido', ya que eso depende del conjunto de entrada.
Ed James

30

Me parece un poco gracioso que estés buscando asignaturas de informática , pero que wikipedia es demasiado académico: D

De todos modos, aquí va, sin ningún orden en particular:


2
+1 porque mencionaste bases de datos, que a menudo se pasan por alto en este tipo de listas, pero es un concepto muy importante que debe conocer cualquier graduado de informática completo.
Brian Ensink

14

Algunos conceptos que ayudaron a mi desarrollo (intelecto y código):

  • Lexing, análisis, coincidencia de cadenas, expresiones regulares
  • Memorización
    • encapsulación / alcance / cierres
    • caché
  • Recursividad
  • Iteradores / Generadores
  • Programación funcional: el asombroso artículo de John Hughes me dijo "por qué"

Estos son dominios completos de matemáticas discretas, 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 están dirigidos a los piratas informáticos de Perl, creo que cualquier programador se beneficiaría de su presentación clara y código real, especialmente en Perl de orden superior .


10

Diría que hoy en día es imprescindible comprender la Programación Orientada a Objetos, incluso si no es necesario utilizarla en el día a día.

De esto también diría que comprender los patrones más comunes también puede ayudar.


10

Veo varios buenos conceptos de informática identificados, pero se habla poco sobre matemáticas.

Sugiero que analice las matemáticas discretas . Tiene una amplia gama de problemas útiles que comienzan con pruebas lógicas que le ayudan a escribir condiciones en código. La teoría de grafos y la combinatoria también ayudan con la resolución de problemas complejos y la optimización de algoritmos.

Mientras estamos en el tema de matemáticas, el álgebra lineal es típicamente un requisito previo para las clases avanzadas de gráficos por computadora.


1
Si tuviera que elegir solo una, serían las matemáticas discretas. Es más o menos CS 101. Me cuesta pensar en un área o paradigma en la programación general que no sea tocado de alguna manera por DM.
Andre Artus

6

La Matriz de competencias del programador cubrió esto en detalle, pero destacaré un par:

  • Estructuras de datos
    • Estructuras de datos avanzadas como árboles B, montones binomiales y fibonacci, árboles AVL / Red Black, árboles Splay, listas de omisión, intentos, etc.
  • Algoritmos
    • Tree, Graph, simple codicioso y algoritmos de divide y vencerás, 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, ensamblaje, vinculación estática y dinámica, 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 VCS distribuidos. Ha probado Bzr / Mercurial / Darcs / Git
  • Automatización de construcción
    • Puede configurar un script para construir el sistema y también documentación, instaladores, generar notas de la versión y etiquetar el código en el control de fuente
  • Prueba automatizada
    • Entiende y puede configurar pruebas funcionales, de carga / rendimiento y de IU automatizadas
  • Descomposición del problema
    • Utiliza estructuras de datos y algoritmos adecuados 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 poder diseñar sistemas de soporte de operaciones como monitoreo, informes, fallas, etc.

5

Encuentro gráficos y algunos algoritmos aplicados como profundidad primero, búsqueda de respiración primero, caminos más cortos, etc. muy útiles. La orientación a objetos también es un concepto muy común.


4

Regla 1: El software es la captura de conocimientos . El software significa algo. Si no tiene claro el significado, dedique más tiempo a hablar 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 los datos, la estructura de los 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 ordenación mejor que la ordenación de burbujas. No hay absolutamente ninguna circunstancia en la que deba utilizar la clasificación de burbujas para nada. Debería 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)

  • Lenguajes de presentación (HTML y CSS)

  • Otros lenguajes de representación de datos (XML, JSON)

Debe 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 físicos y blandos incluidos)

  • Mapas (o índices o matrices asociativas), incluidos mapas hash y mapas de árboles

  • Conjuntos

Más un análisis de complejidad algorítmica. A veces llamado "Big O". La razón por la que una clasificación de burbujas es mala es que es O ( n ^ 2), donde una clasificación rápida es O ( n log n ).


Para que conste, ¡nunca usaría un tipo de burbuja! Descubrí que aprender cómo funciona es una experiencia interesante, y pensé que hay algunos otros algoritmos similares que la gente debería entender lo suficientemente bien como para escribir en el idioma que elijan.
Jon Artus

Existen innumerables algoritmos. La mayoría de ellos malos. Algunas buenas. Bubble Sort es simplemente malo. Compra CUALQUIER libro sobre algoritmos y sigue adelante.
S.Lott

Solo recolección de liendres, pero Quicksort es el peor de los casos O (n ^ 2). Solo lo señalo porque creo que comprender por qué esto es cierto es un valioso ejercicio educativo al estudiar los algoritmos fundamentales.
Brian Ensink

Para una clasificación rápida, sí, un ejercicio importante. Para la clasificación de burbujas, lo único que hay que hacer es ver qué tan malo es el algoritmo. Comprender el caso típico frente al peor es importante en general.
S.Lott

4

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 la menor cantidad 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 y la integridad de los datos.

Diseño de la interfaz de usuario (UI): así es como el usuario debe acceder a los datos que seguimos.
La mayoría de las IU están diseñadas por desarrolladores. Por lo tanto, la mayoría de las UI, desafortunadamente, son paralelas al diseño de la base de datos. A los usuarios no les importa en absoluto el diseño de datos. Simplemente quieren, lo que quieren. Quieren conseguirlo fácilmente. Por lo general, esto exige una gran separación del diseño de datos y la interfaz de usuario. Aprenda a separar el usted de la "ingeniería" del usted de la "hospitalidad sureña".

Programación orientada a objetos: muchos lenguajes se reducen a este formato.

Procesamiento paralelo - Multi-Threading: ¡ Muchos procesadores agilizan el trabajo!
Las computadoras paralelas existen desde hace décadas. Han estado en nuestros escritorios desde hace algún tiempo. Con el caso de la "computación en la nube", el procesamiento paralelo masivo no solo es obligatorio, sino también preferible. ¡Es increíblemente poderoso! Hay mucho potencial de trabajo para desarrolladores paralelos.

Comprensión de las reglas comerciales: esto le ayuda a hacer gran parte de su lógica, basada en tablas.
Muchas condiciones de IFblock pueden ubicarse en tablas de reglas comerciales. Para cambiar la lógica, simplemente cambie la información en una tabla. Poco / Sin recodificación. Poco / sin recompilación.

Supervisión de eventos ... Los métodos hacen el trabajo:
Mantenga las cosas separadas en su código. Hace que sea más fácil para otros realizar actualizaciones en el futuro. También es similar al marco Modelo / Vista / Controlador (MVC).

PJ


3

Para mí, obtuve mucho del siguiente curso en el equipo universitario

  • Gestión de proyectos
  • Interacción entre humanos y computadoras (nos ayuda a los geeks a hacer pantallas más fáciles de usar)
  • Diseño de base de datos (incluido 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 desearía haber hecho en el equipo universitario

  • Construcción del compilador
  • Patrones de diseño
  • Teoría de los autómatas

3

LÓGICA - Simplemente exagero la importancia de la lógica en la programación. Dijiste que estudiaste Ingeniería Mecánica, así que debes saber cuánto pueden hacer tu vida las matemáticas más fáciles.

Lógica proposicional , lógica de primer orden , lógica de segundo orden : son herramientas muy poderosas. Probablemente lo más (y único) importante que he aprendido en la universidad. La lógica es como la artillería pesada de un programador: muchos problemas muy complejos (así como los menos complejos) se vuelven mucho más simples una vez que los ha puesto en una forma lógica y organizada. Es como lo que es el álgebra lineal para los ingenieros mecánicos.


3

Creo que es bueno saber cómo funciona un compilador. Aho tiene el libro clásico sobre conceptos usados ​​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 comprender realmente ese libro, debe tener conocimiento de los lenguajes formales. Hopcroft tiene un buen libro sobre eso: Introducción a la teoría, los lenguajes y la computación de los autómatas.



2

Ya se han mencionado muchas buenas respuestas aquí, pero quería agregar un subconjunto de lo que es importante, pero no se ha cubierto hasta ahora.

Después de 15 años de desarrollo de software profesional de posgrado, descubro que utilizo regularmente algunos de los siguientes conceptos en la escuela:

  • Conceptos generales de OO y características del lenguaje de programación moderno (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 de cuello de botella.
  • Listas vinculadas 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 idioma / plataforma no admite la recolección de basura, la asignación de memoria y la limpieza son críticas y se agregarían a la lista.


2

Voto a favor de 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 algo a lo que dijo S.Lott sobre los idiomas. Aprender muchos TIPOS de idiomas también es importante. No solo compilado frente a scripting. Pero funcional (ML, Lisp, Haskell) lógico (Prolog) orientado a objetos (C ++, Java, Smalltalk) imperativo (C, Pascal, FORTRAN incluso).

¡Cuantos más paradigmas de programación conozca, más fácil será aprender nuevos lenguajes cuando llegue el nuevo lenguaje!


2

Algunos de los conceptos del sistema operativo

 ( memory, IO, Scheduling, process\Threads, multithreading )

[un buen libro " Modern Operating Systems , 2nd Edition, Andrew S. Tanenbaum"]

Conocimientos básicos de redes informáticas

[un buen libro de Tanenbaum

Conceptos de OOPS

Autometas finitos

Un lenguaje de programación (aprendí C primero y luego C ++)

Algoritmos (complejidad de tiempo \ espacio, clasificación, búsqueda, árboles, lista enlazada, pila, cola)

[un buen libro Introducción a los algoritmos ]


auto meta? - seguramente "autómatas" según la primera edición.
Tom Duckering

¡Ups! atascado para revisar la ortografía, supongo. Lo corregiré. Gracias.
aJ.


1

Trate de comprender todos los niveles de programación. Desde el nivel más bajo (montaje) hasta el nivel más alto.

Tome la recursividad, por ejemplo, que es una característica fácil :) Intente aprender a ensamblar y crear un programa que utilice la recursividad en el ensamblaje.


1

Algoritmos.

Aprender a usar un lenguaje de programación de forma descendente es algo que puede aprender sobre la marcha, pero es prácticamente imposible inventar todos los algoritmos ampliamente utilizados por sí mismo. Al menos uno debería ser consciente 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 esperar que se considere bueno, sin importar cuán fino sea el código.

Para resumir, eche un vistazo a Introducción a los algoritmos

No es necesario dominarlo, solo sepa lo que está pasando ...



1

Es claramente una buena comprensión de la programación orientada a objetos, buenos principios rectores como los principios SOLID y seguir patrones y prácticas establecidos.

Si nos fijamos en SOA o DDD, en última instancia, todos recurren a algún tipo de conceptos de programación orientada a objetos.

Le recomendaría que obtenga algunos buenos libros de OOP y también elija un lenguaje rico como C # o Java para empezar

OOP de Grady Booch

(PHP, ruby, chicos, por favor no me voten en contra, solo le estoy dando algunos ejemplos para empezar, pueden proporcionar sus propias respuestas y sugerencias aquí)



1

No voy a decirles ningún concepto específico para estudiar, sino que les recomendaría que lean mucha luz 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, de modo que pueda hacer algo ... estudiar a tiempo cuando realmente te enfrentas a ello. En otras palabras, está bien si no sabe cómo resolver un problema de combinatoria, siempre que sepa lo suficiente para buscar "combinatoria" cuando necesite ver de cuántas formas puede 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, para empezar, solo está hojeando. Una incluso mejor, especialmente si encuentra Wikipedia demasiado académica o inaccesible, es la wiki C2 . (Esta es, curiosamente, la wiki original inventada por Ward Cunningham).


0

Creo que es esencial comprender la teoría básica detrás de los subprocesos múltiples, 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 un domingo por la mañana.

Semáforos, secciones críticas y eventos.


0

No, no de clasificación de burbujas, clasificación rápida. Es el tipo de burbuja de cosa grande O promedia O (n ^ 2), el ordenamiento rápido es O (n * log (n)).


0

Yo diría que a continuación están 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 vinculada, hash, matriz, etc.)
    • Algoritmos de clasificación
    • Complejidad de algoritmos

Luego, ve a cosas específicas relacionadas con el idioma. ¡¡Espero que esto sea útil!!


0

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, en mi opinión, es conocer muchos paradigmas y lenguajes de programación diferentes e informarse bien sobre las herramientas a su disposición. Cualquier problema se puede resolver en casi cualquier idioma que elija, ya sea en el lenguaje convencional completo con su enorme biblioteca predeterminada o en un pequeño lenguaje especializado como AutoHotKey. El primer trabajo del programador es determinar qué utilizar de acuerdo con 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á como algunos de los programadores que intentan desesperadamente hacer algo en un lenguaje especializado, mientras que el problema podría ser trivial de resolver en diferentes contextos de programación.

Este consejo va de la mano con la tendencia actual de proyectos multilingües (tome las aplicaciones web, por ejemplo, que pueden involucrar varios lenguajes 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 :)


0

Creo que 3D-Graphics es algo que todos deberían aprender. O al menos cómo utilizar correctamente vectores homogéneos y transformaciones matriciales.

Puede ser útil no solo para crear aplicaciones 3D, sino también en campos mecánicos como cinemática inversa en robots, calcular momentos y muchas otras cosas.

No entendí completamente el álgebra lineal hasta que leí gráficos en 3D, uno de los mejores cursos que he tomado a pesar de que nuestro profesor era malo.


0

Dado que las máquinas con múltiples núcleos (tanto CPU como GPU) se están convirtiendo en el estándar, yo diría que se incluyan algoritmos distribuidos (desde múltiples subprocesos a múltiples máquinas). Es fundamental comprender el procesamiento distribuido y de subprocesos múltiples. Lamento que el enlace no proporcione mucha ayuda.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.