Capaz de leer el código pero luchando principalmente para escribirlo [cerrado]

22

Tuve mi primer examen de programación recientemente ... y bueno, prácticamente lo dejé caer. No fue genial en absoluto. Solo tengo la culpa de mí mismo, ya que fuera del tiempo de la universidad, prácticamente no hice nada.

Ahora tengo otro próximo cerca del horario de verano y no estoy permitiendo que esto vuelva a suceder. Durante un par de semanas he estado leyendo, leyendo y leyendo un poco más. Sigo repasando las cosas más antiguas que me perdí y las cosas más nuevas que estamos haciendo. Entonces, obviamente, puedo notar una gran diferencia en mi comprensión del idioma. Sin embargo, eso es todo. Puedo leer el código y ahora tengo una idea de lo que está sucediendo en el código ... pero cuando se trata de escribir el código yo mismo, no tengo ni idea. Es como si nunca supiera qué enfoque tomar y nunca puedo comprender completamente las preguntas.

He leído bastante (he estado haciendo alrededor de 5-6 horas durante el último mes) cada día ... Pero cuando abro mi IDE siempre me siento condenado, es realmente desmotivador. Especialmente porque tengo conocimiento de nodos, listas, listas de matrices, interfaces, etc., pero además de leerlos en una página sobre eso. Puedo señalar exactamente todo lo que está sucediendo en un programa, así que anotar un código de ejemplo me parece bien ... pero escribir mi propio código es otra historia ...

usuario3339333
fuente
8
Ayuda a tener una meta. Si, por ejemplo, desea hacer un juego, puede descargar un marco o biblioteca y seguir los tutoriales introductorios. Si hay algo menos complejo, puede comenzar buscando ejemplos de estos programas, deconstruirlos y modificarlos para adaptarlos a sus necesidades o intereses.
Kai Qing
10
Lee menos y programa más. Encuentra proyectos simples y hazlos. No te preocupes por hacerlo perfectamente, solo haz que hagan lo que se supone que deben hacer. Luego piense en cómo puede mejorar.
Philipp
1
Durante un par de semanas he estado leyendo, leyendo y leyendo un poco más. - La lectura es un comienzo, en realidad la codificación es mucho mejor. Intente escribir un programa en psuedocode en papel, luego traduzca a Java. Es un poco más fácil si ya sabes lo que tienes que hacer.
Andreas
1
Encontré que este es un artículo muy interesante al tratar de descubrir cómo codificar y enseñar a otros los conceptos básicos de la codificación: The Camel tiene dos jorobas . Algunas personas lo entienden de inmediato, otros nunca lo harán, pero la mayoría de nosotros podemos aprender. Si puede leer y comprender el código,
tendrá

Respuestas:

45

Aprende a escribir programas escribiendo programas.

Pero tienes que empezar de a poco, hombre.

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}  

A partir de ahí, comienza a construir ...

public class HelloWorld {
    static String test = "This is a test";

    public static void main(String[] args) {
        System.out.println(test);
    }
}

y entonces...

public class HelloClass {
    String test;

    public void setTest(String str)
    {
        test = str;
    }  

    public String getTest()
    {
        return test;
    }
}

public class HelloWorld {
    HelloClass myHelloInstance;

    public static void main(String[] args) {
        myHelloInstance = new HelloClass();
        myHelloInstance.SetTest("Hello World.")
        String myResult = myHelloInstance.getTest();
        System.out.println(myResult);
    }
}  

... y así. Una vez que comprenda los conceptos básicos de cómo funcionan los objetos, será mucho más fácil escribir programas más grandes.

Robert Harvey
fuente
8
Su segundo ejemplo no puede compilarse porque está accediendo a una variable no estática en un contexto estático.
Brandon
34
@ Brandon: entonces es un ejercicio de depuración agradable y temprano.
Bryan Boettcher
Así es como todos aprenden a codificar, supongo, o deberían aprender a codificar.
mrudult
1
Abraza tu Nike interior y "solo hazlo".
NotMe
15

Gran pregunta! Es importante darse cuenta de que tiene múltiples curvas de aprendizaje para escalar. Solo para que no pienses que solo estás aprendiendo un lenguaje de programación. Estás haciendo un poco más que eso.

Estás aprendiendo sobre ...

  1. Las herramientas que usas para escribir código. Su entorno de desarrollo, el editor, el depurador, su compilador. Hay manuales y archivos de ayuda para todas estas herramientas, échales un vistazo. Cuanto más conozca las herramientas, más fácil será crear código.
  2. La sintaxis del lenguaje de programación en estudio, desde su publicación, parece que está poniendo mucho énfasis aquí y ciertamente lo necesita.
  3. Habilidades de diseño de soluciones . Cómo armar un código útil y mantenible. Este es el músculo que necesitas para construir. Como otros carteles han señalado, aprendes haciendo.

Sospecho que es el punto tres donde estás luchando. Estás aprendiendo a decir cosas en código (sintaxis) pero realmente nos preguntas qué debería decir en código. ¿Hay una manera correcta y una manera incorrecta de hacer las cosas?

Te sugiero que asumas un desafío. Eche un vistazo a lo siguiente como ejercicio.

http://en.wikipedia.org/wiki/Eight_queens_puzzle

Ahora este es un desafío difícil. Tienes que colocar ocho reinas en un tablero de ajedrez para que cada una de las reinas esté a salvo la una de la otra.

Entonces, como aprendiz, esto puede ser un gran alcance, sin embargo, puede ver este problema y utilizarlo para aprender a escribir código.

Aquí hay una estrategia para probar ...

  1. Replantee el problema para que sea mucho más simple que el problema declarado a resolver . Olvídate de las ocho reinas. Concéntrate en solo uno. Aprenda a escribir el código para representar un tablero de ajedrez en la memoria, coloque una sola reina en ese tablero y luego muéstresela al usuario en la pantalla con solo texto.

  2. Una vez que hayas hecho una puñalada en el Paso 1. Coloca dos reinas para que ambas estén seguras.

  3. Finalmente, intente colocar más de 2 reinas en el tablero para que estén a salvo.

Los pasos anteriores son un giro en una estrategia de diseño llamada Refinamiento gradual. Es un poco de la vieja escuela en términos de diseño, pero te llevará de una pantalla en blanco a algún código interesante en muy poco tiempo.

Existen otras estrategias de diseño e implementación: diseño guiado por pruebas, diseño orientado a objetos y patrones de diseño, por nombrar algunos.

Con el tiempo agregará estas estrategias al arsenal y las usará cuando sea necesario. Cuantas más estrategias de diseño estudies y practiques, más fácil será.

Que la fuente te acompañe.

Robar
fuente
¿En qué se diferencia OO Design de Design Patterns? ¿O estás poniendo los dos juntos?
Pierre Arlaud
1
El refinamiento gradual y la OO tampoco son mutuamente excluyentes, pero probablemente lo sepas. Que la fuente te acompañe. +1
Gusdor
15

Un prólogo rápido

Aprender haciendo: conocimiento vs know-how

Hay una gran diferencia entre conocimiento y know-how. Es un error común que los nuevos alumnos piensen que debido a que pueden "entender" un programa mientras lo leen, realmente entienden el razonamiento para que el programa se escriba de la manera en que está.

Y la única forma de llegar a esa segunda parte es practicando. Siéntate, abre un editor de texto, una línea de comando y ponte manos a la obra.

Programación en lo pequeño

Es probable (y esperado) que en esta etapa su capacidad de comprender cómo interactúan entre sí varios componentes de software complejos sea limitada. Y en realidad es algo bueno, ya que te obliga a comenzar desde lo básico. No salte el arma y muévase al ritmo correcto: comience con ejercicios pequeños para tareas pequeñas.

Para ser honesto, nunca he estado convencido de que comenzar a aprender programación con Java es el camino a seguir (solía enseñar programación para vivir en la universidad, y todavía hago clases particulares ocasionalmente). Es en sí mismo demasiado complejo para comenzar, y la mayoría de los libros de Java parecerán bastante desalentadores. Sin embargo, seguramente se puede hacer (al menos para algunas áreas de ese conocimiento global que esperamos de los programadores), siempre y cuando se limite a aprender paso a paso.

Libros

Como está configurado en Java, y si necesita un libro decente de Java, le recomiendo:

  • Pensando en Java . Está bien, aunque ahora un poco anticuado.
  • El tutorial de Java . No es exactamente el mejor compañero del alumno, pero es una gran referencia para tener a mano, ya que cubre todos los conceptos básicos y proporciona ejemplos. El Aprendizaje de Java Language Trail probablemente debería estar en su lista de lectura, aunque creo que puede ser desalentador para principiantes completos, ya que presenta conceptos que pueden ser difíciles de entender al principio.
  • Effective Java . No es un gran libro para aprender, pero también es una referencia increíble que deberías tener a mano para más adelante. No para leer de una vez, sino en trozos pequeños.

Solo menciono esto, ya que no sé lo que usas en clase. Hay muchos otros libros. Algunos son buenos. Algunos paralizarán a los estudiantes durante años.


Su proceso de estudio

El flujo de trabajo básico

A partir de ahora, te aconsejo que sigas este proceso de 2 pasos para todos los ejercicios y ejemplos de código que has visto en clase:

  1. Lee y estudia
    1. lee los ejercicios
    2. asegúrate de entenderlos
  2. código
    1. cierra el libro
    2. sentarse frente a una computadora con ese editor de código y línea de comando
    3. intente reescribir el programa usted mismo

En caso de fallo

Si falla y siente que necesita echar un vistazo al libro, es probable que su fracaso sea:

  • (muy probablemente) que realmente no entendiste la solución,
  • (menos probable) que haya olvidado cómo se ve una parte particular de la solución: sintaxis, uso de API, ...

Es probable que la primera causa sea la que enfrenta con más frecuencia. El segundo es anecdótico. Ambos se abordan mediante la práctica recurrente.

Cada vez que no pueda implementar uno de estos primeros ejemplos, mire el libro nuevamente y luego vuelva a cerrarlo. No codifique mientras mira el libro. Incluso te aconsejo que elimines toda tu solución y comiences de nuevo. La repetición es una parte molesta pero importante del proceso de aprendizaje.

No te lo tomes a la ligera. Cada vez que sientas la necesidad de decirte "sí, está bien, lo " o "estoy 90% allí, es casi tan bueno como lo he hecho" y quieres pasar a otra sección, luchar contra esa necesidad y comenzar de nuevo. Es muy difícil tener la honestidad de admitir que no entendiste completamente un concepto.

Nota al margen: considero que es un gran mal servicio que la mayoría de los programas escolares ahora intenten "iniciar" los cursos de programación simplificando demasiado las cosas y proporcionando herramientas demasiado avanzadas para los estudiantes: el objetivo no es hacer que su vida sea miserable o que usted también aprenda de memoria cosas que más adelante en su carrera serán automatizadas por sus herramientas y que a veces apenas recordará. Es para enseñarte todas las partes que flotan.

En caso de éxito: ¡vaya más allá!

Si logra implementar su ejercicio, no necesariamente salte directamente al siguiente. Intenta ver qué puedes hacer para mejorar eso. ¿Se puede cambiar la salida que se solicitó? Añadir una pequeña característica? ¿Una opción? Intenta hacerlo, ya que ahora estás en esa zona divertida donde pasaste la dificultad principal, y estos pequeños requisitos autoimpuestos son más propensos a mantener tu ánimo un poco.

Sin embargo, no vaya demasiado lejos: no pasa de imprimir el alfabeto y revertirlo para que aparezca de repente en una diagonal en la pantalla con un degradado de colores. Da pequeños pasos. El aprendizaje es un proceso largo e iterativo, y debe abordar los problemas con niveles crecientes de dificultad (por ejemplo, vea cómo pienso generalmente en explicar la recursividad ).


Es solo aprendizaje: una comparación

Su problema en realidad no está relacionado con la programación en absoluto. Es el mismo problema que miles de personas encuentran cuando intentan aprender matemáticas.

Si les da un problema, no ven cómo trabajar para llegar a la solución. Sin embargo, si escribe la solución para ellos, la mayoría lo entenderá y pensará "¡maldición, eso fue muy simple!". Sin embargo, les dará un problema similar con diferentes medidas e hipótesis y no podrán resolverlo: no entendieron la lógica detrás de esto, y necesitan práctica para poder hacerlo ellos mismos.

Tenga en cuenta que este es un problema común con las matemáticas, pero en mi opinión, lo ve en toneladas de otros campos donde se requiere cierta lógica: solfeo de aprendizaje, gramática del lenguaje, física, etc. Y no se trata de una habilidad "natural". para entender estas cosas: todo se reduce a la práctica (ya sea en esa área o en otras que llevan al individuo a comprender los conceptos en este campo más fácilmente).

No hay razón para que no puedas aprender a escribir código. Solo tienes que seguir intentándolo hasta llegar a ese "¡ah AH!" / Eureka momento. Luego pase al siguiente problema, más difícil.


Estos también pueden ayudar (más adelante):

haylem
fuente
6

Sé que esta no es la respuesta que querrás escuchar, pero: ¡escribe más código!

Más específicamente diseccione el código que usted entiende. A menudo me ayuda a "traducirlo" al inglés regular (ya que soy un principiante relativo).

No tenga miedo de hacer una lluvia de ideas sobre su idea de escribir primero un fragmento de código (es decir, "Quiero declarar una variable aquí, iterar a través de este segmento, etc.") y ENTONCES buscar pieza por pieza cómo hacer estos diversos segmentos.

Recuerde que la codificación es menos como un ejercicio de memorización y como encontrar una manera de construir algo a partir de bloques de construcción. Al igual que aprender un idioma extranjero real, la comprensión es lo primero, esta es una buena señal de que está en camino.

Solo tenga fe en que cuanto más escriba y lea el código, más sentido tendrá.

Xelad1
fuente
5

Como otros han dicho, este es un caso en el que debes practicar, practicar, practicar.

Escriba un montón de pequeños programas que resuelvan un solo problema.

A veces, la parte más difícil es crear algo que valga la pena programar. Si puede, trate de trabajar en un tema con el que cree que está luchando, como clases, herencia, etc. Algunas ideas fuera de mi cabeza:

  • Genere 1000 números aleatorios e insértelos en una colección (cola, lista, etc.). Ordene la colección sin usar ningún método proporcionado que ordene la colección por usted.
  • Lista 10 personas que conoces. Primero ordene sus nombres en función de sus nombres y muéstrelos. Luego, clasifique sus nombres en función de sus apellidos y muéstrelos. Luego, intente ordenarlos según el patrón "último, primero" (es decir, Smith, Andrew sería antes que Smith, Jessica).
  • Encuentra todos los números primos entre 1 y 100.
  • (Herencia) Haga una clase de polígono y dele la función GetArea. Ahora, haga que las clases Triángulo y Rectángulo hereden de Polígono, y asegúrese de que implementen GetArea. Siga haciendo esto para polígonos de orden superior (pentágono, hexágono, etc.).
  • Intenta elegir cosas del código de intercambio de pila de golf *

* El propósito del código golf es realizar la tarea proporcionada utilizando la menor cantidad de caracteres, bytes o alguna otra métrica indicada en la pregunta. Si lee algunas de las respuestas, apreciará rápidamente las formas inteligentes en que las personas resuelven estos problemas. ¡No se concentre en resolver el problema en la menor cantidad de bytes! Las personas que publican para codificar golf son programadores muy experimentados. Pero, algunas de las preguntas ofrecen tareas fáciles en sí mismas.

Algunos ejemplos divertidos de códigos de golf:

  • Poderes de 4 . No se preocupe por resolver con una expresión regular (es bastante difícil, como puede ver en las respuestas). Pero, en cambio, resuelva la pregunta "Dada una cadena s, ¿es su longitud divisible por una potencia de 4?" También puedes hacer ramificaciones: ¿La longitud de una cuerda es divisible por 4? ¿Es divisible por 6? ¿Es excelente (esto es difícil para cuerdas largas, así que pruébalo si te vuelves valiente)?
  • Subcadenas . Dada una cadena s, genera todas las subcadenas posibles.
  • Conteo de palabras . Este puede ser complicado dependiendo de qué tan lejos esté en sus estudios de programación. Hay algunas cosas que lo hacen muy fácil (como las colecciones asociativas), pero si no las conoce, puede ser difícil.
  • Si el título te suena críptico, simplemente ignora la pregunta. Como dije, el código de golf es para programadores experimentados. Simplemente concéntrese en los problemas simples e intente encontrar una respuesta simple.

Estructura básica para resolver un problema:

Muchos de estos le dan una buena idea de cómo debería ser una función. Dado X, hacer Y, y el resultado debería ser Z:

void foo()
{
    // Set up X here

    // Do Y here

    // Display Z here
}

Para aprender los conceptos básicos y familiarizarse con un idioma, la plantilla anterior es suficiente. Una plantilla más orientada a objetos sería:

Z foo(input X)
{
    Z result;
    // Do Y to X
    return result;
}

Si ayuda, escríbalo también en papel. Hable usted mismo a través del proceso de cómo usted , como ser humano, resolvería este problema. Ejemplo: dados los números i, j y k, muéstrelos en orden descendente. Como persona, es fácil de resolver. La parte difícil es traducir sus ideas en instrucciones línea por línea para que una computadora pueda resolverlo.

Intenta proponer tus propias ideas también. Puede ser difícil, pero incluso los programas más simples pueden enseñarte algo que no sabías. El objetivo es profundizar en lo básico, hasta que se conviertan en una segunda naturaleza.

Shaz
fuente
4

No llegará a ninguna parte simplemente leyendo el código; Necesitas estar escribiendo código. Solo escribe el código. No te preocupes si el código que escribes es basura; todos han escrito código basura. Algunas personas viven de ello. Nadie comienza a escribir un buen código y creo que, mientras aprendemos, es casi necesario escribir un código malo porque solo entonces la diferencia entre el código bueno y el malo se vuelve realmente evidente.

Es difícil apreciar la diferencia entre el código bueno y el malo al leer dos bloques de código que hacen lo mismo, pero cuando has escrito un guión y obtienes a alguien con conocimiento para revisarlo y proporcionar comentarios, la diferencia a menudo se vuelve mucho más evidente porque puedes aplicarlo directamente a lo que sabes.

La programación no es algo que se pueda aprender memorizando de memoria; No es como sus tablas de tiempos o fechas en la historia. La programación es una habilidad práctica que requiere práctica constante para mantenerse alerta. Aprender a programar sin escribir código es como aprender a nadar leyendo un libro.

Roy
fuente
1

Esta pregunta ya tiene algunas respuestas realmente buenas, pero hay algunas ideas que aún no he visto.

Aprender un lenguaje de programación es muy parecido a aprender un lenguaje 'real': siempre es mucho más fácil leer que escribir, ya sea una sola oración, un artículo científico o un libro. Al leer, se puede descubrir mucho solo desde el contexto, entendiendo el texto o el código a medida que lo lee. Cuando vea una palabra que no conoce, quizás conozca otra palabra con la misma raíz; cuando ve un método, el nombre del método le da una buena idea de lo que hace. Al escribir, debe recordar no solo la sintaxis, sino también las palabras reales que debe usar. Y es lo mismo para la programación.

Como otros han dicho, no se puede aprender a escribir programas simplemente leyendo programas.

Empieza pequeño. Busque un tutorial de Java y haga todas las unidades, una tras otra. Y cuando tenga la confianza suficiente, elija un pequeño proyecto para probar sus habilidades, tal vez algún juego simple que conozca bien y que no requiera demasiada interacción con la GUI. Cuando haya decidido, no solo abra su Eclipse y mire fijamente la 'página en blanco'. Crea un guión gráfico. No tiene que dibujar diagramas UML elaborados, solo piense en cómo se pueden resolver ciertos aspectos del programa, cómo se desarrolla la historia o su argumento, por así decirlo. Y cuando escriba el código, comience con un borrador. Usualmente escribo muchos comentarios, describiendo lo que debe hacer el programa, en qué orden, y luego empiezo a completar el código real del programa.

tobias_k
fuente
1

Como dicen otros, solo necesita practicar escribir código. Para que eso sea satisfactorio, debe desafiarse a sí mismo con la resolución de algún tipo de problema, ya sea imprimir mensajes predefinidos, hacer una calculadora interactiva simple o resolver alguna tarea específica.

Si le falta inspiración, el Proyecto Euler tiene una gran cantidad de ejercicios de matemática / programación de dificultad creciente. Le dan objetivos claros y desafiantes para lograr, y deberían ayudarlo a sentirse más cómodo diseñando programas.

Emil Lundberg
fuente
1

Solo pensé que hablaría sobre este tema porque realmente golpea cerca de casa.

Solo necesita comenzar a codificar. No me malinterpretes, la lectura es excelente, pero lo que realmente te da que el conocimiento de codificación de trabajo es en realidad construir algo. Aprendí más de una sola colocación de verano que el año anterior al leer sobre ella.

También debo agregar que no deberías comenzar a codificar a ciegas . Haz un proyecto para ti. Necesitas algún tipo de dirección para ponerte y saber lo que quieres hacer. Te sorprenderá ver cuánto aprenderás rápidamente. Si solo abre un IDE y comienza a hacer ejemplos sencillos de hello world, esa sensación de desmotivación se infiltrará rápidamente en usted. Encuentra algo con un poco de profundidad y antes de que te des cuenta, estarás expandiéndolo.

SeanWM
fuente
esto parece agregar algo sustancial sobre lo que ya se publicó en respuestas anteriores
mosquito
@gnat Asumo que quisiste decir "no" y esa es tu opinión. Sin embargo, pasé exactamente por la misma situación que él está pasando y estoy compartiendo lo que me ayudó. Si olvidó la introducción a su pregunta aquí es: "¿Podrían dar algún consejo ..."
SeanWM
@SeanWM: los programadores son un poco diferentes de lo que estás acostumbrado con SO. Si algo ya está respondido bien, reiterar los mismos puntos en su propia respuesta no es tan constructivo. Y eso independientemente de si el OP está pidiendo consejos u opiniones. Simplemente no hace buenas preguntas y respuestas. Es mejor votar las respuestas existentes y posiblemente dejar un comentario constructivo que indique una faceta que se perdió.
+1, esta respuesta agrega algo importante a la mezcla. Esa es la importancia de tener un proyecto real para trabajar, no solo ejemplos y pequeños programas de prueba.
GrandmasterB