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).
learning
computer-science
theory
Jon Hopkins
fuente
fuente
if
yloop
comunicado que se han escrito utiliza un subconjunto de esas dos áreas de estudio.Respuestas:
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.
fuente
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.
fuente
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
Esta es una pregunta un poco difícil.
Todos los aspectos de la informática son importantes de una forma u otra.
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.
fuente
Sí, esto me hizo pensar durante horas.
En el proceso, tuve que eliminar algunas de las respuestas comunes dadas aquí ya.
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.
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?
Problema de detención Algunos son demasiado específicos y las personas han vivido la vida sin saber que existieron.
Escucha Si no estás escuchando, entonces vives en un mundo propio. ¡No necesariamente perjudicial!
Ciclo de desarrollo de software Nah! Todavía podemos encontrarnos con un software increíble o un esfuerzo heroico en solitario.
teoría de la complejidad , supongo que esto podría ser, pero sin todos los formalismos
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 insertion
inpython
ynot 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.
fuente
Teoría de Autómatas y FSM. :-)
fuente
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.
fuente
solo hay tres números que importan:
fuente
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.
fuente
El problema de la detención
El hecho de que existan problemas relacionados con la computadora que simplemente no pueden ser resueltos por una computadora.
fuente
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:
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)
Idiomas que pueden ser analizados por un autómata con memoria de pila o una gramática libre de contexto.
Idiomas que puede analizar una máquina de Turing o un autómata con memoria de acceso aleatorio.
fuente
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:
fuente
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.
fuente
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 :
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 :
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.
fuente
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
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.
fuente
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.
fuente
¡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.
fuente