Un poco de fondo
Hoy tengo 28 años y nunca he recibido capacitación formal en desarrollo de software, pero sí tengo dos títulos de educación superior equivalentes a un BA en Relaciones Públicas y un MBA Ejecutivo centrado en la Gestión de Proyectos. He trabajado en esos campos durante unos 6 años en total y luego, hace 2,5 años, dejé / perdí mi trabajo y decidí cambiar de dirección.
Después de un mes de reflexionar, decidí comenzar a desarrollar sitios web pequeños en WordPress. Aprendí por mi cuenta y hoy puedo decir que tengo una carrera humilde pero exitosa desarrollando temas y complementos desde cero para mis clientes, en su mayoría agencias que externalizan parte de su trabajo de desarrollo para sitios web medianos / grandes.
Pero a veces siento que no haber estudiado suficientes matemáticas o no tener una comprensión formal de las cosas realmente me detiene cuando tengo que competir o trabajar con desarrolladores más experimentados. Estoy constantemente buscando maneras de aprender más, pero parece que me faltan los conceptos básicos.
Desafortunadamente, pasar 4 años más en Ciencias de la Computación no es una opción en este momento, así que estoy tratando de aprender todo lo que pueda de los libros y los recursos en línea. Este método nunca hará que la NASA me emplee, pero realmente no me importa en este momento. Mi objetivo es pasar primero el listón y poder llamarme un verdadero programador.
Actualmente paso mi tiempo libre estudiando Java For Programmers (para obtener un idioma que todo el mundo dice que es difícil / exigente), leer extractos de Code Complete (para conocer las mejores prácticas) y también Code: The Hidden Language of Computer Hardware y software (para comprender el funcionamiento interno de las computadoras).
TL; DR
Entonces, mi situación actual es esta: básicamente soy capaz de escribir cualquier sistema completo en PHP (con la ayuda de Google y algunos libros), integrando Ajax, SQL y otras cosas, y tal vez un poco más lento de lo que esperaría un desarrollador experimentado. debido a toda la investigación involucrada.
Pero ayer me quedé atrapado tratando de encontrar una solución (no Google) para la prueba FizzBuzz porque no tenía memorizado el operador del módulo de if($n1 % $n2 == 0)
método .
¿Qué sugeriría como una buena forma de resolver este dilema? ¿Qué materias / libros debería estudiar que me ayudarían a resolver problemas más rápido y tal vez más "de manera programada"?
EDITAR - Parece que hubo cierta confusión sobre lo que no sabía para resolver FizzBuzz.
Tal vez no me expresé bien: sabía los pasos necesarios para resolver el problema. Lo que no memoricé fue el operador del módulo. El problema estaba en transponer las matemáticas básicas al programa, no en saber las matemáticas básicas.
Tomé el examen por diversión, después de leerlo en Coding Horror . Simplemente decidí que era una buena línea de comparación de bases entre mí y los desarrolladores formados formalmente.
Acabo de usar esto como un ejemplo de cómo no haber tratado las matemáticas en un entorno informático antes me hace perder tiempo buscando cosas básicas como operadores de módulos para poder resolver problemas simples.
I'm basically capable of writing any complete system in PHP (with the help of Google and a few books)
y combino esto con usted sin saberloif($n1 % $n2 == 0)
, me pregunto acerca de la exposición que ha tenido a las cosas escritas en PHP. Creo que la mayoría de las cosas que haces van más allá de un simple cálculo de módulo. ¿Podría darnos más información sobre lo que cree que puede hacer?stuck b/c I didn't memorize %
problema, vale la pena señalar que hay otras formas de hacer esto: (suponiendo $ n2! = 0)if (is_int ($n1 / $n2))
oif (($n1 / $n2) == (int) ($n1 / $n2))
Conocer palabras clave es una cosa, y saber cómo expresar las ideas subyacentes en ausencia de una solución integrada es otro.Respuestas:
En su caso, como es autodidacta y ya tiene lo que parece ser un enfoque de aprendizaje bueno, saludable y sin BS. Todavía algunas sugerencias ...
La práctica hace la perfección
Creo que deberías sumergirte en ejercicios de programación, como:
Incluso tome las preguntas del examen anterior de universidades conocidas a su alrededor, o de competencias de programación locales (o remotas). Por ejemplo, tenemos uno agradable en Francia para los aspirantes a programadores de secundaria que se llama Prologin , y proporciona cada año una buena serie de acertijos (probablemente solo en francés, lo siento, pero ese es el tipo de cosas a las que me refiero )
Para más información: ¿Dónde puedo encontrar acertijos y desafíos de programación?
Libros clásicos y referencias
También podríamos recomendar una lista muy larga de libros increíbles , pero diría que la respuesta Zen es que no hay una única forma correcta de Iluminación.
Sería difícil decirte cuáles son los primeros de la lista. Así que sigue leyendo un montón de cosas para aprender las trampas generales que debes evitar y las mejores prácticas a seguir, como lo estás haciendo correctamente ahora.
Para más:
Empujando los limites
Además, busque material para rascarse la cabeza, como:
No necesariamente debe tomarse como un ejemplo de cosas que hacer hoy en día, pero vale la pena intentar descubrir qué demonios está sucediendo allí.
Los sistemas de pares son motivacionales
También es posible que desee acechar (e involucrarse) en las siguientes comunidades para mejorar sus habilidades de manera incremental al ser confrontado con otros.
Educación a tiempo parcial
Si no tiene el tiempo o la motivación para participar en otro curso de 4 años o algo similar (que puede no ser necesario o gratificante de todos modos y costoso), podría considerar buscar material de enseñanza en línea. Por supuesto, estos no se limitan a la informática.
Gracias al esfuerzo original de MIT OpenCourseWare , ahora hay toneladas de universidades que siguieron su ejemplo , y puede encontrar una gran cantidad de material de cursos de nivel universitario de forma gratuita. No siempre es fácil navegar y leerlo solo, pero algunos están bastante bien hechos. Para comenzar desde cero e ir bastante alto, considere también mirar la Academia Khan .
Algunos van un poco más allá y ofrecen cursos reales en línea de forma gratuita, donde de manera similar tiene acceso al material del curso, pero donde también ofrecen conferencias a ritmo y autoevaluaciones regulares. Por ejemplo, visite Coursera o Udacity .
La mayoría de los anteriores a menudo publican sus conferencias en Youtube o iTunesU, por lo que encontrará mucho material si su sed de conocimiento no fue saciada por todos los enlaces anteriores.
Si desea algo que brinde una experiencia más cercana a la universidad "real", puede considerar universidades remotas, que también le permiten trabajar a tiempo parcial, pero requieren que siga el ritmo y que tenga autoevaluaciones y finalice exámenes anuales (a veces in situ), como con OpenUniversity y sus variantes internacionales.
La pasión te mantiene en marcha
(y obtenga suficientes globos oculares mirando su código para criticarlo y tener diferentes perspectivas)
Los franceses dicen:
Sigue haciendo lo que estás haciendo y eventualmente serás un experto. Toma tiempo y trabajo.
Consulte también Tengo problemas para aprender para obtener más sugerencias.
PD: Aunque es una herramienta muy controvertida para las entrevistas y no ayuda a identificar buenos candidatos, a menudo uso FizzBuzz para al menos eliminar a los increíblemente "malos". ¡Así que ponte manos a la obra con esto! :)
fuente
No he estado codificando por mucho tiempo (comencé a enseñarme SQL hace unos 27 meses y comencé a codificar en Perl hace unos 20 meses), pero la cita anterior suena como algunas cosas que he escuchado de antiguos alumnos:
De acuerdo, el último probablemente fue un poco duro ... pero el punto que estoy tratando de hacer es que la resolución de problemas no es la memorización . Si lo fuera, entonces algún genio podría programar una computadora para resolver todos los problemas, y ninguno de nosotros tendría que volver a pensar (qué mundo tan infernal sería ...).
Ahora, es cierto que cualquier esfuerzo intelectual consiste en al menos un poco de memorización. En particular, si va a codificar en PHP, entonces debe comprender los tipos de datos básicos (números, cadenas, matrices), cosas básicas que puede hacer con ellos (para números: suma, resta, multiplicación, división y módulo; para cadenas: concatenación, subcadenas, reemplazo y al menos algún conocimiento de expresiones regulares; para matrices: concatenación, tachado de elementos, empalme de elementos, bucles, elementos de conteo, etc.) y las estructuras lógicas básicas que uno puede usar (sentencias if / then / else, bucles foreach, bucles while, etc.).
Luego, cuando encuentre un problema, utilícelo para proporcionar el contexto de las herramientas que necesita. Para FizzBuzz, necesita saber cuándo un número es divisible por 3, 5 o 15. Bien, entonces estamos tratando con números ... ¿qué herramientas básicas nos permiten saber cuándo un número entero es divisible por otro? Bueno, el operador del módulo. Entonces, usa eso. (Por supuesto, si su número es
$n
, podría ser elegante y ver si el último dígito de$n
es 0 o 5, y / o si los dígitos de$n
suman algo divisible entre 3, pero estoy divagando ...) Necesita haga esto para cada número entre 1 y 100, por lo tanto, para evitar el túnel del carpelo, use unforeach
bucle.La moral de la historia es que si por un lado dice "Básicamente soy capaz de escribir cualquier sistema completo en PHP" y, por otro lado, no puede codificar FizzBuzz, entonces la primera afirmación es incorrecta. Algunos de mis antiguos alumnos de cálculo juraron de arriba abajo que entendían los conceptos, pero simplemente no podían resolver los problemas del examen ... o los problemas de la tarea ... o los problemas del examen. También estaban equivocados acerca de su comprensión.
Deja de poner excusas y aprende lo básico.
fuente
Puedes pensar que FizzBuzz es un problema de juguete; ¿Cuándo necesitaré utilizar el operador de módulo en un programa real? Pero realmente lo usas todo el tiempo. Tres ejemplos comunes:
row_number % 2 == 0
) y muestra un color para las filas pares y otro para las filas impares.if item_number % N == 0
se escribió como el equivalente (if item_number|divisbleby: N
).if cur_item_number % 50 == 0 then commit_data
.Claro que hay otras formas de hacer todas estas cosas. Pero puede hacer zumbidos sin usar el operador de módulo o comparar la división flotante con la división entera. Por ejemplo, para FizzBuzz podría hacer algo como el siguiente pseudocódigo.
Para concluir, si quieres ser un gran programador algún día, no te metas en aprender libros de idiomas. Sí, un libro PHP / Java le permitirá obtener respuestas de google / stackoverflow y programas que funcionan a medias mucho más rápido que cualquier otra cosa. Pero para poder saber realmente cómo escribir programas óptimos de calidad y pensar como un programador, necesitas un poco de exposición a libros de CS reales.
Comience con un libro de CS que introduzca un lenguaje de programación y los antecedentes de CS, con el famoso ejemplo de Estructura e interpretación de programas de computadora (que enseñará Scheme - un dialecto de Lisp) o posiblemente algo más como Think Python How to Think Like a Computer Científico (que no he leído). Ambos son gratuitos en línea.
Eventualmente, debe leer un buen libro de algoritmos, el mejor es Algoritmos de CLRS (no gratis), aunque este libro de algoritmos en línea gratuitopodría ser un reemplazo de bajo costo (aunque si solo puede comprar CLRS). El libro de algoritmos le enseñará cómo pensar para resolver problemas informáticos y le presentará una variedad de estructuras de datos (matrices / listas enlazadas / montones / árboles binarios / árboles B / tablas de hash) y algoritmos importantes que necesita saber cómo usar de manera óptima . No necesita memorizar cada prueba o saber cómo escribir perfectamente cada algoritmo (quien alguna vez use un montón de Fibonacci); pero debe saber intuitivamente que dos bucles for anidados son O (N ^ 2); los tipos de comparación son, en el mejor de los casos, O (N lg N), la búsqueda binaria es O (lg N), puede encontrar la mediana en O (N), por qué las bases de datos del disco duro usan B-Trees, etc.). Como mínimo, un sólido conocimiento del libro de algoritmos lo ayudará a realizar entrevistas de programación técnica de la variedad google / facebook. Cuando lea libros de programación, no solo lea / lea; tú'
También recomendaría un libro sobre ingeniería de software (ya sea Code Complete o Pragmatic Programmer) después de leer el CS y el libro de algoritmos, que enseñará las mejores prácticas sobre cómo escribir un buen código que se pueda mantener (nombres claros; comente solo cuando sea necesario) ; mantener el código juntos; refactorizar cuando sea necesario; usar el control de versiones; etc.).
fuente
Nadie memoriza esa cosa. Se supone que debes inventarlo por tu cuenta. Si conoce el operador de módulo y sabe lo que hace, entonces trivialmente encaja perfectamente con el problema de FizzBuzz.
Voy a salir de apuros aquí y generalmente sugiero que el problema es PHP. Me gusta decir que Java es el peor lenguaje jamás diseñado, y PHP es el peor lenguaje , porque incluso sus creadores admiten que nunca fue diseñado. Es difícil aprender buenas prácticas de ingeniería de software cuando su entorno es prácticamente la definición de cómo no hacerlo. Y depender de un marco para hacer todo no es decir mucho.
Java es uno de los lenguajes más fáciles y peores que existen. Solo tiene una cosa: herencia manual recolectada de basura. Si sus amigos o asesores dicen que Java es difícil, busque nuevos amigos. C ++ es un lenguaje difícil que incluye muchos conceptos y que nadie discutirá. También podría hacer C #, que al menos tiene algunos genéricos y lambdas.
¿Cómo va a aprender a codificar, cuando sus idiomas fueron diseñados e implementados por personas que no pueden codificar, y usted depende de los marcos para todo lo que hace?
fuente
Creo que debes analizar detenidamente por qué estabas varado tratando de descubrir FizzBuzz. Entonces, supongamos que recuerdas que hay un operador que
$n
te dice si es divisible por un número. Y tienes mala suerte para olvidar lo que es. Bien, ¿por qué no intentas hacerlo de otra manera? Si sabe algo sobre el código, debería poder encontrar una docena de otras formas de hacerlo. Algunos de ellos pueden parecer extraños, como, por ejemplo, poner cada múltiplo de 5 en una matriz y luego verificar si$n
está entre ellos, y es una mala solución, pero aún así sería una solución. Sin embargo, estás diciendo que no tenías ninguno, solo estabas atrapado. Puede ser un síntoma de un problema mayor.Hay dos cosas en la programación que debes aprender.
Según su descripción, parece que comenzó con la primera parte, pero le falta algo en la segunda parte. Un buen curso de CS generalmente ayuda mucho con eso, pero no es la única forma. Tratar de resolver diferentes problemas y leer acerca de cómo deben resolverse estos problemas, leyendo libros fundamentales citados aquí, todo eso ayudaría. Una vez que tenga la mentalidad del programador, descubrirá que comenzar a usar una nueva bolsa de trucos no será un gran problema. Tendría que buscar en Google aquí y allá, por supuesto, pero nunca se quedará varado.
fuente
Te vuelves bueno en el desarrollo de la misma manera que te haces bueno en cualquier otra cosa: practica. Hay un buen concepto en el mundo de la programación llamado código kata . Este es esencialmente un ejercicio en el que codifica una solución a un problema relativamente pequeño, analiza lo que está bien y lo que está mal, lo descarta todo y lo vuelve a hacer. FizBuzz es un kata por derecho propio. Entonces, hazlo y haz más. Cuando encuentre cosas que no parecen ser muy buenas o que simplemente no funcionan, investigue y sea minucioso al respecto. Haga preguntas en los sitios de preguntas y respuestas, lea artículos y blogs, vea cómo otros manejan esto y luego practique lo que ha aprendido.
En el curso de esta práctica, aprenderá cuántos antecedentes matemáticos / teóricos adicionales podría necesitar. Si te topas con conceptos que simplemente no puedes entender, entonces lee sobre ellos y sus conocimientos previos y decide caso por caso si quieres tomar un curso o lo que tienes para expandir tu antecedentes teóricos.
fuente
Estoy interpretando que eso significa que no sabías y / o no recordabas el operador del módulo. Si este es el caso, el lugar para comenzar es revisar las construcciones del lenguaje en el idioma que está utilizando. Revisa todo lo que no "conozcas en frío" y aprende todo lo que no sabes.
fuente
Sigue codificando, sigue aprendiendo. Eventualmente, con suficiente dedicación, mirarás a FizzBuzz y te preguntarás por qué incluso tienes que pensarlo. Muchas empresas hacen una pregunta al estilo de FizzBuzz como una parte muy temprana de sus entrevistas, por lo que fallar esta vez significa que al menos has aprendido algo sobre el proceso de contratación.
Simplemente siga escribiendo código, proponiendo ideas de proyectos e investigando.
fuente
¿Puedo recomendar aprender JavaScript antes de Java, C ++? Razones para ti:
Recursos gratuitos para novatos
http://www.codecademy.com/tracks/code-year
https://stackoverflow.com/tags/javascript/info
Tenía unos 10 enlaces más, pero SE no me permite publicarlos hasta que llegue a 10 rep.
Aprender C ++, Java, etc. también es útil, pero no en mi humilde opinión no tiene el impacto general en la programación web como lo hace JS, ya que puede usarlo tanto en el front-end como en el back-end. ¡Que te diviertas!
fuente
Puede encontrar y ayudar a otros, por ejemplo, dando código (divulgación: mi sitio) o Código para América o lo que sea. Esta es una excelente manera de obtener más exposición a problemas de creación de páginas web que no sean PHP y sentirse bien también.
Cuando tiene que resolver un problema, o ayudar a resolverlo, o simplemente comprenderlo, el recoger el código es algo natural en el camino. Tener una meta es la mejor manera de aprender algo.
fuente
Entonces no pudo resolver el problema de FizzBuzz. Vaya cosa. Ahora puedes, y apuesto a que nunca olvidarás todas las innumerables formas de hacerlo. Intenta no estar tan ansioso por marcarte un mal programador simplemente porque no pudiste resolver un estúpido problema de la cabeza.
Ese es un problema. La otra es que parece que se siente un poco detrás de la curva de aprendizaje de programación. Como otros han dicho, sigue codificando y sigue leyendo. Cuanto más lo hagas, mejor serás. Es tan simple como eso. Comience con lo que sienta que es el mayor agujero en su fondo y continúe desde allí.
fuente
No creo que me niegue a recomendar a alguien por contrato porque no sabían que era el operador del módulo siempre que:
No siempre es (aunque generalmente)%, y algunos idiomas son raros. Y diablos, después de una década, no puedo decir honestamente que conozco a todos los operadores de Perl (¿y qué hace la nave espacial otra vez?) Ni puedo recordar siempre perfectamente a los operadores bit a bit. Han pasado algunos años desde que hice algo que incluso los requeriría.
Lo que podría hacerme dudar en recomendar a alguien sería si les causara un ataque de pánico por fallar esa pregunta / prueba. Eso podría darme la impresión de que estaban demasiado verdes (a menos que fuera una posición muy básica). Nadie necesita a alguien que memorice (o sienta la necesidad de) memorizar esas cosas. Necesita a alguien que entienda conceptos mucho más amplios. A nadie le importará si buscas eso en Google, pero en la entrevista tendrás que estar seguro de que saber% no es gran cosa y que sabes usar "operador" como palabra clave cuando haces un google rápido buscar.
Además, esto es solo una idea ... pero si su colegio comunitario local tiene un programa de compsci, todos sus otros créditos se transferirán, y es probable que solo necesite unos 20 créditos para el título de 2 años. Casi podría terminar eso en un semestre. Tendrían que hacer un curso de estructuras de datos, también con suerte los algoritmos ... podrían hacerte un poco más fuerte.
fuente
Aquí hay un curso de muestra: http://www.ox.ac.uk/admissions/undergraduate_courses/courses/computer_science/computer_science_.html
Sugiero leer primero lo siguiente: programación orientada a objetos (muy común, utilizada en cualquier lugar, aquí es donde entra Java) Concurrencia (para escribir programas de Java que no se bloqueen misteriosamente en el mundo real, aprender sobre puntos muertos) Conceptos de base de datos (la mayoría de las aplicaciones necesitan guardar datos, la teoría es importante aquí) Paradigmas de programación (lea sobre al menos un lenguaje que no sea Uy, preferiblemente funcional, para expandir su pensamiento y aprender cosas nuevas)
Cuando miro los 4 años de educación en ciencias comp, para ser honesto, creo que solo hay un puñado de cursos que debes tomar en serio.
Las estructuras de datos y los algoritmos (y necesita matemáticas aquí para ser realmente bueno y ser tomado en serio por otros programadores), las redes de computadoras y los sistemas operativos vienen a la mente como los más importantes. Podría decirse que otros temas que se ocupan del código de nivel inferior, como poder codificar en ensamblado, no son tan importantes para usted. La ingeniería y las pruebas de software lo exponen a conceptos que son útiles y puede aprenderlo con el tiempo.
Simplemente descargue un pdf que explique estos conceptos de manera intuitiva y estará en camino.
En algunos cursos de ciencias de la computación, al menos en el mío, el primer año es una introducción a todos los campos de la ingeniería, como mecánica, eléctrica, civil, etc. Hay muchas matemáticas complicadas, fíjate, que de nuevo pueden ser relevantes o no. para la mayoría de los programadores de aplicaciones de hoy. Entonces, muchos de los ingenieros actuales tienen solo 3 años de educación científica real (espero que esto te haga sentir mejor :)
El quid de la respuesta: puede tomarse un tiempo para estudiar todos los días, digamos una hora más o menos, y con el tiempo se convertirá en un buen programador. Solo sigue aprendiendo. Y recuerde escribir algún código todos los días.
fuente
Para mí, mi estrategia es que solo ataque el problema que es relevante para lo que estoy trabajando, así que mi consejo es que no tengas que aprenderlo todo, solo lee las cosas que son relevantes para lo que estás trabajando, porque si trataste de aprenderlo todo de una vez, hay una tendencia a postrarte y terminar odiando la programación.
Paz
fuente