Cómo aprender a pensar como un programador de computadoras

AH … esta pregunta. Lo he esperado por tanto tiempo …

Sabes qué, esta cosa única es el mayor obstáculo que impide que la mayoría de los novatos se conviertan en mejores programadores. Cómo pensar en términos de una máquina; ¿Cómo traducir un problema cotidiano dado en una secuencia de pasos lógicos que podrían ser entendidos y ejecutados por una computadora? Una vez que empiezas a pensar así, comienzas a resolver problemas rápidamente.

Hay varias cosas que puede / debe hacer para mejorar su capacidad de pensar en términos de una máquina. Recomiendo lo siguiente (un poco de antecedentes al principio, pero sigue leyendo):

  1. Comprender el hecho de que las computadoras no pueden / no pueden pensar ; ellos solo ejecutan . Ejecutan una serie de instrucciones atómicas que, si se ordenan correctamente, generan los resultados requeridos. Por lo tanto, cualquier tarea debe traducirse en una secuencia de pasos.
  2. El punto básico es que estos componentes no son inteligentes. Simplemente están diseñados de una manera que los obliga a generar una salida particular para una entrada particular. Permítame darle un ejemplo mínimo: cuando presiona el botón del interruptor, la bombilla se enciende. Ni el interruptor ni la bombilla necesitan decidir o pensar en nada en todo el proceso. La circuitería entre el interruptor y la bombilla es por diseño de tal manera que al colocar el interruptor en la posición ON permitiría que la corriente fluya hacia la bombilla. Básicamente de la misma manera, el procesador de la máquina se fabrica de manera que puede realizar ciertas operaciones matemáticas. Lea libros introductorios sobre lógica y diseño digital si desea obtener una comprensión más profunda de la forma en que funcionan los componentes de la computadora.
  3. Estas instrucciones atómicas son demasiado tediosas para que los humanos las entiendan. Afortunadamente para nosotros, existen lenguajes de programación de alto nivel que son más fáciles de leer y escribir para los humanos. Este lenguaje nos proporciona un conjunto de instrucciones no tan atómicas mediante las cuales podemos escribir la secuencia de pasos que resolverán nuestro problema. Estas instrucciones de nivel superior serán traducidas automáticamente a instrucciones atómicas de bajo nivel por los compiladores de idiomas para que la máquina las ejecute. Tenga en cuenta que incluso estos lenguajes de nivel superior son demasiado simples en comparación con los lenguajes humanos y ofrecen solo un puñado de construcciones que reunimos para escribir nuestras soluciones.
  4. Hay algunos sitios web que ofrecen juegos visuales que le enseñan a pensar en términos de ejecución secuencial. Uno de esos sitios es CodeMonkey que enseña a los niños y principiantes cómo lograr ciertos objetivos al dividirlos en trozos más pequeños, cada uno de los cuales podría ser realizado por su mono. (Descargo de responsabilidad: no estoy asociado con el sitio web de ninguna manera).
  5. Ahora que comprende por qué los idiomas necesitan un enfoque secuencial para resolver problemas, sigamos adelante. Como programador, su tarea principal (al principio) sería traducir un problema determinado en una secuencia de instrucciones de lenguaje para que la computadora pueda ejecutarlas y generar resultados. Para los principiantes, este es el punto donde deberían comenzar a aprender el pseudocódigo ; Una notación que se asemeja a un lenguaje de programación simplificado. No hay reglas estrictas para escribir pseudocódigo. Su objetivo principal es permitir a los programadores dividir un problema mayor en unidades más pequeñas, cada una de las cuales podría traducirse a un lenguaje de programación específico.
  6. Al escribir un pseudocódigo, la clave que debe tener en cuenta es que una máquina, al igual que el mono de su juego (ver # 4 arriba) solo puede realizar un conjunto atómico básico de operaciones. Además, quizás aún más importante, debe comprender que una máquina puede sumar, multiplicar o comparar solo dos números a la vez . Cuando entra un tercer número, debe mover al menos uno de los dos números existentes fuera de la tabla, a ubicaciones de memoria temporales. Esto es muy parecido al Juego de Sacerdotes y Demonios, donde debes llevar a 6 personas (3 hombres y 3 fantasmas) al otro lado del río usando un bote que puede llevar solo 2 personas a la vez. También debes tener cuidado de que los humanos nunca sean superados en número y, por lo tanto, comidos por los fantasmas a ambos lados del río. La solución requiere una secuencia particular de viajes en barco. Esta secuencia se conoce como algoritmo .
  7. Después de esto, comience a aprender algoritmos introductorios que incluyen ordenar, intercambiar, min / max, encontrar la edad usando d / o / birth, encontrar LCM y GCD de números, etc. Todos estos problemas ya se han resuelto, pero intente resolverlos usted mismo. sin consultar a nadie. Las cosas comenzarán a tener sentido para usted y su cerebro se acostumbrará a pensar en términos de pasos secuenciales.
  8. Comience a aprender algoritmos más complejos ahora, incluidos Dijkstra, Merge Sort, FFT, algoritmos de gráficos, etc. De especial importancia serían los algoritmos que se ejecutan en entornos de computación paralela / grid. Esto es así porque los procesadores ofrecen cada vez más núcleos y para aprovechar al máximo su potencia informática, debe escribir código que pueda ejecutarse en paralelo.
  9. Una vez que haya pasado algunos años escribiendo código y jugando con idiomas, bibliotecas y herramientas, descubrirá que la mayoría de los problemas algorítmicos elementales ya han sido resueltos y entregados a los programadores por proveedores que hicieron estos idiomas, y que usted no es necesario reinventar la rueda reescribiendo un programa que realice una ordenación por fusión. Quizás se pregunte por qué, ¿por qué en el mundo debería pasar su tiempo aprendiéndolos? La respuesta es que programar cualquier cosa requiere que piense en términos de algoritmos todo el tiempo, no solo cuando necesita resolver uno de los problemas conocidos. Por lo tanto, siempre es bueno para un programador poder traducir problemas dados en una lista secuencial de pasos.
  10. Después de muchos años más, estará en una posición de alto nivel en una compañía de software y ya no escribirá código diariamente. Estos algoritmos aún lo ayudarán a verificar el código de los miembros de su equipo y les ayudarán a escribir cosas mejores. En algún momento, alguien publicará una pregunta en Quora preguntando cómo pensar en términos de un programador de computadoras y ¡entonces podrás ayudarlo!

¡Feliz codificación!

Dado que la pregunta no dice nada acerca de querer convertirse en un programador de computadoras, solo piense como tal, probablemente quiera algo más simple que los lenguajes y la sintaxis …

1. Piensa en términos absolutos . No hay suposiciones en la programación. Si desea que un programa haga x, debe decirle exactamente cómo hacer x. Y no puedes dejar nada afuera.

Una esposa le pide a su esposo programador que vaya al supermercado. Ella le dice que consiga un galón de leche y, si tienen huevos, que obtenga una docena.

Cuando regresó, tenía 12 galones de leche. Cuando ella le preguntó por qué, él dijo

“Tenían huevos”.

Esto puede ser una broma, pero demuestra las diferencias entre la forma en que pensamos y la forma en que funcionan los programas.

2. Defina cada variable . Al escribir un programa, diferentes partes del código utilizan valores aparentemente similares que en realidad necesitan cambiar de un paso a otro. Al comienzo de cada subrutina, se puede hacer una definición que dicte cómo reaccionará el programa cuando aparezca esa variable.

Es muy posible decirle a la computadora que 2 + 2 = 5. Entonces, si la ecuación 2 + 2 se introduce en algún momento después de la definición, el resultado siempre será “5”.

3. Piensa en términos booleanos. Divida todo en términos de “SI ENTONCES”, “Y”, “O” o “NAND” (o NO Y).

SI comienza a llover, LUEGO abriré mi paraguas.

SI doy vuelta a la derecha Y la heladería está abierta, ENTONCES obtendré un cono.

SI la luz es verde O si la luz es amarilla, ENTONCES continuaré sin parar.

4. Pruebe constantemente sus procesos de pensamiento para ver si funcionarán, o si se encontrará con un resultado no deseado o un bloqueo completo . El chiste anterior demuestra una falta de instrucción completa, lo que resulta en un resultado no deseado.

5. Esforzarse por poner todo en sus términos más simples . Cuanto más simplificado sea un programa, mejor. Cuanta más basura coloque, mayor será la posibilidad de un problema.

Hay 10 tipos de personas en el mundo, los que saben binario y los que no.

Este chiste ilustra que realmente solo necesitas dos dígitos para describir algo. En términos de complejidad, este es el sistema más simple, pero puede usarse para hacer las mismas cosas que puede hacer el sistema base 10. Y si aprende a entenderlo, resulta más fácil trabajar con él. En la aplicación del mundo real, tendemos a complicar demasiado las cosas. Trabajo, relaciones y resolución de problemas cotidianos.

Nuestros cerebros son un tipo de computadora orgánica, y nuestros procesos de pensamiento han creado múltiples atajos para ser más eficientes. Pero hay veces que esos atajos pueden causar problemas, como prejuicios y suposiciones. Pero la programación es pura en el sentido de que TODO tiene que definirse. Hay atajos, pero generalmente solo en la redacción (sintaxis) y cómo se organiza la codificación.

Los programadores informáticos “reales” saben cómo reutilizar. ¿Porqué es eso? Comenzar con un código probado tiene muchos beneficios. Muchos, basados ​​en los comentarios que he visto, no pueden usar un conjunto complicado de módulos de biblioteca. Por supuesto, estos pueden ser un oso.

Parece que hemos perdido la noción de que el software necesita ser diseñado. Por lo que he estado observando durante la última década y media, la parte de ingeniería se ha ido. Tenemos sistemas para los que los usuarios deben adaptarse; en realidad, es peor que eso, ya que el usuario es el conejillo de indias. Oh, saquemos algo y veamos cómo va. Detroit parece haber adoptado eso, para empezar.

Entonces, ¿reutilizar? Por lo general, se trata de cosas ya hechas. Todos tienen acceso ahora a una gran cantidad de bibliotecas. Sin embargo, recuerde que el uso de estas cosas debe ser un disfraz de lo que se dijo anteriormente. Solía ​​haber un gran enfoque en los requisitos y especificaciones. Ahora, es twiddle con código. Cruza los dedos.

¿La parte más difícil de la reutilización? Aprender a usar la cajita. Por lo tanto, a muchos les gusta rodar sus propias cosas. A veces eso es necesario. En su mayor parte, no.

Se mencionó el bloqueo del codificador. En mi día, nunca comencé desde una página en blanco. ¿Qué? Tienes el enunciado del problema. Y, después de desglosar un poco las cosas, verá qué enfoques son más adecuados que no. ¿Y el lenguaje? Trabajé en muchos y siempre recogí pequeños fragmentos (mi propia biblioteca) desde los cuales podía comenzar.

Esto no es diferente a usar una plantilla (por ejemplo, en un procesador de texto), excepto que es texto que se puede modificar rápidamente en un IDE. Bueno, no teníamos esos y aun así hicimos cosas maravillosas. Ese podría ser un problema. Los IDE tienen botones más allá de lo necesario. ¿Por qué la gente corre tras campanas y silbatos?

Ya sabes, eso te pone en control por el mago. Tener un texto abierto que conoces es una situación mucho mejor. Ah sí, el IDE tiene un problema y evita el progreso? Bueno, ve a una huella más pequeña. Después de todo, si uno prueba de adentro hacia afuera, uno se asegura de que las cosas funcionan cuando se juntan.

—-

En 2017, nunca se necesita una página en blanco en la programación. Todo tipo de cosas relacionadas con la calidad y la confiabilidad mejorarán si los métodos se ajustaran un poco. ¿Formación? Estamos tratando con entradas, salidas y una caja. Aprenda cómo la entrada cambia la salida (ignorando los parámetros, por supuesto). Luego, abre la caja. Mira cómo funcionan las cosas. Cambia esto, eso sucede.

¿Dónde llegamos a donde lo que llamamos extracción “aérea” de algún programador es oro? Por cierto, los usuarios deben ser dueños del sistema (sí, FB, et al). Y, si queremos, deberíamos tener algo que decir, incluyendo bajar al código (oh, lo sé, las API están disponibles, eso no es lo mismo). Abierto abierto, …

—-

Postnote (10/06/2017): El viejo se pregunta por qué la ‘programación’ ha adquirido un brillo tan estimado como si fuera una posición honorable. Es solo un poco de violín. Es el análisis que impulsa el desarrollo del código lo que es clave. Esto ha sido destruido (sí, jóvenes, tenemos que volver al marco de ingeniería). ¿Algún asistente que está sacando código sin siquiera hablar conmigo (usuario final) sobre los requisitos? Mire el estado de perdición que ahora podemos observar.

Por cierto, soy 1G / 2G por diseño y escribiré desde ese punto de vista. No conozco tu código? Jaja

Ya sabes, jugar con el código (que ha llevado a la tontería del aprendizaje profundo como significativo) no lleva a comprender el problema que se está resolviendo. También, por lo que he estado leyendo, están ocurriendo todo tipo de eventos de giro de ruedas. ¿Qué? Por supuesto, estos son problemáticos. Ponemos la ‘etiqueta’ de vértigo en eso. Y, es una de las razones (el potencial para esto) tener un proceso y una visión integral sobre el toro.

Ahora, esa metáfora es la que hace que la gente piense. Esas bestias que surgen de una colección de código (no importa que tenga un codificador brillante) deben considerarse como cosas salvajes para ser domesticadas. Ahora, ¿podemos especificar, por diseño, cosas buenas? Algo. No en su totalidad. Nuestra experiencia con la web de mierda (y su nube turbia) habla más de lo que puedo decir.

Por cierto, tiene que ver con el problema del “marco” que es indecidible.

En 1995, este astrónomo predijo el mayor fracaso de Internet, pero ¿quién escuchó? Hace diez años, cuando olfateé el pegamento que vendía Facebook, decidí ser 1G / 2G con pocas revisiones a lo largo de los años para ver si debería estar asombrado (ja).

—-

Los programadores están resolviendo un problema en un dominio, no solo alimentando a la bestia. Podemos usar Clojure para demostrar el enfoque necesario para obtener más calidad.

Esto se puede explicar fácilmente … La ejecución requiere un poco de trabajo.

Piensa al revés . Cuando las personas me explican un problema, pienso en el resultado que desean y luego analizo el resultado final de regreso a la fuente. Por lo general, cuando terminan de explicarlo, tengo una buena imagen en mi mente y tengo algunas preguntas sólidas al respecto.

Términos absolutos. Sí / No – Verdadero / Falso – Siempre / Nunca … Esto se extiende a un si esto … entonces ese tipo de pensamiento. Hago muchas preguntas hasta que obtengo respuestas absolutas. Le dice a un programa qué hacer, no se adaptará si se le presentan variaciones.

Visualizar. Dibuja problemas. Le ayuda con los pasos hacia la solución. Dependiendo del tipo de programación del que esté hablando, esto puede ser crucial para su producto. Los programadores generalmente piensan en términos de tablas y mapeos y relaciones. Dibujarlos te ayuda a ver la imagen más grande.

Por supuesto, puedes comenzar a pensar como uno si te conviertes en uno, así que trata de enseñarte a ti mismo. ¡Diviértete con eso! Incluso un conocimiento básico de trabajo lo ayudará a pensar de manera más crítica.

Al aprender el proceso de traducir un lenguaje de programación que utiliza construcciones similares al inglés (if, for, while, etc.) en instrucciones que el microprocesador entiende. Aprenda el proceso de compilación (cómo un compilador convierte esas instrucciones en un programa ejecutable) y conceptos como la pila de funciones y el montón de memoria. Una vez que comprenda cómo la informática es una serie de capas que funcionan desde el hardware (unidades de disco, memoria, procesador, red, etc.) al sistema operativo, a las aplicaciones, a las arquitecturas de aplicaciones estándar (navegador web, servidor web, etc.) ) para el usuario: se sentirá seguro porque comprenderá la serie de interacciones entre las capas. Entonces también podrá crear sus propias aplicaciones para mejorar las empresas y las organizaciones para que sean más eficientes y efectivas. Solo preguntándole que ha comenzado su viaje … ¡Bienvenido a la comunidad de programadores!

Aquí hay algunos basados ​​en mi experiencia (errores):

  1. No asumas nada. Desafío, verifique lo que ya sabe de manera oportuna.
  2. Divida los problemas en trozos más pequeños y analice la relación / interacción entre ellos.
  3. Rompe la abstracción y observa los detalles tanto como puedas. Si bien realizar de manera abstracta es una gran cosa, ser ajeno a lo que se abstrae es desastroso.
  4. Aprende los fundamentos realmente muy bien. Ve detrás del más simple de los hechos.

Pensar como un programador implica las siguientes habilidades:

1. Resolución de problemas: poder encontrar una solución a un problema o un método para manejar una tarea presentada.

2. Ser capaz de dividir la solución o el método en una serie de pasos elementales.

3. Ser capaz de traducir esos pasos en la sintaxis y las construcciones del lenguaje de computadora que está utilizando.

4. Comprender las capacidades, fortalezas y debilidades del lenguaje y el hardware para que pueda traducir de manera eficiente.

5. Ser capaz de investigar y comprender el código de otro programador para poder usarlo o reutilizarlo y evitar reinventar constantemente la rueda.

Aprenda cómo funciona un sistema operativo , como procesos y subprocesos, sistema de control de acceso a archivos y archivos, cmd en Windows y terminal en Linux

Aprenda un lenguaje fácil de aprender como PHP , aprenda su gramática frecuente, como la estructura if / else, cómo funciona y cree un sitio web, cómo almacena y le muestra su blog.
otro es OOP, que significa Programación Orientada a Objetos, qué es clase y extensión (la subclase extiende una clase principal)

Intente comprender los conocimientos básicos de HTTP e Internet , como el estado HTTP (estado http 200 301 404 y etc., después de eso conocerá mejor su navegador web, es útil porque usa un navegador web todos los días), pruebe diferentes navegadores como Chrome / Firefox, aprende algunos complementos / Extensiones y obtendrás un navegador potente

Aprenda Linux porque es el mejor sistema operativo para la mayoría de los programadores (excluya a los que escriben C #). Estudie el principio KISS de Linux (Google)

Después de todo, lo que necesita aprender es cómo los programadores analizan las preguntas, cómo piensan y resuelven las preguntas.

Si bien estoy de acuerdo con todo lo que Michael Daconta dijo aquí, creo que a menos que seas un ingeniero de sistemas de bajo nivel, vas a escribir compiladores, no creo que necesites profundizar tanto. Siempre es bueno, sin duda, entender tanto como puedes, pero la informática es un campo tan enorme que las personas dedican toda su vida a un campo específico de la informática y aún no lo dominan todo.

Afortunadamente, la programación, los compiladores y las máquinas virtuales en general han progresado con el tiempo, por lo que probablemente debería centrarse más en patrones, desarrollo ágil, programación orientada a objetos (abstracción, polimorfismo, herencia, encapsulación), cómo construir un buen software en general e incluso diseño UML hasta cierto punto para pensar como un programador de computadoras.

Si decide profundizar, cómo funcionan los punteros de memoria y qué significa en términos de referencia frente a copia, cómo se almacenan y asignan los objetos en los programas en la memoria de la computadora, el montón, la pila y todo lo que Michael mencionó lo hará más capaz, pero dado que muchos de los nuevos lenguajes resumen esto y tienen recolecciones de basura (administración de memoria que se ocupa del montón / pila) en la mayoría de los casos, no tiene que preocuparse tanto por esto como programador en estos días.

Un buen programador de computadoras piensa analíticamente. Eso es algo que tus padres transmiten en tus genes. No se puede “aprender” más de lo que se puede aprender a ser más alto.

Puede intentar Teach Yourself Computer Science para aprender programación, pero no es una lectura fácil, son 1,000-2,000 horas de estudio, en sesiones cortas (quizás 2 sesiones de 2 horas cada una por día), por lo que tomará más que solo un hace mucho.

O estudie Algoritmos y Estructuras de datos y vea si aún puede entender lo que sucede en la página 15. Si no puede, probablemente no pueda aprender a programar. La mayoría de la gente no puede. Es por eso que el dicho: “El 95% del código está escrito por el 5% de los programadores”. El otro 95% de los “programadores” lo fingen hasta que lo sueltan.

La programación no es sentarse en un teclado y escribir, es un análisis. Dado que nuestros ancestros lejanos evolucionaron para luchar o huir, no para analizar (si analizaste esa cosa peluda con largas garras, no transmitiste esos “genes de análisis”, te convertiste en alimento para osos), la mayoría de las personas todavía pueden dar un tirón reacciones, pero no pueden analizar nada. Y si no puede hacer un análisis situacional, no puede programar, porque la programación es análisis situacional.

Entonces, si no puedes, no te sientas mal, estás en la gran mayoría. (El hecho de que “aspires” a ser programador no tiene nada que ver con eso. ¿”Aspirarías” a ser un jugador profesional de baloncesto si tuvieras 61 “de altura?)

Irónicamente, la mejor manera de mejorar su capacidad de pensamiento de programación es alejarse de la computadora.

Tome un problema, un lápiz y papel, y encuentre una silla cómoda lejos de la computadora. Entonces, solo piense en el problema. Comience con algo simple. Decida cuáles son las “entradas” (¿con qué comienza?) Y cuáles son las “salidas” (¿qué necesita producir o hacer?). Luego, intente escribir un conjunto de pasos lógicos que pueda seguir para obtener los resultados que necesita de los datos que tiene.

Eso es programación. Una vez que haya resuelto eso, transcribirlo al código será más fácil: debe conocer la sintaxis y las técnicas. Pero un lenguaje de programación no lo ayudará si no puede escribir los pasos que necesita.

No mires a la pantalla. Mire el papel en su lugar. entonces es de esperar que pueda pensarlo como pasos para resolver un problema, en lugar de un problema de programación .

Para empezar, puede leer Estructura e interpretación de programas de computadora. Esto es genial si quieres aprender a pensar como un buen programador, o más bien como un informático.

Comencé con el recurso gratuito “Cómo pensar como un científico de la computación” que le enseña a programar los fundamentos utilizando Python. Puede complementar esto con cursos introductorios gratuitos de Udacity, como el curso de introducción a la informática. Estos recursos le enseñarán los conceptos básicos y le brindarán problemas de programación que le permitirán pensar en nuevas formas de resolver problemas.

Simplemente comience a pensar ” Lógicamente ” y aprenda la sintaxis del lenguaje de programación que desea aprender, cree algunos proyectos y se convertirá en un Programador.


Espero que esto ayude 🙂

¡¡Gracias por preguntar!!