No soy un buen programador (en lógica), ¿cómo debo solucionarlo? [cerrado]

50

Ok, entonces aquí está mi problema:

Trabajo para una gran empresa, de alguna manera conseguí un trabajo (francamente porque la entrevista fue fácil). No es que no sepa mis cosas, soy bastante bueno para entender Java, son bibliotecas, etc.

Pero, cuando trato de resolver algún problema de lógica, me resulta muy difícil encontrar una solución.

Por ejemplo, conversion of decimal to romancuando vi la solución, encuentro que es un problema simple. ¡Pero no pude implementarlo después de 1-2 horas de probarlo!

Siento que soy tonto y que no vale la pena ser ingeniero de software. Las habilidades para resolver acertijos deben ser nativas para un gran programador. Pero cuando trato de resolver algunos acertijos, no puedo encontrar una solución y ¡simplemente lo busco en Google! ... ¡y lo odio!

Cuando tengo un problema (como implementar la función xyz) en el trabajo, soy bastante rápido en eso y respeto en mi lugar de trabajo por eso, pero no estoy en absoluto orgulloso de ello. Porque cuando trato de resolver cualquier problema matemático o lógico que suponga un desafío, tiemblo. Todavía siento que amo lo que estoy haciendo (como ingeniero), pero me siento realmente triste porque no puedo resolver algunos problemas lógicos difíciles que se me ocurren a mis amigos.

Me siento desmoralizado :(

TL; DR: Entiendo las cosas desde un punto de vista práctico (implementando características en nuestro producto), pero cuando trato de trabajar en un problema desde, por ejemplo, ProjectEuler, ¡CHUPO mal! ¡Y necesito agudizar mi cerebro!

Entonces, mis preguntas son:

  1. ¿Cómo debo arreglarlo? ¿Debo comenzar resolviendo (y obligándome a mí mismo) a proyectar problemas de Euler? ¿Incluso si me toma horas resolver algunos problemas básicos ?
  2. ¿O debería volver a lo básico y estudiar matemáticas básicas?
  3. Realmente no encuentro divertido resolver rompecabezas. ¡Pero quiero hacerlo divertido para mí! Y creo que si los entiendo mejor, ¡me gustará!

PD: nunca fui educado en CS (mi licenciatura era electrial). Pero esa no es una excusa para ser un desarrollador desagradable.

¡Gracias!

John
fuente
3
Si no es divertido resolver rompecabezas para ti, ¿por qué molestarte?
V4Vendetta
3
No es divertido porque me cuesta mucho resolverlo. Si soy bueno en eso, ¡estoy seguro de que me gustará!
John
1
Siempre se puede intentar este (advertencia, muy adictivo si usted está en la resolución de puzzles)
Benjol
2
Nada viene de forma nativa. Incluso las habilidades más básicas necesitan aprendizaje. Recomendaría el cálculo y la mecánica clásica como campos de juego para entrenar las habilidades requeridas, pero muchas otras materias (incluidas las que no son matemáticas) podrían hacer lo mismo.
SK-logic
3
@John confirmado. Fue un problema dificil. No debería sentirse mal si no puede resolverlo en 5 minutos. Una hora y media para hacerlo, después de leer el Wiki sobre números romanos, y solo comparando sus resultados con los resultados de otra implementación pude corregir un error. Yo (como muchos otros) pensé que IL era un número válido. Incorrecto. XXXIX es el número correcto. Además, tuve que ver otras implementaciones para optimizarlo (estaba almacenando previamente en caché II, III, XX, XXX, etc., pero es inútil). ¡No te sientas mal!
xanatos

Respuestas:

24

Primero, es maravilloso que veas esto como una debilidad en tus habilidades. En realidad, sabe dónde necesita mejorar, lo que hace que sea mucho más fácil hacerlo e indica que es mejor de lo que cree.

Creo que su problema principal, que he visto muchas veces antes, es que no tiene un "conjunto de herramientas para resolver problemas". Cuando te enfrentas a un problema, ¿qué haces? ¿Cómo haces para resolverlo? Soy lento en matemáticas, pero como sé cómo usar las pequeñas herramientas de matemáticas juntas, hice cálculos.

Entonces, además de trabajar en la resolución de problemas, debe observar qué herramientas y habilidades aporta a la mesa cuando lo hace. Si iba a trabajar en una nueva función en el trabajo, ¿simplemente se sienta sin IDE, sin depurador, sin documentación, sin internet y sin código fuente? ¡Por supuesto no!

Existen herramientas para resolver problemas, simplemente no las conoce ... todavía . El artículo de wikipedia tiene algunos enlaces a técnicas de resolución de problemas. Pero la herramienta más importante es el método científico . El artículo de wikipedia incluye un enfoque pragmático:

  1. Definir una pregunta
  2. Recopilar información y recursos (observar)
  3. Formar una hipótesis explicativa
  4. Pruebe la hipótesis realizando un experimento y recolectando datos de manera reproducible
  5. Analiza los datos
  6. Interprete los datos y saque conclusiones que sirvan como punto de partida para nuevas hipótesis.
  7. Publicar resultados
  8. Retest (frecuentemente realizado por otros científicos)

¡Todos los problemas se pueden resolver de esta manera! Sin embargo, muchas personas no siguen estos pasos. Es como un desarrollador que se niega a probar su código. En absoluto. Tendrá problemas para descubrir que incluso existen errores.

Finalmente, la otra herramienta principal para la resolución de problemas es desglosarlo con simples pasos. Por ejemplo, el primer problema en los ejemplos del proyecto Euler :

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

Tenemos dos hechos y un problema aquí. El primer hecho nos muestra cómo definir un múltiplo de tres o cinco por debajo de 10. 3 * 1,3 * 2,3 * 3,5 * 1 son todos válidos. 5 * 2 no es porque sea igual a 10. Entonces, el hecho dos nos dice que los sumamos para obtener 23.

Entonces ya tenemos un método para encontrar valores, y podemos sumarlos para obtener nuestra suma. Por supuesto, podemos ver los hechos y aplicar un simple reverso del orden. 3, 5, 6 y 9 son múltiplos de 3 o 5. Eso es 3% 3, 5% 5, 6% 3, 9% 3 todos dan un mod de cero. Entonces, otro enfoque sería pasar de 999 a 1 y modular cada número con 3 y 5. Recolecte la lista de valores y agréguelos.

Sugeriría El arte de la programación de Unix como un excelente ejemplo del uso de herramientas pequeñas en el mundo de la programación. Encadenarlos juntos le permite resolver problemas muy complejos, y no puedo contar la cantidad de veces que estos conceptos me han ayudado.

Spencer Rathbun
fuente
19

Muchos programadores también son "solucionadores de acertijos" naturales, pero la programación es mucho más que eso. Si todos los programadores estuvieran enfocados en resolver problemas algorítmicos interesantes, tendríamos montones y montones de software que podrían resolver problemas geniales, pero ninguno de ellos sería utilizable o mantenible.

Encuentro que hay relativamente pocos desafíos de tipo "resolución de acertijos" en mi trabajo. La mayoría de los desafíos tienen que ver más con estudiar el código antiguo, aprender una nueva API, diseñar la arquitectura de algún componente de manera que las personas no lo juren en tres años. Todo esto es desafiante, pero no tanto del tipo de rompecabezas lógico. Por otro lado, tengo colegas que pasan la mayor parte de su tiempo pensando en algoritmos de optimización del compilador, y que son muy buenos en eso.

Creo que es importante que los programadores piensen constantemente en "¿cómo puedo mejorar en lo que hago?", Pero ser un buen programador no necesariamente requiere que seas excelente para resolver acertijos.

Personalmente, obtengo mi solución para resolver acertijos al resolver "geocachés misteriosos" .

JesperE
fuente
Pero muchas de las startups calientes SOLO enfatizan las habilidades para resolver acertijos. Toma facebook. Si no soy bueno para resolver acertijos, ¡ni siquiera soy elegible para postular allí!
John
66
Facebook tiene el robot de rompecabezas como primera verificación solo para evitar tener que examinar miles y miles de CV. Si realmente quieres trabajar para FB, entonces debes ser capaz de resolver ese tipo de problemas, pero hay muchos otros buenos lugares para trabajar.
JesperE
Fantástica respuesta. me tranquiliza también ... =]
Hartley Brody
9

Déjame advertirte, cuanto más sabes, más te das cuenta de lo poco que sabes.

Simplemente no te desanimes por eso. Sigue aprendiendo y tratando de trabajar en áreas que te faltan.

Ahora a su pregunta. Mi sugerencia sería comenzar a trabajar en los problemas del proyecto eule r.

Mis razones para esto son simples, comience con la pregunta más popular, estos son normalmente los problemas más fáciles de resolver.

Cuando se enfrente a un problema, intente resolverlo, trabaje por su cuenta, pruebe diferentes enfoques. La forma en que funciona el proyecto euler le permite verificar y probar su respuesta.

Si decide que no puede resolver este problema, comience a investigar el problema (no busque la respuesta). No intentes de nuevo.

Una vez que resuelva el problema, el proyecto euler tiene una sección donde le muestran las mejores respuestas para la implementación de cada idioma. Repase su respuesta en su idioma preferido, comprenda su solución y el pensamiento que conlleva.

Ahora cierre la respuesta que proporcionaron e intente nuevamente por su cuenta hasta que la resuelva nuevamente.

Si practica lo suficiente, la lógica y el pensamiento para resolver estos problemas le resultarán cada vez más fáciles.

SetiSeeker
fuente
4

La mayoría de los trabajos de programación no requieren mucha lógica. Pero estos podrían no ser los trabajos que le gustan.

Como pauta general, intente aprender algoritmos y estructuras. Puedo aconsejar el manual de diseño del algoritmo de Skiena. Una vez que sepa esto, comenzará a clasificar los problemas. Esto se parece mucho al problema de los vendedores ambulantes, aquí puedo usar un árbol, aquí puedo usar una búsqueda binaria ...

El Proyecto Euler tiene una gran variedad de rompecabezas. Muchos de estos son fácilmente realizables con un conocimiento matemático básico. Otros se resuelven más fácilmente una vez que conoces algunos de estos algoritmos.

Carra
fuente
2

Creo mucho que acabas de comenzar con tu viaje en la programación, así que lo primero si te toma un tiempo comprenderlo y hacerlo bien, parece que no es un problema. ¡La única diferencia que hace es que con cada intento aprendes algo como WoW! ! lo último que hice no tiene ningún sentido porque yo necesitaba decimal y no doble

Si resolver el acertijo no le interesa, no busque eso, hay otros problemas lógicos que flotan una vez que conoce su base de código, puede optar por trabajar en ellos y presentar cualquier edición sugerida a su mentor o líder . (no te preocupes si cometes un error, te ayudarán a saber por qué tu metodología es defectuosa, así que sé un buen observador y un buen oyente)

Tardará un tiempo en calmarse y luego podría seguir disparando con todos los cilindros. No hace falta decir que evite el impulso de buscar una solución en Google o SO, haga un esfuerzo por su parte y solo encienda su navegador cuando tenga dudas o no tenga ni idea.

V4Vendetta
fuente
1

En primer lugar, conocer tu debilidad es una fortaleza real, por lo tanto, sabes qué estudiar para obtener un mejor juego.

Mi consejo sería, lea mucho código que resuelva problemas de lógica. Todos tienen su propio estilo para resolver acertijos, la lectura del código puede insinuarle una forma de aprender a hacer esto. Además, ser capaz de comprender el código probablemente también le indique la teoría matemática que describe el problema, por lo que a lo largo del camino también aprenderá sobre los problemas subyacentes.

Saludos, Carlo

Carlo Kuip
fuente
1

Siento que debería agregar a esto.

Como la respuesta elegida ya ha dicho, conocer su debilidad es una gran ventaja, y existen algunas herramientas básicas para aprender técnicas de resolución de problemas. Sin embargo, lo que creo que falta en la respuesta es simplemente encontrar formas de practicar problemas difíciles, mucho. Sea terco sobre terminar completamente cada problema que intente. Leer código, mucho código, es bueno, al igual que leer libros sobre el tema de la resolución de problemas, pero escribir código es casi más importante.

De alguna manera, compartimos la misma debilidad (aunque no es tan malo como crees). Para practicar mis habilidades de resolución de problemas, siempre estoy trabajando en algún problema del proyecto Euler o HackerRank. Si es un problema fácil, elijo 7 lenguajes de programación y trato de resolverlo en todos ellos. Para problemas más difíciles, podría elegir 3 idiomas que son muy diferentes entre sí, solo para mantener razonable el tiempo que dedico al problema. Para todos los problemas, una vez que se me ocurre una solución, busco las soluciones que otros han encontrado y me aseguro de entenderlas. Si no entiende alguna solución, siempre puede publicar en StackOverflow o probablemente incluso aquí en Programmers Stack Exchange o algo así y estoy seguro de que hay alguien en el sitio que podría responder a su pregunta (es raro que no la haya).

Básicamente, sin embargo, asegúrese de practicar, y no solo de leer, y practique mucho. Al igual que los deportes, el pensamiento claro requiere tiempo y esfuerzo.

Otra cosa que puede hacer para ayudar a su forma de pensar acerca de los problemas es escribir el conjunto de pruebas para los problemas que resuelva primero. No puede escribir una buena prueba para un problema sin primero entenderlo completamente. Si hace esto para diferentes idiomas, tiene la ventaja de enseñarle diferentes técnicas de prueba al mismo tiempo.

Josiah
fuente