¿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:
- Qué conceptos debo entender
- Cualquier buen recurso para comprenderlos correctamente (ya que Wikipedia puede ser un poco denso y académico a veces).
computer-science
Jon Artus
fuente
fuente
Respuestas:
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:
fuente
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.
fuente
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:
fuente
Algunos conceptos que ayudaron a mi desarrollo (intelecto y código):
Estos son dominios completos de matemáticas discretas, pero se requiere una introducción seria para CS:
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 .
fuente
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.
fuente
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.
fuente
La Matriz de competencias del programador cubrió esto en detalle, pero destacaré un par:
fuente
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.
fuente
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 ).
fuente
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
fuente
Para mí, obtuve mucho del siguiente curso en el equipo universitario
Cosas que desearía haber hecho en el equipo universitario
fuente
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.
fuente
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.
fuente
Encapsulamiento
En informática, la encapsulación es el ocultamiento de los mecanismos internos y las estructuras de datos de un componente de software detrás de una interfaz definida, de tal manera que los usuarios del componente (otras piezas de software) solo necesitan saber qué hace el componente y no pueden hacerse dependientes de los detalles de cómo lo hace
fuente
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:
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.
fuente
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!
fuente
Algunos de los conceptos del sistema operativo
[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 ]
fuente
Esfuércese por lograr un bajo acoplamiento y una alta cohesión .
(Robé esta imagen del sitio web vinculado arriba)
fuente
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.
fuente
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 ...
fuente
Como recién graduado de una licenciatura en informática, recomendaría lo siguiente:
Como se menciona en varias publicaciones, notación Big O
Diseño OO
Estructuras de datos y algoritmos (no recuerdo el título exacto del libro que utilicé, lo actualizaré si lo recuerdo)
Sistemas operativos http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580
Problemas NP
fuente
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í)
fuente
Estructura e interpretación de programas informáticos . Si comprende este libro, todo lo demás se puede construir fácilmente sobre esa base. Si tiene problemas con los conceptos del libro, puede que sea un desarrollador de software, pero no un científico informático.
fuente
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).
fuente
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.
fuente
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)).
fuente
Yo diría que a continuación están las cosas más importantes.
Luego, ve a cosas específicas relacionadas con el idioma. ¡¡Espero que esto sea útil!!
fuente
Comenzaría con la cita:
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 :)
fuente
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.
fuente
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.
fuente