¿Cuál es la teoría de la informática que debo saber? [cerrado]

27

Hablando como alguien con un título de Ingeniería Electrónica en lugar de Ciencias de la Computación, ¿cuál es la parte de la ciencia de la computación que debo saber para hacerme un mejor programador del mundo real ?

(Por mundo real quiero decir algo de lo que voy a usar y de lo que me beneficiaré en mi trabajo diario como programador; por ejemplo, sugeriría que comprender la normalización de la base de datos es más práctico que comprender un tipo rápido para el que hay muchos de bibliotecas).

Jon Hopkins
fuente
42
1 (lo siento, tuve que hacerlo)
haylem
55
¡Oh, o el más significativo! (Iré ahora ...)
haylem
El intercambio teórico de Ciencias de la Computación confirma lo que todos los demás aquí mencionan: complejidad, estructuras de datos y algoritmos. cstheory.stackexchange.com/tags
chrisaycock
2
Siento la necesidad de objetar esta pregunta. No hay "un bit" que sea suficiente para aprender, y lo que es más, no hay (en mi humilde opinión) un bit "más importante". Hay varios aspectos que son (nuevamente, en mi humilde opinión) igualmente esenciales para la CS. Así que creo que si bien las respuestas a esta pregunta pueden ser interesantes, la pregunta podría haberse formulado mejor.
Konrad Rudolph el
1
Si aún no tuviera su eeng, habría dicho lógica booleana y / o teoría de números discretos. Casi todos ify loopcomunicado que se han escrito utiliza un subconjunto de esas dos áreas de estudio.
Steven Evers

Respuestas:

52

Si tengo que elegir sólo un bit, que es una decisión difícil, yo diría que ir para la notación O grande . Comprender las implicaciones de O (n), O (ln n), O (n²), O (2 ^ n), O (n!) Le ayuda a evitar muchos errores costosos, el tipo de los cuales funcionan bien en el entorno de prueba pero falla desastrosamente en la producción.

usuario281377
fuente
2
+1 y diría que es más importante que solo saber que O (n ^ 2) es peor que O (lg n) (por ejemplo) es saber cómo derivar el Big-O para un fragmento de código determinado.
Dean Harding
3
Estoy en total desacuerdo. Esto es relativamente trivial, y hay temas más interesantes en CS. Además, creo que la mayoría de la gente piensa en la complejidad de forma intuitiva, aunque podrían no llamarla complejidad y no llamarla cuadrática, exponencial, etc.
Magnus Wolffelt
Magnus: En mi experiencia, la mayoría de las personas que no son de programación no piensan en absoluto en la complejidad, intuitivamente asumen O (n) para todos los problemas.
user281377
Todavía tengo que necesitar esto formalmente.
CaffGeek
1
Chad: No hay nada sobre la gran notación O que sea demasiado formalista, pero sin nombres para las cosas, difícilmente puedes pensar en esas cosas, y mucho menos hablar de eso con tus compañeros.
user281377
19

Esta es una pregunta, cada uno tendrá una respuesta diferente. Yo diría: la teoría de la complejidad es la pieza más importante, que de todos modos no aprendes directamente como programador (como algoritmos y estructuras de datos), pero qué puede afectar tu trabajo. Es útil si sé que un problema tiene una complejidad cúbica, sé que se escalará mal si se aumenta el tamaño del problema.

Mnementh
fuente
Yo agregaría que ayuda mucho saber si está resolviendo un problema que se puede restablecer fácilmente en un lenguaje más simple.
philosodad
La complejidad es importante como concepto, pero en realidad calcularla a menudo no lo es. Comprender lo que es menos complejo es lo importante.
Bill
@ Bill: Exactamente. Pero esa parte es lo único que no necesariamente obtienes a través de la práctica. La teoría es muy útil en esa parte.
Mnementh
12

Aprenda sobre estructuras de datos, algoritmos y complejidad.

No demasiado para entender que una máquina no es una caja mágica con potencia ilimitada. No puedes arrojarle nada y esperar que lo rompa en milisegundos. Tiene límites, sabes. Debe aprender a no probarlos con su código.

También eche un vistazo a los enfoques comunes para resolver problemas particulares de diseño en la programación. Patrones de diseño a saber. No los adores, solo toma las ideas que comunican.

El conocimiento del modelado de bases de datos también es esencial.

Después de eso, solo diferentes lenguajes de programación, marcos y bibliotecas implementan o le permiten implementar los conceptos básicos. Elige lo que quieras y practica con ellos.


fuente
Detalles específicos: hay muchos algoritmos y estructuras de datos.
Jon Hopkins
Solo los básicos para tener una idea de las cosas. Tome un libro no demasiado grueso y trabaje en él.
1
Eso es bastante más de un bit.
7

Esta es una pregunta un poco difícil.

Todos los aspectos de la informática son importantes de una forma u otra.

En términos de lo que se beneficiará en el día a día, probablemente una descripción general generalizada de cómo funciona su código "oculto" desde el código hasta la CPU.

Comprender la notación Big O es importante, y también comprender cómo se puede ejecutar su código también es muy importante en situaciones del mundo real.

Noche oscura
fuente
7

Sí, esto me hizo pensar durante horas.

En el proceso, tuve que eliminar algunas de las respuestas comunes dadas aquí ya.

SIN LISTA

  1. Gran notación O (n) . Es difícil ponerlo aquí, pero no, intuitivamente podemos resolver ineficiencias y comparar diferentes conjuntos de procedimientos sin haber escuchado ni remotamente sobre el análisis algorítmico asintótico.

  2. Lenguajes funcionales No, una sola familia de idiomas es solo un enfoque para pensar en los problemas. ¿Por qué solo esta parte debería importar?

  3. Problema de detención Algunos son demasiado específicos y las personas han vivido la vida sin saber que existieron.

  4. Escucha Si no estás escuchando, entonces vives en un mundo propio. ¡No necesariamente perjudicial!

  5. Ciclo de desarrollo de software Nah! Todavía podemos encontrarnos con un software increíble o un esfuerzo heroico en solitario.

  6. teoría de la complejidad , supongo que esto podría ser, pero sin todos los formalismos

Esa pequeña idea de Comp Science

Yo diría: " Abstracciones Abstracciones Abstracciones ... ". Aprende sobre eso. Vea ejemplos a su alrededor y aprenda cómo construir con él. Está en todas partes. Toda la informática, la ingeniería y las aplicaciones se ven como capas sobre capas de abstracción.

Una vez que sabes esto, comienzas a aprender a mirar bien a tu alrededor.

Cuando ve a alguien usando list insertionin pythony not append, sonríe porque sabe que las listas de python se crean utilizando la abstracción de matriz donde las inserciones son costosas y abaratan.

Este es solo un ejemplo.

pyfunc
fuente
+1 por una respuesta en la que obviamente has pensado mucho.
Jon Hopkins
solo un comentario sobre su comentario sobre el Problema de detención: "Vivir la vida sin saber que existe" es cierto para CUALQUIER tema de informática.
4

Teoría de Autómatas y FSM. :-)

Prasoon Saurav
fuente
3

Casos de uso competitivo de estructuras de datos.

Hay situaciones en las que se requiere un mapa con árboles rojo-negros para garantizar el rendimiento y otras en las que no se puede utilizar una matriz, nuevamente para garantizar el rendimiento. Saber cuándo elegir qué estructura de datos es una habilidad invaluable.

Fanático23
fuente
3

solo hay tres números que importan:

  • cero
  • uno
  • muchos
Steven A. Lowe
fuente
pero eso no implica que '3' también es importante?
Javier
Se supone que es cero, uno e infinito: en.wikipedia.org/wiki/Zero_One_Infinity
Thomas Owens
@Javier: 3 es un subconjunto de muchos
Steven A. Lowe, el
@Thomas: dice quién?
Steven A. Lowe
@ Steven Mi comprensión podría no ser del 100%, aquí, pero creo que la idea es que no tienes nada, una sola cosa, o la cantidad de cosas que tienes no debería ser ilimitada. Si no se limita a ninguna o una instancia, no debe limitar las instancias. Sin embargo, no estoy completamente seguro de POR QUÉ este es el caso (solo estoy vagamente familiarizado con el concepto Zero / One / Infinity).
Thomas Owens
3

Lo más importante que aprendí en CS (y como desarrollador durante muchos años y como arquitecto) es la capacidad de descomponer un problema basado en la volatilidad y no en la función. Todos los buenos diseños aíslan y encapsulan la volatilidad. Todos los buenos desarrolladores / arquitectos hacen esto intuitivamente, incluso si no lo han formalizado en su pensamiento. Una gran razón para la falla del proyecto es la falla en romper un problema sobre la base de la volatilidad y encapsularlo. Una falla en encapsular la volatilidad inevitablemente conduce a la complejidad y al fracaso del proyecto.

JP Alioto
fuente
¿Qué quiere decir exactamente con volatilidad?
amara
3

Debe conocer suficiente teoría de autómatas para poder saber dónde se encuentra el problema con el que se enfrenta en la jerarquía de los lenguajes formales. A partir de eso, puede descubrir algunos usos prácticos importantes, como por qué no debe usar un REGEX para analizar HTML (HTML necesita una gramática libre de contexto para describirlo), y por qué toma tanto más tiempo compilar C ++ en lugar de Java o C # (C ++ requiere una máquina Turing, mientras que Java y C # pueden describirse con gramáticas libres de contexto).

Los niveles más importantes de los lenguajes formales son, de más débil a más fuerte:

  1. Idiomas que pueden ser analizados por un autómata finito o un REGEX (las implementaciones de REGEX con referencias inversas son más potentes que esta categoría, pero aún no pueden analizar todo en la categoría 2)

  2. Idiomas que pueden ser analizados por un autómata con memoria de pila o una gramática libre de contexto.

  3. Idiomas que puede analizar una máquina de Turing o un autómata con memoria de acceso aleatorio.

Dan Monego
fuente
Mmm no. Una expresión regular analiza una gramática regular. Esa es exactamente la categoría de gramática que puede ser aceptada por un autómata de estado finito. Y una 'Gramática de Chomsky' no se refiere exclusivamente a las gramáticas libres de contexto, que es lo que procesan las máquinas de pila.
philosodad
@philosodad: la gramática libre de contexto es más precisa, y he actualizado la publicación para usar el término. No entiendo tu problema con lo que dije sobre las expresiones regulares.
Dan Monego
@Dan: mi problema es que una expresión regular es precisamente tan poderosa como un autómata de estado finito, y si puede analizar CUALQUIER gramática libre de contexto determinista con una máquina, puede analizar TODAS las gramáticas libres de contexto deterministas.
philosodad
O, para ser más precisos: necesita una pila o no. Si necesita una pila para analizar un idioma, debe tener una pila para analizar el idioma y, por lo tanto, si un idioma requiere una pila para analizarlo, puede analizar ese idioma.
philosodad
@philosodad: existen dos tipos de expresiones regulares: expresiones regulares en teoría y expresiones regulares implementadas en el software. Tiene razón sobre las expresiones regulares teóricas, pero la mayoría de las implementaciones tienen varias características más allá de su base teórica y pueden coincidir con algunos lenguajes no regulares, como a ^ n para non prime n. Debido a que este es un hilo sobre la teoría en la práctica, hice todo lo posible para mencionar que hay una diferencia entre la definición formal y la utilizada en la naturaleza.
Dan Monego
2

Bueno, podría darte una respuesta aburrida: teoría de autómatas y teoría de la información.

O podría decirle lo que aprendí de un consultor de hardware hace mucho tiempo:

  • "Lo suficientemente bueno" no es lo suficientemente bueno.
Mike Dunlavey
fuente
1

El Ciclo de vida del desarrollo de software es algo que sugeriría saber si aún no lo hace. Por supuesto, esto se introdujo en un curso de informática de segundo año y es algo que se usa repetidamente en proyectos de software. Esto puede ser útil para tener una idea general de cómo va un proyecto de principio a fin, aunque si quieres profundizar hay metodologías como Waterfall o Agile que puedes estudiar para obtener un conocimiento más específico.

JB King
fuente
2
La ley de Murphy: Cualquier cosa que pueda ir mal, irá mal
Richard
No es la teoría CS, pero esta es una excelente respuesta.
justkt
1

Programación

Del Departamento de Matemáticas y Ciencias de la Computación Hobart y William Smith Colleges llega Computer Science 124 Introducción a la programación :

Los temas incluyen estructuras de control, objetos, clases, herencia, estructuras de datos simples y conceptos básicos de desarrollo de software.

Si no puede programar, no irá muy lejos en la informática del mundo real.

Y sí, he notado que eres programador. Esto es para mejorar su conocimiento general de la teoría de programación y qué otros enfoques hay disponibles para usted.

¿Es la programación informática como la conocemos?

En respuesta al comentario de @Thomas Owens, quien señaló (con bastante razón) que la programación no es estrictamente informática, me gustaría citar el artículo de Wikipedia sobre informática :

... el enfoque de la informática está más en comprender las propiedades de los programas utilizados para implementar software como juegos y navegadores web, y utilizar esa comprensión para crear nuevos programas o mejorar los existentes ...

Por lo tanto, mientras lo leo, al programar estás demostrando tu comprensión de la teoría de la programación. Esto, a su vez, debería ayudarlo a crear un código simple y elegante que sea una alegría para los demás.

Gary Rowe
fuente
La programación no es teoría de CS. De hecho, podría argumentar fácilmente que la programación no es informática en absoluto.
Thomas Owens
@Thomas Owens He actualizado mi respuesta para respaldar mi afirmación de que es válida. ¿Podrías revisarlo y hacerme saber tus pensamientos?
Gary Rowe
1
Todavía no creo que la programación sea CS. La programación PODRÍA ser útil para un científico de la computación que quiera implementar un algoritmo o estructura de datos, pero los temas de la teoría de CS (desde mi libro Introducción a la teoría de CS, por lo que probablemente también hay temas más avanzados) incluyen lógica, teoría de autómatas, teoría de grafos , computabilidad, complejidad computacional y análisis de algoritmos. También diría que los lenguajes de programación (la teoría detrás del diseño y la implementación de un lenguaje) también son parte de la informática. Sin embargo, no necesita poder programar para ser un buen científico de la computación.
Thomas Owens
@ Thomas Owens Entiendo tu punto y (se pone el sombrero purista) Estoy de acuerdo. Sin embargo, el OP está pidiendo un poco de CS que lo ayude en el mundo real. Me aferro a mi opinión de que la teoría de la programación (como se implementa en un buen código) es un poco. He editado un poco en consecuencia.
Gary Rowe
Sí. Desde CS, diría que comprender los lenguajes y paradigmas de programación podría ayudar (especialmente si está implementando DSL, pero conocer muchos paradigmas como lógica de procedimiento, funcional, OO, solo ayuda en el desarrollo de software). Comprender los algoritmos y las estructuras de datos también lo ayuda a elegir el (los) adecuado (s) para resolver su problema de la manera más eficiente. La teoría de los autómatas podría ayudar (una vez trabajé con un sistema que era un FSM gigante, pero no sé qué tan común es eso). Entonces diría que las estructuras de datos, los algoritmos y la teoría PL serían las cosas más útiles para saber de CS.
Thomas Owens
1

Tengo que estar en desacuerdo con Konrad Rudolph. Hay "un poco" de informática que debes conocer para convertirte en un mejor "programador del mundo real". Si no quita nada más de las respuestas que está obteniendo aquí, al menos considere esto: ¡Satisfacer los requisitos NO es lo mismo que satisfacer al cliente! Los usuarios finales SIEMPRE intentarán usar su programa de una manera que nunca pensó o codificó. SIEMPRE, SIEMPRE, SIEMPRE.

Por lo tanto, para ser un mejor programador, primero debe ESCUCHAR. Escucha al cliente. Escucha sus necesidades. Escucha sus deseos. Y especialmente, escuche su nivel de "tecnología-pertise". No puedo decirle cuántas veces he visto un proyecto construido que fue exactamente lo que se solicitó, pero no lo que el cliente realmente necesitaba. Todo porque el programador que reunía los requisitos no estaba realmente escuchando.

Algo más que puede quitar es que, a menos que tenga experiencia en el diseño de la interfaz de usuario, pídale a alguien que diseñe la interfaz de usuario. SIEMPRE puedo detectar una aplicación donde la interfaz de usuario fue diseñada por el programador y no por un experto. Lo que es lógico y tiene sentido para usted no tendrá sentido para el cliente. Y, si sus clientes no son expertos en tecnología (¿y quiénes son?), Entonces su solución "funcionalmente correcta, pero estéticamente fea" se encontrará con el calor de la mofeta en una cena.


fuente
3
Esta respuesta no trata con la teoría de CS, que es lo que Hopkins preguntó.
James
1

Lenguajes funcionales!

Aprender lenguajes funcionales te hace pensar en términos de expresiones, en lugar de pasos y estados mutables con nombre (variables). Esto tiene un impacto significativo en su capacidad para lidiar efectivamente con los problemas de programación de todos los días, especialmente ahora que casi todos los lenguajes populares tienen características funcionales.

La teoría de los algoritmos y la complejidad también es importante, pero es algo menos interesante ya que principalmente le permite poner nombres a cosas que generalmente ya sabía y que podría deducir.

Magnus Wolffelt
fuente
0

Que las computadoras son esencialmente patrones, nada más. Todo se reduce a la máquina de Turing, el clásico concepto informático de explicar el mecanizado de patrones.

therobyouknow
fuente
-2

¡Resolución de problemas y ganas de seguir aprendiendo!

Me sirven mucho mejor que saber la clasificación rápida y la normalización de la base de datos.

Bryan Harrington
fuente
66
Esa no es la teoría de la informática, se aplican igualmente a la ingeniería electrónica (o prácticamente cualquier otra forma de).
Jon Hopkins
A mi modo de ver, tomar en cuenta tu ejemplo al saber que la ordenación rápida no es útil. Saber que existe y lo que hace que sea especial es útil, pero también está a una búsqueda de Google si no sabía nada al respecto. Conocer cualquier algoritmo tampoco es útil. Sin embargo, ¡saber cómo crear uno e interpretar uno es! Quizás si pudiera cambiar mi respuesta, la complejidad es probablemente la más importante.
Bryan Harrington
1
No puede buscar algo si no sabe que lo necesita o que existe. Su respuesta enumera las cualidades importantes que debe tener un desarrollador, pero no responde la pregunta planteada.
Adam Lear