¿Cómo crean los algoritmos los programadores de software?

¿Cómo crean música los músicos? ¿Cómo escriben las novelas los autores? ¿Cómo crean los científicos hipótesis relevantes?

Aprenden estudiando ejemplos existentes de su arte, hasta que los patrones emergentes se queman en sus cerebros. Entienden las reglas que rodean su arte, por lo que saben cómo usar las herramientas de manera efectiva. Y su intuición se desarrolla para que puedan ver o sentir lo que probablemente funcionará o lo que no funcionará.

Cualquier código que escriba es, en algún nivel, un algoritmo. A medida que gane más experiencia, puede aprender a crear algoritmos más sofisticados. Al igual que en otros dominios expertos, especialmente aquellos con un componente artístico, además también puede haber una aptitud. No todos pueden ser Mozart, no importa cuán duro practiquen.

Pero casi todos pueden aprender a tocar un instrumento y, con práctica, escribir música que funcione.

Para situaciones triviales, es más o menos lo mismo que resolver acertijos o pruebas de matemáticas …

  1. Tiene un requisito que describe la salida deseada de la entrada dada.
  2. Si esto es tan simple como “a + b”, simplemente codifíquelo, sin pensarlo demasiado (aunque teniendo en cuenta los problemas de desbordamiento …)
  3. Si este no es un problema simple, simplemente revierto el problema; Encontrar las piezas que faltan del rompecabezas y cómo generarlos datos conocidos.
  4. Si todos esos subproblemas pudieran resolverse con algoritmos que ya conozco (o podría googlearlos), simplemente los aplico y fusiono como algoritmo final.
  5. A veces, cuando sabía / predecía / calculaba que la eficiencia podría ser baja debido al tamaño de los datos o la complejidad del algoritmo, podría comenzar a buscar mejoras o alternativas de algoritmos.
  6. El 99% de las veces no necesito nada más complicado que esto. Simplemente evito los campos CS que dependen en gran medida de cálculos y algoritmos (en el sentido más básico de este término), mientras juego de vez en cuando con rompecabezas algorítmicos en línea.

Sin embargo, estos problemas trivialmente separados aparecen casi solo en dichos concursos de programadores y en campos como AI, ML, gráficos, procesamiento de señales y similares. Sin embargo, por sí mismos no son triviales de descubrir. No me concentraré en ellos de todos modos porque no es mi especialidad.

Para situaciones que no se concentran en calcular algo (ocurre la mayoría de las veces en la mayoría de los proyectos), el algoritmo real es solo un código pequeño (casi) sin importancia que debe organizarse junto con muchos otros códigos para finalizar una tarea . La mayor parte del código (y el tiempo) se gastará en mover datos de un lugar a otro, buscarlos, filtrarlos, almacenarlos en caché, validarlos, esperar otros sistemas, detectar errores, escribir registros, guardar datos, sincronizar datos, verificar la seguridad, etc. Cada una de estas tareas por sí sola rara vez es una ciencia espacial (bueno, a menos que comience a hacer cosas paralelas / distribuidas). Se conecta y equilibra correctamente todo esto que se vuelve complicado. En este nivel, no adaptamos algoritmos (en el sentido común), sino patrones, construcciones algorítmicas de alto nivel que nos dicen cómo resolver todas esas cosas típicas en el contexto de problemas particulares una y otra vez de una manera que ya se demostró que es correcto.

Entonces, tanto los algoritmos como los patrones están bien definidos y disponibles para otros desarrolladores para su reutilización. Principalmente como bibliotecas.

Los campos y las empresas que realmente crean algoritmos totalmente nuevos y alucinantes son solo un pequeño porcentaje. La mayoría de los demás simplemente no los necesitan. Simplemente combinan piezas ya descubiertas juntas. Bien, por supuesto, hacer esto correctamente es una historia completamente diferente.

Si consideramos que el algoritmo significa “método computacional para resolver un problema”, entonces la creación de nuevos algoritmos no está en el ámbito del desarrollo de software. Desea mirar la investigación en informática en la academia (o de otro modo) para ese tipo de cosas. Pasan todo el día estudiando las investigaciones existentes y tratando de encontrar algún pequeño caso sobre el cual puedan desarrollar y publicar.

Los ingenieros de software simplemente aplicamos algoritmos conocidos a los problemas prácticos que enfrentamos. Un buen programador sabrá cuándo un algoritmo simple pero computacionalmente costoso está bien y cuándo se necesita una solución más compleja pero más rápida. Parte de esto toma la forma de probar y estimar el número de usuarios / solicitudes / accesos / lo que sea que esté tratando el sistema.

Cuando se usan lenguajes de muy alto nivel como Python, a menudo ocurre que alguien más ha escrito y probado un algoritmo que deseo usar, así que solo descargo la biblioteca que escribieron y lo uso. No tiene sentido hacer mi propia implementación cuando ya existe (llamamos a esto “reinventar la rueda”), ya que tendría que escribir, depurar y probar el nuevo código.

Odio usar el término Ingeniería para software. Rompe mi regla “¿Vivirías en un edificio construido de la misma manera que sabes que el software está construido? incluyendo, la gestión y el diseño “. Pero, la aplicación de algoritmos es muy similar a la de muchas otras disciplinas de ingeniería. Existen prácticas recomendadas, reglas generales, incluso frases antiguas y materiales de referencia que indican cómo se han resuelto estos problemas antes para crear un patrón o una plantilla.

Del mismo modo que un músico de blues podría discutir las complejidades de “llamada y respuesta”, “progresión de acordes”, “blues de doce barras” y “notas azules”. Un programador puede hablar de un patrón de fábrica, o una recursión, o un tiempo mientras, o matrices multidimensionales.

Una forma de ver esto es leer o leer el libro “Gang of Four”, “Patrones de diseño”.

En términos generales, en su mayoría no lo hacen o al menos lo hacen como parte de un equipo. Hay algunos algoritmos comunes que aprenderán o son obvios después de un poco de práctica de codificación, pero lo básico que hace que cada sistema de software sea diferente generalmente proviene de otra persona, por lo que muchas personas se autodenominan “desarrollador” en lugar de “codificador”. porque la habilidad más importante es la capacidad de analizar lo que los “clientes” realmente quieren que el software que está escribiendo para ellos haga. En la mayoría de las circunstancias, escribir código que hace lo correcto de manera subóptima es mucho más valioso que hacer lo incorrecto con la máxima eficiencia.

Después de varios años de educación intensiva, incluido el cálculo en la universidad, utilizamos las habilidades que aprendimos para resolver problemas. Al comprender cómo funciona la CPU, después de tomar clases para comprender cómo funcionan los diferentes lenguajes de programación con el hardware y la lógica matemática, podemos crear algoritmos elegantes para resolver problemas complejos y hacer que las máquinas hagan lo que queremos que hagan. .

Hay un método llamado O (x) donde x es el factor de eficiencia del código. cuando x es grande, es un código incorrecto Para un procesamiento intensivo. Considere buscar datos en una base de datos y piense cómo podría buscar una tarjeta de números de especificación en un mazo de 100. suponga que las tarjetas están en orden y desea buscar la tarjeta número 75. ¿Cómo la encontraría rápidamente?

Tú. podría comenzar al principio o al final del mazo e ir hasta que lo encuentre. Esta es una búsqueda lineal, O (100). Observará todas las cartas hasta que encuentre la carta elegida.

Vamos a llevar x a un valor muy grande. Trabajo con bases de datos con cientos de miles de millones de registros. La búsqueda lineal llevará horas, a menos que lo que estoy buscando esté al comienzo de la búsqueda.

X es el número de registros. Ahora, si construyo un índice en una estructura de datos eficiente, puedo convertir O (x) en O (base de registro 2 (x)) al construirlo en un árbol binario.

Lo que esto significa es que, dada la base de registro 2 de x, puedo encontrar mi registro en pocos conjuntos de datos.

¿Alguna vez has jugado 21 preguntas? Mismo concepto Algunos piensan en algo. Usted hace preguntas de sí / no solamente. Si tienes cuidado con lo que preguntas, puedes obtener lo que tu amigo está pensando en 21 preguntas o menos.

Log ^ 2 (1000000000) es 20.8. Esto significa que en mil millones de registros solo necesita mirar no más de 21 para encontrar el suyo.

En la universidad hay clases que enseñan algoritmos y optimización. Utilizamos estas herramientas y las incorporamos en nuestros jorbs para crear un software elegante para realizar tareas muy complejas.

En los últimos años, los ingenieros de software de Mars Mission pudieron colocar un satélite sobre Marte para fotografiar el aterrizaje del rover. En Vivo. Esta fue quizás la hazaña de ingeniería de software más impresionante que he visto. ¡Imagina que todas las variables van desde una nave espacial de la Tierra viajando miles de millones de micrófonos en el transcurso de varios meses para transmitirse en vivo por televisión para transmitir el aterrizaje de la nave que he visto en televisión!

¿Imagina los algoritmos necesarios para guiar un cohete cohete SpaceX para que aterrice en una pequeña plataforma de aterrizaje flotante de forma automática y precisa cada vez, sin importar el punto de elevación o aterrizaje? Estos serían muy desafiantes y profundamente gratificantes.

Respondemos una necesidad. Sin embargo, es mejor aprender de los demás. Mira los patrones de diseño.

Casi todos los algoritmos se crean utilizando el pensamiento matemático.

Un proceso de diseño algorítmico es equivalente a procesos que resuelven problemas matemáticos relativos.

el conocimiento se origina en el pensamiento, el pensamiento se origina en varios tipos de problemas.

El conocimiento complejo se desarrolla utilizando e innovando el conocimiento simple.

si desea mejorar sus habilidades algorítmicas, necesita aprender conocimientos y resolver problemas sobre algoritmos para entrenar su cerebro y dominar el pensamiento algorítmico paso a paso

existen conectividades sistemáticas entre conocimientos y problemas a través del pensamiento de resolución de problemas, si alguien quiere dominar el pensamiento detrás de un conocimiento, esa persona necesita saber por qué ese conocimiento podría resolver esos problemas.

saber cómo podrían resolverse algunos problemas es útil para que alguien domine algunos conocimientos

More Interesting

¿Cuál es el mejor algoritmo para sumar números en matrices anidadas?

¿Cuál es la optimización de un conjunto de antenas?

¿Hay alguna forma científica de barrer un piso?

Cuando se ejecuta el ordenamiento rápido aleatorio, ¿cuántas llamadas se realizan al generador de números aleatorios en el peor de los casos? ¿Y también para el mejor caso?

¿Tiene sentido saltar directamente a las máquinas de vectores de soporte en lugar de probar con otros algoritmos lineales, primero, en el aprendizaje automático?

¿Cuáles son algunos algoritmos rápidos de descenso de gradiente?

Cómo entender el algoritmo maestro del documento sobre la resolución del isomorfismo gráfico en tiempo cuasi polinomial

¿Debo aprender el concepto profundo del aprendizaje automático como el curso de Andrew Ng o es suficiente para saber qué algoritmo se utiliza cuando?

¿Existe un algoritmo para encontrar un árbol con una longitud de ruta mínima ponderada para un gráfico conectado genérico?

¿En qué idioma debo estudiar estructuras de datos y algoritmos? ¿Y por qué?

¿Cuál es el algoritmo utilizado por el IRCTC para reservar en línea?

¿Cómo son útiles las conferencias sobre algoritmos de Ravindra Babu Ravula para las entrevistas en el campus?

¿Cuál es el mejor algoritmo de detección de colisión de vehículos?

¿Cómo se ordenan 10 números en orden creciente?

¿Pueden los algoritmos de aprendizaje de refuerzo actuales elegir múltiples acciones dado el estado actual?