¿Cómo codificas algo cuando no tienes idea de cómo funciona realmente? [cerrado]

14

Recientemente aprendí C y quiero comenzar un proyecto para solidificar mi conocimiento. Me decidí a hacer un editor de texto muy simple, algo así como vim. El problema al que me enfrento es que realmente no tengo idea de cómo funciona un editor de texto, y no sé qué buscar en Google para obtener información al respecto.

Buscar en Google lo llevó al repositorio de vim en GitHub, lo cual es inútil para mí porque la base de código es enorme y el código me confunde. También encontré tutoriales para hacer un editor de texto en C que funciona como vim.

Aunque pensé en seguir los tutoriales, se siente como hacer trampa. ¿Cómo descubrieron los desarrolladores de vim cómo codificar vim sin tutoriales específicos? ¿O comenzaron con editores de texto más simples? ¿Cómo resolvieron eso solo por el conocimiento de idiomas y su documentación?

¿Qué es exactamente lo que necesito para comenzar a escribir este editor de texto sin seguir directamente un tutorial? Otro ejemplo en el que me gusta pensar es: ¿cómo Dennis Ritchie y Ken Thompson codificaron Unix? Tengo una idea de cómo funciona el sistema operativo, pero no tengo idea de cómo ponerlo en el código. ¿Qué es lo que me estoy perdiendo? ¿Cómo transfiero este conocimiento del idioma al uso real y práctico?

Infieles
fuente
14
Te estás comparando con proyectos con largas historias y personas excepcionales. Unix se originó en un grupo de investigación con muchos años de experiencia en programación a nivel de sistema, y ​​se benefició de la experiencia con el sistema operativo Multics más complejo. Vim se basó en vi que se basó en ed. Estos programas no aparecieron repentinamente, fueron una evolución, construida por cientos de personas. Así que no se sienta frustrado cuando le resulte difícil saltarse toda esa historia. Nadie puede. En su lugar, intente hacer proyectos que estén al borde de su comprensión, solo a su alcance, pero aún desafiantes.
amon
8
¿Acabas de aprender a tocar algunas melodías en el xilófono y ahora quieres tocar en una gran orquesta internacional? Vamos, esperas demasiado. La programación es como tocar un instrumento: comienzas con melodías pequeñas y simples y después de varios años de práctica aprendes a tocar una sinfonía.
Doc Brown
3
Convenido. Tómelo como una oportunidad para aprender algo que muchos principiantes aprenden de la manera difícil. Comience poco . Y lea el código de vim también. Puedes aprender mucho leyendo el código existente.
Laiv
17
Su problema fundamental es la falta de claridad en su pensamiento. Dices "un pequeño editor de texto simple como vim", y luego lo sigues inmediatamente al notar que su base de código es enorme y confusa. Esto debería ser una señal fuerte de que nada que se parezca mucho a vim es simple . Incluso los programadores experimentados caen en la trampa mental en la que has caído. Las cosas que aún no entiendes no son simples . Ellos son complicadas . La programación de computadoras está transformando la lógica mental en realidad; Comience por pensar más claramente acerca de la programación.
Eric Lippert
44
Además, deja de preocuparte por "hacer trampa". Esto no es un juego. Tienes metas, y son buenas metas. Haz lo que necesites hacer para lograr esos objetivos . ¿Crees que los programadores informáticos profesionales no miran la fuente cuando quieren aprender cómo funciona algo? Aprender a aprender de la fuente que no escribiste es una de las habilidades de programación más importantes, así que comienza a practicarlo.
Eric Lippert

Respuestas:

17

Si este es su primer proyecto de programación, incluso un simple editor de texto puede ser demasiado complicado. Algo como vim o un sistema operativo está completamente fuera de discusión.

Abordando el problema

Sin embargo, en general, la forma de comenzar es más o menos similar para la mayoría de los proyectos:

  • Reúnes tus requisitos. ¿Qué hará exactamente el software?
  • Comienza con muy pocos requisitos y luego agrega funcionalidad poco a poco.
  • Descompone los problemas planteados por sus requisitos actuales en subproblemas.
  • Sigue descomponiendo sus subproblemas hasta que tenga algo que sepa cómo implementar.

Ejemplo

Tomemos el ejemplo del editor de texto.

  • Desea mostrar una parte de un archivo de texto en la pantalla, insertar y eliminar caracteres y guardar la versión actual.

  • Comience simplemente leyendo un archivo y mostrando su contenido.

  • Identificará (entre otros) los siguientes subproblemas:

    • ¿Cómo sé el nombre del archivo para mostrar?
    • Dado un nombre de archivo, ¿cómo obtengo el contenido del archivo?
    • Dado el contenido de un archivo, ¿cómo los visualizo?

Una vez que llegue a un punto donde se complete su requisito (cargar el archivo y mostrarlo), puede comenzar a considerar cómo mostrar solo una parte que se ajuste a la pantalla, navegar en su archivo, etc.

El siguiente paso

Con el tiempo, a medida que se enfrente a problemas cada vez más complejos, se dará cuenta de que cada vez es más difícil encontrar formas adecuadas de descomponer sus problemas. También notará que cambiar el código puede volverse tedioso con el tiempo.

En ese momento, es hora de aprender algunos conceptos básicos de arquitectura y diseño.

te doblo
fuente
Hola hombre, gracias por el consejo! Creo que adoptaré este enfoque. Soy un poco terco cuando se trata de cambiar de opinión, pero por lo que has sugerido, creo que intentaré ver cómo hacer un visor de archivos. ¿Quizás también agregar una forma de mostrar los metadatos del archivo de alguna manera? Probablemente pueda resolver eso yo mismo. ¡Muchas gracias!
Faithlesss
2
Para agregar a esto, "cómo los visualizo" probablemente se puede desglosar aún más para escribir un carácter específico en una posición específica en la pantalla (si estamos hablando de un editor de línea de comandos), que debería ser algo que uno pueda Encuentre fácilmente una respuesta a en línea.
Dukeling
2
"incluso un simple editor de texto puede ser demasiado complicado" los editores de texto son sorprendentemente complicados. Imagina editar un archivo de 20 MB. Lo suficientemente grande como para requerir el almacenamiento en búfer, pero no lo suficientemente grande como para gravar a una computadora moderna. Debe poder desplazarse por él, insertar y eliminar texto, hacer que el texto se reorganice en tiempo real, el marcador de la barra de desplazamiento se actualiza en tiempo real a medida que cambia el modelo detrás de él. Si tiene algún tipo de formato, esto se vuelve aún más complicado.
15

Usted no

Si ni siquiera tiene una vaga idea de cómo hacer algo, es una señal de que está más allá de sus habilidades actuales. Porque si no tienes idea de cómo comenzar, ciertamente no vas a tener ninguna idea cuando se trata de la parte más difícil de la aplicación.

Telastyn
fuente
¿Cuál sería un buen proyecto para comenzar entonces? Ya hice mi propio juego del ahorcado (en la terminal), así como un juego de tres en raya. Simplemente no veo una manera de continuar, así que pensé que un editor de texto sería una buena idea.
Faithlesss
3
@faithlesss: algo que lee y escribe archivos parece un paso intermedio básico.
Telastyn
99
Un archivo espectador podría ser un buen proyecto, entonces, por ejemplo, un buscapersonas como el less, moreo viewlos programas. Comparten algunos de los aspectos de los editores, sin la complejidad de los buffers de edición mutables.
amon
@Telastyn te tengo. Voy a ver cómo hacer un visor de archivos, probablemente uno simple que pueda leer formatos de texto básicos, y luego pasar a descubrir cómo leer algo como, ¿tal vez un archivo json o csv? No debería ser tan difícil de analizar, solo tengo que mirar realmente la documentación de string.h, supongo. ¡Gracias por el consejo!
Faithlesss
2
@Faithlesss También eche un vistazo a las características de un editor de líneas , el predecesor de los programas de edición de texto
Bergi
2

Es necesario decidir cómo usted quiere que su editor de texto para el trabajo.

Esta es una de las experiencias más agravantes y gratificantes de desarrollar sus propios proyectos de principio a fin. Nadie te está enviando requisitos para construir. Necesita desarrollar sus propios requisitos.

Esto significa que tendrá que hacer una gran cantidad de trabajo de diseño antes de escribir su primera línea de código. Tendrá que decidir cómo se ve la interfaz. Tendrá que decidir qué funcionalidad incluir. Ambas preguntas anteriores se guiarán por lo que se siente capaz de hacer. Si piensa en la situación "ideal" (cómo le gustaría que funcionara la interfaz), pero no se siente capaz de codificarla, entonces necesita comenzar a buscar enfoques alternativos: ¿Cómo podría hacer que esto funcione?Eso ayuda a enfocarte en los enfoques de codificación sobre los que quizás quieras aprender más.

Como han dicho otros, intentar copiar vim puede no ser el mejor enfoque, ya que es una base de código grande y complicada. También te estás negando a ti mismo el trabajo de diseño que, en mi humilde opinión, ayuda a completar tu desarrollo como desarrollador.

Esto no significa que necesitará tener toda la aplicación diseñada de principio a fin antes de escribir su primera línea de código. Está bien que los requisitos cambien con el tiempo a medida que aprende más. Está bien agregar nuevas características en las que no piense hasta que esté probando / usando su propia aplicación y piense: "¿No sería bueno si ..."? Está bien comenzar de manera simple.

Randall Stewart
fuente
1

Escribir un editor de texto completo desde cero sin experiencia en programación es una tontería: se desanimará y lo abandonará antes de aprender mucho.

Se me ocurren varias alternativas:

  • Estudie el código de algún producto con el que esté familiarizado. Si eres competente vim, mira eso e intenta entender algo pequeño y aislado, como cómo representa los datos o busca un solo carácter (el fcomando).
  • Estudie el código de un programa muy simple y avance desde allí: catcomando, wcluego, grepluego, sedpor ejemplo.
  • Intente escribir un programa que solo haga una función única del editor. Tal vez elimine el segundo carácter en cada línea de un archivo (sin reescribirlo), o muestre solo las líneas 50 a 70 de un archivo.
wallyk
fuente
1
Sin saber un poco acerca de los patrones comunes, creo que comprender incluso una pequeña parte de un gran proyecto como vim va a ser inútil. Sin embargo, mirar proyectos de código abierto muy pequeños es una buena idea. Agregaría que intentar hacer un cambio específico en dicho programa sería una excelente manera de aprender. Ventaja: aprenderá algunos patrones utilizados en programas del mundo real. Desventaja: también podría aprender un antipatrón.
doubleYou