patterns patrones diseño php structure system-design

patrones - ¿Cómo aumentar aún más mi conocimiento "avanzado" de PHP?(rápido)



php design patterns (15)

He estado trabajando con PHP durante años y obtuve una muy buena comprensión del idioma, creé muchos sistemas avanzados y no tan avanzados que funcionan muy bien.

El problema que me encuentro es que solo aprendo cuando encuentro la necesidad de algo que no había aprendido antes. Esto me lleva a buscar soluciones y otro código que maneje el problema, por lo que aprenderé sobre una nueva función o estructura que no había visto antes. Es de esta manera que aprendí muchas de mis mejores técnicas (como estudiar clases impartidas por Amazon, Google u otras compañías importantes).

El problema principal con esto es el concepto de no poder aprender algo si no sabes que existe. Por ejemplo, me tomó varios meses de programación aprender sobre la función empty() , y simplemente verificaría la longitud de la cadena usando strlen() para verificar valores vacíos.

Ahora estoy empezando a construir sistemas cada vez más grandes, y he comenzado a leer blogs como highscalability.com y he estado investigando la replicación de MySQL y los datos del servidor para escalar. Sé que la estructura de su código es muy importante para que los sistemas completos funcionen.

Después de leer un blog reciente sobre la estructura de reddit, me hizo cuestionar si hay algún sistema estándar o "aceptado".

He investigado frameworks (he usado Kohana, lo cual lamenté, pero decidí que los frameworks PHP no eran para mí) y prefiero mi propia biblioteca de funciones en lugar de tener un framework.

Mi estructura actual es una mezcla entre WordPress, Kohana y mi propio conocimiento.

Las formas que puedo ver como potencialmente beneficiosas son:

  • Leer blogs
  • Leer tutoriales
  • Trabajar con alguien más
  • Lee un libro

¿Cuál sería la mejor manera (s) de "llegar al siguiente nivel" el nivel de ser un desarrollador de sistemas muy bueno?


Prefiero mi propia biblioteca de funciones en lugar de tener un marco

Usted se refiere a una ''biblioteca de funciones'' y ''un'' marco ''como conceptos distintos (¡bien!) Entonces, ¿por qué no intentar subir un poco la apuesta y convertir esa biblioteca de funciones en un marco? Ten en cuenta que esta es una gran manera de aprender, pero no la mejor manera de tener habilidades comercializables;)

También es una excelente forma de aprender mal, así que antes de comenzar debes investigar un poco.

Las características "imprescindibles"

Hay ciertas características que tienen casi todos los marcos, y hay una razón para eso. Investigarlos; averiguar por qué están presentes y cuáles son sus variaciones; elija qué implementaciones prefiere incluir en su marco.

  • Orientada a objetos (esta es la clave de por qué escribiría un marco en lugar de simplemente usar su biblioteca de funciones)
  • Uso de Patrones (verifique y comience a preguntarse por qué tantos frameworks usan Application Controller en comparación con Front Controller ... y hay algunas plataformas que usan Page Controllers ?
  • Estructura básica MVC
  • Limpiar URLs

Características de las plataformas que no son PHP que quiere comprender y emular

No tengo idea de lo que te interesa, así que me detendré allí.

¡Publícalo!

Esta parte es importante, porque Nathan tiene razón : su trabajo debe ser visto, desafiado, criticado y corregido por otras personas. No deje esa lámpara debajo de un bushel; necesita ser vista; ponerlo en el código de Google o en la forja de origen o algo así, y si la gente se va a molestar en mirarlo seriamente, debe tomarlo en serio; necesita mantener pruebas unitarias y pruebas de regresión; necesitas usar control de versiones; necesita comentarlo bien, con un gran /* header comment */ en la parte superior de cada archivo y comentarios útiles para la generación de documentos para cada clase y miembro de la misma.

Resumen

Si haces todo esto, puedes aprender (a un alto nivel) sobre otras plataformas. Definitivamente puede "ding 40" como desarrollador de PHP. Puedes aprender sobre pruebas unitarias; sobre la prueba de regresión. Puede aprender a documentar de manera efectiva.

Garantizado que su marco saldrá "idiosincrásico y probablemente sucky", pero puede aprender mucho al escribirlo. Solo tenga en cuenta que el marco no es un producto; es un viaje ... de algún tipo.


  1. Mire las características ocultas de las interfaces predefinidas de PHP y PHP
  2. Aprende diferentes idiomas Aprende idiomas que tienen una curva de aprendizaje más pronunciada que PHP. Cada vez que señalo las ventajas de otros lenguajes con respecto a PHP, me acusan de ataques de PHP, en su mayoría personas que obviamente nunca dominaron otro idioma de alto nivel. Pero me arriesgaré. Sugiero Ruby, Python, Pearl y haXe (como contraparte estrictamente tipeado). Una vez que lo haya hecho, intente aplicar sus nuevos conocimientos a PHP. O simplemente aléjate de PHP, en caso de que no quieras volver (lo que creo que no es probable que suceda).
  3. Aprende a lidiar con critismo Tu reacción a la publicación de Nathan mostró claramente que no puedes lidiar con eso todavía. Él tiene toda la razón.
    • Viendo mi primer framework de PHP ahora, tengo que decir que fue bastante de mierda. En ese momento pensé que era genial (y aún es mejor que muchos códigos de producción que ya he visto desplegados). Aún así, tenía muchos defectos. A menos que seas un genio total, tus primeros marcos se verán terriblemente si los miras un poco más tarde (suponiendo que evolucionas).
    • En realidad, cualquier marco que cree se verá peor a medida que pase el tiempo (suponiendo que no deje de evolucionar). Por esta razón, es posible que también utilice los marcos disponibles y se concentre más en el desarrollo de aplicaciones. Si el marco que utiliza tiene limitaciones, considere contribuir en lugar de escribir otro marco PHP.
    • El momento oportuno para elegir escribir sus propios marcos (no solo por diversión / aprendizaje, sino por despliegue de producción) es cuando sus requisitos superan lo que otros marcos ofrecen y no cuando simplemente no le gusta la idea de trabajar con uno. Es un error común, que he hecho yo mismo. Pero ahora puedo decir, he aprendido de eso. Pero si pides consejo (que desafortunadamente no hice en ese momento) obtendrás respuestas como estas.
    • Aprendes mucho trabajando con código que no escribiste tú mismo. No solo retomas conceptos promovidos por marcos en los que otros piensan mucho, sino que también aprendes a ser productivo, flexible, capaz de trabajar en equipo y realizar el trabajo (al tiempo que obtienes resultados razonablemente buenos).
    • Supongo que no puedes pensar que eres mejor que todos los equipos de un proyecto PHP de código abierto, de lo contrario lo preguntarías. Supere la obstinada necesidad instintiva de reinventar la rueda que cualquier joven desarrollador tiene y crecer para enfrentar los problemas que nadie ha abordado aún.
  4. Aprenda cuál es la diferencia entre una biblioteca de componentes y un marco. Como cree que puede reemplazar un marco con "su propia biblioteca de funciones", probablemente no haya entendido cuál es el objetivo de los marcos. Eche un vistazo a la inversión de dependencia , la inversión de control y la inyección de dependencia .
  5. Aprende sobre el diseño de software. Mire los principios OO como SOLID y GRASP .
  6. Pruebe diferentes paradigmas. AOP, programación funcional. Mejore sus habilidades OO utilizando idiomas con una orientación de objetos más sólida, como Ruby, Objective-C o Smalltalk.
  7. Mire marcos de PHP como Flow3, Symfony, encendedor PHP y CakePHP. Ya he señalado por qué creo que deberías hacerlo.
  8. Como se señaló en otro comentario mío, debe considerar otros almacenamientos que los RDBM. SQL y OOP realmente no van bien juntos. Echa un vistazo a OODBMS, a diferentes capas de abstracción de bases de datos, tiendas de valores-clave, tiendas de documentos como CouchDB y MongoDB, distribuye servidores de almacenamiento en caché como Memcache, etc.

"mi propia biblioteca de funciones" == "un marco [idiosincrásico y probablemente sucky]".

Recomiendo aprender Symfony porque los desarrolladores parecen esforzarse constantemente por hacer todo de acuerdo con las "mejores" prácticas ... pero probablemente podrías aprender mucho de cualquiera de los marcos populares.

No escriba su propio marco. Por favor.


Aprende a hacer lo que ya sabes ... de una manera diferente. Ejemplos:

  • en un idioma diferente
  • en una plataforma diferente
  • en paralelo / distribuido
  • a través de un marco (sí, decidiste que "no son para ti", tal vez intentes con uno diferente, a veces son muy diferentes el uno del otro)

Aquí hay algunos pensamientos:

  • Prueba cosas diferentes Aprender un nuevo lenguaje. Algunas veces, en el proceso de aprender ese otro idioma, en realidad lo mejora en ambos.

  • Contribuya a un proyecto de código abierto.

  • Alta escalabilidad y PHP / MySQL no son amigos. Hoy hay tecnologías que se construyen solo para eso. node.js y Redis para nombrar un par.

  • Responda las preguntas en SO. Los problemas de otras personas pueden hacer que pienses de manera diferente y mejorar el proceso de intentar ayudar, y también le haces algo bueno a alguien.

  • [Trataré de agregar aquí si pienso en otra cosa que acabo de despertar tomando café: D]


Deberías trabajar con ejemplos, trabajar con ellos cuando los expandas para que aprendas cómo expandir los ejemplos haciéndolos más funcionales y dando más funciones.

Sin embargo, es bueno crear algo que hayas aprendido hasta ahora en PHP. Para practicar más, debes crear algo así como, un sistema de reserva, etc. Tarde o temprano podrás expandir más aprendiendo más cuando estudies más en PHP, lo que conducirá a que tu desarrollo sea mucho mejor.


El enfoque para mirar el código de otros programadores es definitivamente una buena forma de aprender las prácticas "buenas" o "malas". Después de leer otro código, desarrolla una "sensación" de buen código.

Definitivamente recomiendo Frameworks como Zend Framework, Symfony, CakePHP o Agavi porque muchos colaboradores miran ese código y lo desarrollan constantemente hacia la solución "ideal" (que por supuesto nunca será alcanzada ...);) Todavía puedes hacer la decisión de desarrollar sus propias clases en lugar de las que ofrece el marco ...

Con un fondo de PHP tan largo, podrías considerar contribuir a un marco de código abierto. Las discusiones con otros desarrolladores te permiten avanzar de una manera más rápida.

Mostrar su código a otros y solicitar opiniones constructivas tiene el mismo efecto. Nunca se sabe qué tan bueno eres hasta que comparas tus habilidades con los demás. Siempre de una manera constructiva. Este sería un proceso natural al contribuir a un marco de código abierto. ;)


Lee el código de otras personas. Ahora tiene su propia biblioteca, aunque puede obtener alguna aclaración al leer la fuente de otras aplicaciones. Entonces pregúntese a sí mismo el ''por qué''. Sé el escritor del blog, en lugar del lector. Además, enfatiza más en el programador que en el lenguaje. Mire las soluciones que ya resuelven un problema y trate de replicarlas con su propio conocimiento. ¡Buena suerte y diviértete mucho!


Lo mejor que puedes hacer es comprar un libro sobre algoritmos eficientes . En la vida de cada estudiante de ciencias de la computación llega un momento en que tiene que estudiarlos. Los problemas que se discuten / resuelven allí son abstracciones de casi cualquier problema del mundo real que pueda enfrentar.

Además de leer blogs sobre cómo otros lo hicieron está perfectamente bien, ya que te ayuda a entender cómo usar prácticamente (y tal vez incluso implementar) los principios de los algoritmos eficientes.

Saludos.


Me uniría a los foros de debate y trataría de resolver los problemas de los demás pueblos. A veces hay preguntas bastante desafiantes que te obligan a investigar un poco. Si no puede responderlo, puede esperar a alguien que pueda y aprenda algo entonces.

En cuanto a los marcos, aprende de ellos. También hago mi propia versión, ya que la mayoría de los frameworks pueden ser bastante lentos. Aunque es lo suficientemente rápido para la mayoría de los sitios web que existen.

También recomendaría buscar en la biblioteca PHP de Facebook. Ellos hacen algunas cosas interesantes allí.


No se puede decir lo suficiente sobre trabajar con otros desarrolladores. Conozco a 3 desarrolladores especialmente, 2 con quienes trabajo día a día, que me impresionan con su conocimiento. Pido sus opiniones sobre todo lo que hago, no porque adivine mis propias ideas, sino porque quiero escuchar otras ideas, especialmente de personas a las que respeto como desarrolladores. Aprendo más de estas personas que de ningún otro modo. Si no tiene acceso a otros desarrolladores sénior, entonces definitivamente publique en SO u otros foros de desarrolladores y pregunte a las personas las opiniones, pregunte a las personas cómo abordarían un proyecto / problema específico. No aprenderá nuevas técnicas / métodos / funciones en general a menos que los vea usar (¿cómo sabe qué buscar si no sabe que existe?)

Además, como ya se dijo, participa en una aplicación de sistema operativo. Vaya a sourceforge y encuentre un proyecto que necesite un desarrollador. O descargue una aplicación e intente escribir un complemento para ella (estoy escribiendo un complemento para Invision 3.0 atm y aprendiendo algunas cosas).

Espero que ayude.


Podría preguntarle a su compañía si podrían pagarle un examen de certificación PHP de Zend. Estudiar para este examen lo obligaría a conocer bien PHP y a capacitarse leyendo gran parte de la documentación, la guía de estudio de Zend, y también entrenando con exámenes simulados. Es una forma muy eficiente de mejorar, y se ve bastante bien en un currículum.


Simple: hazlo . Las necesidades te harán aprender. Encuentre una manera de involucrarse en proyectos cada vez más avanzados, ya sean comerciales o de código abierto. No hay otra manera de que realmente puedas aprender algo.


Tal vez deberías volver a mirar los marcos, te sugiero echarle un vistazo al Zend Framework, porque se parece más a una biblioteca de componentes que puedes usar como mejor te parezca, y realmente no impone una estructura rígida que debes seguir (como algunos otros marcos lo hacen), aunque sugiere un diseño de proyecto (bastante sano). Un buen punto de partida sería Sobrevivir al fondo .

Cosas que aún no has mencionado, y que podrían ser útiles para saber (especialmente en proyectos más grandes):


Todos los que quieren ser programadores de PHP, siempre toman solo la primera palabra e ignoran completamente la segunda.

Mientras que "programar" es MUCHO más importante que "PHP", para ser un profesional de PHP, uno debería ser un programador en primer lugar.

Entonces, votaría por la última, leyendo libros. No en PHP, pero en la programación en general. Grady Booch , Martin Fowler e incluso el viejo Donald Knuth .
También sería agradable echar un vistazo a algunos otros idiomas, como Java o Python. No cambiar a ellos, sino aprender de ellos.