¿Es una habilidad realmente necesaria para programar sin documentación API? [cerrado]

22

Apenas pasé mi examen de programación Java hoy. Tuve que responder algunas preguntas generales sobre el enhebrado que hice bien y escribir un pequeño programa de subprocesos que era peor. Tuve que conectar mi computadora portátil a la pantalla del proyector y escribir el programa de inmediato. Mi primer intento fue usar clases anónimas pero olvidé la sintaxis exacta. Tal vez debido a un poco de emoción o tal vez porque las últimas dos semanas estuve codificando principalmente en php. Luego pregunté si está permitido usar la documentación de la API. La respuesta fue "NO". Así que decidí dar la vuelta e implementé Runnable. El programa estaba haciendo lo que se solicitó al final. Por supuesto, los examinadores notaron mi primer fracaso y eso afectó mucho mi puntaje. Me sorprendió que no se le permitiera usar la documentación de la API.

Entonces, mi pregunta es: ¿es realmente importante poder codificar sin problemas sin la documentación de la API? ¿Debo desarrollar esta habilidad? ¿Es realmente importante en el mundo real y en el entorno laboral? Mientras estaba en cursos de programación, me concentré en aprender patrones, desarrollar habilidades para escribir buenas aplicaciones de diseño, habilidades para usar API y encontrar la información necesaria rápidamente. No estaba tratando de aprender a programar sin la documentación de la API. ¿Es imprescindible durante las entrevistas de trabajo (codificación sin documentación API)?

bancer
fuente
2
Creo que está preguntando sobre documentación , específicamente referencias de API.
3
@bancer: no puede utilizar las clases nativas de Java no tiene sentido. Parece que no estabas preparado para el examen.
Ramhound
27
En el mundo real, siempre tendrá acceso a la documentación. Tengo una memoria terrible e intento concentrarme en la lógica general de mi aplicación y evitar llenar mi mente de memorizaciones inútiles de cosas que se pueden buscar fácilmente. Desafortunadamente, el mundo académico (y el mundo de las certificaciones) es algo diferente y a menudo se hace hincapié en la memorización sin sentido. Mis estudios universitarios fueron principalmente en matemáticas y física, pero recuerdo tener que memorizar muchas fórmulas, etc. Qué pérdida de tiempo.
Antonio2011a
11
@ Antonio2011a - Conocer la API del lenguaje que está utilizando NO es una "memorización sin sentido". Cuanto mejor conozca la API, mejor podrá programar, porque elegirá las clases y los métodos adecuados para su solución. No puedes elegirlos si no sabes que existen. Por supuesto, nadie conoce toda la API de Java; es muy grande. Pero siempre es bueno saber tanto como puedas.
Dawood dice que reinstalar a Mónica el
99
@DavidWallace Quizás no estaba claro. ¡Por supuesto que no estoy diciendo que no necesites estar familiarizado con la API! ¡Solo que no necesita memorizar los nombres exactos de las clases, los métodos, el orden de los parámetros y otros detalles de entumecimiento mental! Todo lo que realmente necesita saber es que existe y cómo es útil, luego puede buscar los detalles mientras codifica. Como dije antes, mi memoria es terrible y, sinceramente, podría haber usado una clase hace una hora, y si me dieras un papel en blanco, no podría recordar los detalles exactos.
Antonio2011a

Respuestas:

39

En Real Life ™, calificaría esta habilidad como "agradable de tener", pero no es obligatorio. Sin embargo, en un entorno universitario es diferente.

La capacidad de codificar sin documentación puede usarse como una indicación indirecta de la familiaridad del alumno con el tema. En cierto sentido, verte codificar algo sin tocar la documentación le dice al profesor que has practicado el uso de la API antes, haciendo tu tarea y otras tareas, o tal vez incluso programando por diversión por tu cuenta. Una persona inteligente con una comprensión superficial de la API en cuestión debería ser capaz dedescubra casi cualquier API de Java por sí sola mirando la documentación. Esto no es una coincidencia: a menudo se espera que los programadores aprendan en el trabajo, y la documentación de API para sistemas de programación populares, incluido Java, está estructurada para ayudar a los programadores a aprender rápidamente. La documentación a menudo proporciona ejemplos cortos e independientes, que ilustran el concepto de manera breve y concisa.

Esto funciona directamente en contra del objetivo del profesor de medir su conocimiento del tema (en lugar de medir qué tan inteligente es usted). Por lo tanto, no es irracional pedirle el código sin consultar la documentación.

NOTA: Edité esta respuesta en respuesta a una edición de la pregunta.

dasblinkenlight
fuente
2
Según mi lectura, los examinadores observaban su capacidad para memorizar la documentación de la API. Sabía qué hacer, pero no recordaba la sintaxis.
Paul
@ Paul, leí las ediciones y cambié mi respuesta. Pensé que el OP preguntaba algo completamente diferente. ¡Gracias!
dasblinkenlight
2
+1 para identificar el problema real aquí. Si se tratara de una entrevista de trabajo, el entrevistador estaría más interesado en cómo resolver un problema, y ​​probablemente solo se le permita escribir su mejor aproximación de la sintaxis en la pizarra. Cuando ha pasado los últimos tres meses aprendiendo material específico, y está siendo evaluado en ese material específico, es razonable no tener una política de "Internet abierto".
StriplingWarrior
@Paul: tienes razón
bancer
21

Hubo una vez un tipo que tenía un pequeño error en su código, por lo que lo llevó a StackOverflow y pidió ayuda. StackOverflow: Java (genera números sin repeticiones) . Miré su código y le señalé que su HashSet se estaba llenando perpetuamente de valores, pero nunca se borró. Entonces, él me preguntó: "¿cómo lo aclaras?" Tengo que admitir que no estoy particularmente orgulloso de la respuesta que di.

Necesitas absolutamente saber las cosas básicas que usas todos los días. Necesitas conocerlos a todos, y debes conocerlos bien. Pero solo lo básico.

Para todo lo demás, lo importante es saber que hay algo por ahí que hace lo que quieres. Precisamente qué clase necesita usar, exactamente a qué método debe llamar y exactamente qué parámetros debe pasar, es algo que no necesita para mantener ocupadas las preciosas neuronas de su cerebro. Para eso está la documentación, y por eso se inventaron IDEs con autocompletar. Y si el empujón llega a su fin, siempre hay StackOverflow y la mayor interacción existente.

Pedirle a los programadores que sepan las API de memoria es como pedirles a los abogados que sepan de memoria el código legal y todos los precedentes. No tiene sentido. Un ejercicio de futilidad.

Mike Nakis
fuente
+1: Es increíblemente difícil aprender toda la API de una biblioteca grande como la de Java, simplemente debido a su gran tamaño. Sin embargo, es más fácil saber qué capacidades generales proporcionan los paquetes (por ejemplo, javax.imageio proporciona un manejo de imágenes avanzado, no es que lo haya usado alguna vez) y se deben aprender algunas funciones básicas . En particular, java.lang y java.util se utilizarán en prácticamente todos los programas Java.
Donal Fellows
9

¿Es una habilidad realmente necesaria para programar sin documentación API?

No diría que es obligatorio pero es

habilidad muy deseable

imNSho.

Pasé los últimos meses codificando en estrecha colaboración con el tipo que conoce la API notablemente mejor que yo. Es mucho más productivo, simplemente porque puede omitir las verificaciones de documentación de API que me distraen .


Aquí estoy hablando de fluidez. Sobre ser no solo capaz de algo sino fluido.

¿Sabes lo que es ser fluido? Es cuando para alguien que te mira parece que codificas mientras escribes ...

  • ... Como si el código correcto simplemente fluyera de sus dedos a la pantalla. Como si no revisara los documentos API, tutoriales y manuales. En realidad, se hace comprobar a todos, pero que es invisible porque es todo en su cabeza. Tienes todo el conocimiento que necesitas allí mismo en tu cerebro: cargado, cargado y listo para usar.

... Eso es conocimiento fluido. Es cuando te toma un minuto hacer lo que le toma a un novato una hora. Vale la pena el esfuerzo, de verdad. Huele a victoria.

Si domina la fluidez en alguna API y memoriza adecuadamente cómo se siente, esta memoria lo guiará aún más en cómo ser más productivo trabajando con cualquier otra API.

mosquito
fuente
No creo que su pregunta sea si eventualmente deberías conocer o no la documentación, sino si debes memorizar o no la documentación como para los exámenes.
Rei Miyasaka
@ReiMiyasaka, bien, si se saltea los quejidos verbales, puede notar esto: "Entonces, mi pregunta es: ¿Es realmente importante poder codificar sin problemas sin la documentación de la API? ¿Debería desarrollar esta habilidad? ¿Es realmente importante en el mundo real? y en el ambiente de trabajo? . Me concentré en esta parte de la pregunta porque, como ven, mi experiencia reciente me hizo sentir bastante incómodo con la idea de que puede volar con una respuesta elemental que no es necesaria . ¿Lo suficientemente justo?
mosquito
2
+1 para cubrir el costo del cambio de contexto a los documentos de referencia. Tener que mirar hacia arriba cada paso hace que las cosas se ralenticen.
Wyatt Barnett
8

No. Estaría muerto sin la capacidad de buscar en la documentación de la API. La única vez que no lo tengo es cuando intento depurar algo donde no puedo acceder a la documentación. Luego, "realizo ingeniería inversa" de las piezas de api y cut-n-paste según sea necesario.

Es importante tener una buena idea de qué trata la API y qué parte es mejor usar, pero conocer los nombres de los métodos, los nombres de las variables ... no es realmente necesario.

Paul
fuente
3

En el trabajo, nunca tuve una situación en la que no tuviera acceso a la documentación. Por otro lado, tener la comprensión lectora y la comprensión general para poder interpretar documentación mal escrita resulta útil todo el tiempo.

Eventualmente debería conocer los patrones y la estructura de sus API, pero saber exactamente dónde está todo no es particularmente útil.

En SFU Computing Science, los exámenes a libro cerrado constituyen entre el 70% y el 100% de nuestras calificaciones. La teoría es que los exámenes evalúan su comprensión del material del curso y su adaptabilidad. En realidad, todo lo que realmente prueba son sus nervios, su calidad / duración del sueño, su ingenio y sus técnicas de memorización de memoria, ninguna de las cuales es necesaria académicamente ni para un trabajo típico en la industria del software.

Rei Miyasaka
fuente
2

A todos menos a su última pregunta: el conocimiento enciclopédico de cualquier documentación API no es importante. Obviamente programará más rápido si conoce cada detalle de cada método de cada clase, pero esa no es una expectativa razonable.

A su última pregunta: se espera que conozca los detalles de algunas clases sin la documentación de la API. Si sabe antes de entrar a la entrevista que se le realizará una prueba, o si el trabajo está muy enfocado (es decir, estará haciendo hilos todo el día), entonces razonablemente podría esperar conocer las clases relacionadas en detalle.


Anexo: Debe aclarar bien antes de cualquier examen con su profesor / instructor exactamente qué materiales se proporcionarán y qué materiales puede traer usted mismo. Suponga que todo lo que no hayan acordado explícitamente no está permitido. He tenido cursos en los que solo podía aportar lo básico para escribir, donde podía traer los libros que deseaba y donde podía traer exactamente una hoja de doble cara con todo lo que quisiera. Los exámenes generalmente se estructuran en torno a qué materiales están permitidos.

Mate
fuente
2

API docs! = Sintaxis de idioma.

Puedo entender cuando alguien no sabe los nombres exactos de varias clases de Java y sus métodos. No los conozco y codifico en Java todos los días. Me perdería sin los documentos o el autocompletado IDE todopoderoso, especialmente cuando se trata de la API estándar de Java, que es bien conocida por su verbosidad en los nombres de variables / clases / métodos.

Sin embargo, como dijiste tú mismo, no es algo que generalmente se encuentra en documentos que no puedas recordar. Es la sintaxis para las clases internas: esta es una característica del lenguaje en sí misma, no algo para memorizar de los documentos.

Por mucho que piense que a los estudiantes se les debería permitir (en muchos casos) usar los documentos para API estándar, creo que cualquiera que quiera aprobar un examen de programación debe conocer la sintaxis del lenguaje. Y no me refiero a algunos casos extraños que solo los diseñadores de idiomas conocen, solo los estándar, como el de su ejemplo.

Goran Jovic
fuente
2
Tampoco creo que valga la pena memorizar la sintaxis. Características y patrones y trucos, sí, pero sintaxis, no. Trabajo con demasiados idiomas para que tenga sentido, y creo que eso también se está haciendo realidad para la mayoría de los desarrolladores.
Rei Miyasaka
@ReiMiyasaka: No creo que deba memorizar las especificaciones del idioma completo, pero debe conocer la sintaxis básica en cualquier momento. ¿Busca en los documentos cómo escribir un bucle en cualquiera de sus idiomas? ¿O simplemente lo codificas?
Goran Jovic
¡En verdad trabajo con bastantes idiomas, y a menudo olvido la sintaxis exacta incluso para cosas básicas! Por lo tanto, siempre necesito consultar los documentos.
Antonio2011a
@ Antonio2011a: Admito que lo hago yo mismo, especialmente cuando uso idiomas menos comunes. Pero para muchos estudiantes, el idioma que se aprende es el primer lenguaje de programación. Si un estudiante ni siquiera aprendió la sintaxis, entonces no dice nada bueno sobre cómo se preparó para el examen.
Goran Jovic el
@Goran En realidad, no necesariamente, por dos razones: 1. la compilación en segundo plano me dice cuándo tengo la sintaxis incorrecta, y 2. los bucles son secundarios (casi inexistentes) en lenguajes como Haskell y ML. Los idiomas son más diversos de lo que piensas. Aunque paso la mayor parte de mi tiempo codificando en F # y solo recuerdo vagamente a Haskell, todavía puedo entender el código de Haskell muy bien, recordando tomar nota de las diferencias semánticas. Por otro lado, estoy de acuerdo en que aprender un primer idioma de adentro hacia afuera es extremadamente importante y muy a menudo descuidado.
Rei Miyasaka
2

En Eclipse puede escribir obj.y presionar ctrl + espacio e intentará completarse automáticamente al darle todas las opciones de método para el objeto dado. Si eso me falla por alguna razón, la API de Java tiene el resto de las respuestas. Sería difícil pensar en un día en que no buscara en Google cómo hacer algo.

Sin embargo, la escuela es una historia completamente diferente.

Stephanie
fuente
2

En mi humilde opinión, la academia generalmente apesta en producir buenos ingenieros de software. Solo las personas que codifican por diversión después de las lecciones tienen la oportunidad de lograr algo en proyectos del mundo real.

Por otra parte, la academia no se trata de producir desarrolladores, todo el mundo se trata de cómo resolver problemas abstractos y hacer la investigación. Está muy lejos de la aplicación práctica la mayor parte del tiempo. Y los investigadores no son necesariamente buenos programadores.

Y aprender API de memoria apesta. Hay autocompletar / google / msdn / javadocs para buscar todos los rincones, ¿por qué alguien querría tener todo eso en su cerebro en todo momento? Las funciones más comunes que aprenderá en pocas semanas / meses, todo lo demás se puede consultar en cuestión de segundos si conoce la sintaxis, la estructura y las ideas generales.

Por otra parte, algunas personas todavía codifican en los editores de texto y recuerdan los nombres de las funciones de memoria, eso no es necesariamente incorrecto, pero si son fanáticos al respecto, tienes a tu profesor.

Además, incluso si conoce los nombres y parámetros de funciones de memoria, es una buena idea verificarlos en el último documento de API. strtok estaba bien en un escenario de subproceso único hace 10 años, no está bien hoy en día. Si solo aprende los nombres y parámetros, nunca sabrá que la funcionalidad podría estar en desuso o inventarse mejores alternativas.

Los idiomas cambian, por lo que debe cambiar con ellos, recordar que una forma verdadera no es buena para eso.

Descifrador
fuente
1

si comienzas a trabajar en algún proyecto por un tiempo no corto usando una API, tarde o temprano aprenderás muy bien esa API. Creo que esta es una habilidad totalmente innecesaria ya que no conozco a nadie que nunca eche un vistazo a la documentación (msdn, páginas de manual, etc.)

sin embargo, las universidades son un universo completamente diferente, así que no se sorprenda si falla porque no conoce el nombre typedef del décimo parámetro de CreateWindowEx, por ejemplo.

Hayri Uğur Koltuk
fuente
No es consistente con mi experiencia en universidades. En todo caso, tienden a obsesionarse con la teoría y les falta atención a los detalles. ¿O ha bajado el nivel al de las escuelas profesionales?
Programador
No estoy hablando de una universidad, y este es solo un ejemplo de lo que puedes ver en alguna parte del mundo en alguna universidad. como saben, no son todos iguales
Hayri Uğur Koltuk el
2
Las universidades siempre han tenido algún grado de memorización y regurgitación. Hubiera mejorado el cálculo si hubiera tenido un libro CRC disponible en lugar de tener que memorizar tablas integrales.
Blrfl
1

Yo diría que no, no es necesario, es físicamente imposible para el cerebro humano memorizar tanta información, pero aún necesita saber los conceptos básicos o las cosas más utilizadas, ya que no hay muchos para memorizar. . De lo contrario, es imposible memorizar todo lo que hay en Java.

También es injusto que un maestro quiera que sus alumnos sepan todo, o que lo usen para saber si programan con un idioma, además de los ejercicios o proyectos que él le asigna. Para mí es como querer saber qué haces cuando no estás en la escuela o haces un trabajo relacionado.

EDITAR: Obviamente, lo que el maestro te pide depende de él, algunos maestros valoran más la teoría, mientras que otros valoran la práctica y no les importa si no entiendes todo.

Coyote21
fuente