El futuro del desarrollador de software es un buen artesano. Con la infraestructura, como Amazon web services y una abundancia de básicas librerías, ya no se necesita un pueblo para construir una buena pieza de software.
En estos días, un par de ingenieros que saben lo que están haciendo puede ofrecer sistemas completos.
En este post discutiremos los 10 conceptos básicos que cada ingeniero de software debe saber y cuales son los pasos para aprendérselos.
Un Ingeniero del Software de éxito conoce y utiliza patrones de diseño, activamente refactoriza código, escribe pruebas unitarias y religiosamente busca la simplicidad. Más allá de los métodos básicos, que son conceptos que los ingenieros de software bien conocen. Estos lenguajes de programación y proyectos trascienden mas allá – Estos no son los patrones de diseño --, pero podrías ampliar tus conocimientos familiarizándote con estos 10 conceptos:
-
Interfaz
-
Convenios y plantillas
-
Capas
-
La complejidad algorítmica
-
Hashing
-
Almacenamiento en Caché (Caching)
-
Concurrencia
-
Cloud Computing
-
Seguridad
-
Base de datos Relacionales (Relational Databases)
El concepto mas importante en el manejo de software es la Interfaz. Todo bueno Software (Programa) es un modelo de un real (o imaginario) sistema. Entendiendo como un modelo de problema en términos correctos y simples la interfaz que usa es crucial. Muchos de los sistemas sufren de los extremos como agruparlos o un sistema diseñado con una complejidad innecesaria y un código no utilizado .
Entre los muchos libros, Ágil Programación (Agile Programming) por el Dr.Robert Martin destaca por centrarse en el modelado de interfaces correcta.
En el modelo que plantea el Dr.Robert, hay maneras en que puede iterar hacia la solución correcta. En primer lugar, nunca añadir métodos que podrían ser útiles en el futuro. Ser minimalista, salir con tan poco como sea posible. En segundo lugar, no tengas miedo a reconocer hoy que lo que hiciste ayer no estaba bien. Estar dispuesto a cambiar las cosas. En tercer lugar, tener paciencia y disfrutar el proceso. Finalmente se llega a un sistema que se siente bien. Hasta entonces, mantener la iteración y no se conforme y trate de hacer cada ves mejor las cosas.
2.- Etiquetas y plantillas
Las etiquetas y las plantillas de base son los patrones de software más alto, pero probablemente los más poderosos.
Nombrar etiquetas permiten la automatización de software. Por ejemplo, Java Beans framework se basa en un simple renombramiento para los captadores y definidores. Y URL canónica en del.icio.us: http://del.icio.us/tag/software llevará al usuario a la página que tenga todas las etiquetas de software.
Muchos utilizan el software social, nombrar etiquetas en forma similar. Por ejemplo, si su nombre de usuario es juanvasquez entonces es probable que tu avatar juanvasques.jpg y su feed RSS es juanvasquez.xml.
Nombrar etiquetas también se utilizan en las pruebas, por ejemplo JUnit reconoce automáticamente todos los métodos de la clase que se inician con la prueba de prefijo.
Las plantillas no son de C + + o un lenguaje Java . Estamos hablando de archivos de plantilla que contiene variables y permiten la unión de los objetos, resolución y la representación del resultado para el cliente.
Cold Fusion es uno de los primeros en popularizar las plantillas para aplicaciones web. Java siguió con JSP, Apache y recientemente desarrollados de propósito general y útil para plantillas Java llamadas Velocity. PHP puede ser usado como su propio motor de plantillas, ya que soporta la función eval (cuidado con la seguridad). Para la programación de XML Esta estándar usar el lenguaje XS para hacer plantillas.
Las plantillas son una ayuda esencial en cualquier sistema de software moderno.
3.- Capas
Capas es probablemente la forma más sencilla para discutir la arquitectura de software. Es definición se daría primero cuando Juan Lakos publicó su libro (Large Scale C++ Software Design) sobre la gran escala de C + + en los sistemas. Lakos argumentó que el software consiste en capas. El libro introduce el concepto de capas y el método consiste en lo siguiente, para cada componente de software, contar el número de otros componentes en que se basa, esa es la métrica de la complejidad del componente.
Lakos sostuvo que el software sigue la forma de una pirámide, es decir, hay un aumento progresivo de la complejidad acumulativa de cada componente, pero no en la complejidad de inmediato. Dicho de otra manera, un buen sistema de software consiste de pequeños bloques de construcción reutilizables, cada uno con su propia responsabilidad. En un buen sistema, sin dependencias cíclicas entre los componentes están presentes y todo el sistema es una pila de capas de funcionalidad, formando una pirámide.
Lakos fue un precursor de muchos desarrollos en la ingeniería de software, sobre todo de refactorización. La idea detrás de refactorización continuamente esculpiendo el software para asegurar una estructura sólida y flexible. Otra aportación importante fue por el Dr. Robert Martin de Object Mentor, quien escribió sobre dependencias y arquitecturas cíclicas
Entre las herramientas que ayudaron a los ingenieros a lidiar con la arquitectura del sistema fue Structure 101 programas desarrollados para avanzar, y SA4J desarrollado por mi antigua compañía, información de laboratorio, y ahora está disponible en IBM.
4.- La complejidad algorítmica
Hay sólo un puñado de ingenieros que sabe acerca de la complejidad algorítmica. La primera es la notación O grande. Si algo tiene O (n) es lineal en el tamaño de los datos. O (n ^ 2) es cuadrática. Usando esta notación, usted debe saber que buscar a través de una lista es O (n) y la búsqueda binaria (a través de una lista ordenada) es log (n). Y clasificación de n elementos tomaría n * log (n) tiempo.
El código debería casi nunca bucles múltiples anidados (un bucle dentro de un bucle dentro, de un bucle). La mayoría del código escrito el día de hoy deberá utilizar tablas hash, listas simples y bucles anidados por separado.
Debido a la abundancia de excelentes bibliotecas, no somos tan centrado en la eficiencia en estos días. Eso está bien, como puede suceder dar ajustes más tarde, después de obtener el derecho de diseño.
Los algoritmos elegantes y su actuación es algo que no debería ignorar. Código compacto y de fácil lectura escritura ayuda a garantizar que sus algoritmos sean limpios y simples.
La idea detrás del hash es el acceso rápido a los datos. Si los datos se almacenan de forma secuencial, el tiempo para encontrar el producto es proporcional al tamaño de la lista. Para cada elemento una función de control calcula un número, que se utiliza como índice en la tabla. Habida cuenta de una buena función hash que extiende de manera uniforme los datos a lo largo de la mesa. El perfeccionamiento del hash es difícil y para hacer frente a las implementaciones de la resolución que Hashtable con apoyo de colisión.
Más allá del básico almacenamiento de datos, los algoritmos hash son también importantes en los sistemas distribuidos, el llamado uniforme hash se utiliza para asignar equitativamente los datos entre computadoras en una base de datos y una base de nubes. El uso de esta técnica es parte del servicio de indexación de Google, cada URL hash a un equipo en particular. Memcached es similar utiliza una función hash.
Las funciones hash puede ser complejo y sofisticado, pero las bibliotecas modernas tienen valores por omisión correctos. Lo importante es cómo usar los hashes de trabajo y cómo ajustar esos beneficios y sacar el máximo rendimiento.
Libro: Design of Hashing Algorithms
6.- Almacenamiento en Caché (Caching)
Ningún sistema web moderno se ejecuta sin un caché, que es un banco de memoria que contiene un subconjunto de información que normalmente se almacena en la base de datos. La necesidad de caché viene del hecho de que los resultados de generación basado en la base de datos es costoso. Por ejemplo, si usted tiene un sitio web que la semana pasada tenia una lista de libros que eran populares pero ya no lo son, lo que hace es calcular esta información y una la coloca en caché. Las solicitudes de los usuarios es obtener los datos de la memoria caché en lugar de buscar en la base de datos y la regeneración de la misma información.
El almacenamiento en caché tiene un costo. Sólo algunos subconjuntos de información puede ser almacenada en la memoria. La estrategia más común para los datos es podar, para desalojar los elementos que no son usados frecuentemente (LRU). El podar elementos tiene un fin que debe ser eficiente y no debe retrasar a la aplicación.
Una gran cantidad de aplicaciones web modernas, incluyendo Facebook, se basan en un sistema de caché distribuido llamado Memcached, desarrollado por Brad Firzpatrick cuando se trabaja en LiveJournal. La idea era crear un sistema de almacenamiento en caché que utiliza la capacidad de memoria de repuesto en la red. Hoy en día, hay Memcached bibliotecas para muchos lenguajes populares, incluyendo Java y PHP.
Libro: Web Caching
7.- Concurrencia
La concurrencia es uno tema que los ingenieros tienden a equivocarse o confundirse y es entendible, porque el cerebro hace malabares con muchas cosas a la vez y en las escuelas el pensamiento lineal se pone de relieve. Sin embargo, la concurrencia es importante en cualquier sistema moderno.
La concurrencia es aproximadamente el paralelismo, pero dentro de la aplicación. La mayoría de las lenguas modernas tienen un concepto en construcción de la concurrencia, en Java, que es implementado utilizando hilos de ejecución.
Un ejemplo clásico es la concurrencia del productor / consumidor, cuando el productor genera datos o tareas y los lugares para los subprocesos de trabajo para consumir y ejecutar. La complejidad de la programación se deriva de la Threads , que a menudo se necesita para operar en los datos comunes. Cada hilo tiene su propia secuencia de ejecución, pero tiene acceso a datos comunes. Una de las colecciones más sofisticadas de concurrencia ha sido desarrollado por Doug Lea y ahora es parte de Core Java.
libro: Java Threads
8.- Cloud Computing
Cloud computing surgió de la computación paralela, un concepto que muchos problemas se pueden resolver rápidamente mediante la ejecución de los cálculos en paralelo.
Después de algoritmos paralelos llegó grid computing, que se desarrolló cálculos en paralelo en los escritorios de inactividad. Uno de los primeros ejemplos fue proyecto SETI @ home de Berkeley, que utiliza los ciclos de repuesto de la CPU a los datos de crisis provenientes del espacio. Grid computing es ampliamente adoptado por las empresas financieras, que se ejecutan los cálculos de riesgo enorme. El concepto de los recursos no utilizados, junto con el aumento de la plataforma J2EE, dio lugar a la precursora de la nube de computación: la virtualización de servidor de aplicaciones. La idea era ejecutar las aplicaciones en la demanda y cambiar lo que está disponible dependiendo de la hora del día y la actividad del usuario.
Un ejemplo más claro en el día de hoy, la computación nube es Amazon Web Services, un paquete disponible a través de la API. Que ofrece Amazon incluye un servicio de Cloud (EC2), una base de datos para almacenar y servir a grandes archivos multimedia (S3), un servicio de indexación (SimpleDB), y el servicio de cola (SQS). Estos primeros bloques ya la autonomía de una manera sin precedentes de hacer a gran escala de la informática, y sin duda lo mejor está por venir.
Libro: Programming Amazon Web Services
9.- Seguridad
Con el auge de la piratería y los datos de la sensibilidad, la seguridad es primordial. La seguridad es un tema amplio que incluye la autenticación, autorización y transmisión de información.
La autenticación de la identidad del usuario está a punto de verificación. Un sitio Web típico pide una contraseña. La autenticación suele producirse a través de SSL (Secure Socket Layer), una forma de transmitir la información codificada a través de HTTP. La autorización es acerca de los permisos, y es importante en los sistemas corporativos, particularmente aquellos que definen los flujos de trabajo. El protocolo de OAuth recientemente ayuda a los servicios web para permitir a los usuarios a abrir el acceso a su información privada. Así es como Flickr permite acceder a fotos individuales o conjuntos de datos.
Otra área de seguridad es la protección de la red. Esto se refiere a los sistemas operativos, configuración y control para frustrar a los piratas informáticos. No sólo la red es vulnerable, cualquier pieza de software es. El navegador Firefox, comercializado como el más seguro, tiene que reparar el código de forma continua. Para escribir código seguro para su sistema requiere de la comprensión de detalles y posibles problemas.
10.- Base de datos Relacionales (Relational Databases)
Bases de datos relacionales han sido calificada con un mal nombre porque no puede escalar bien para apoyar los servicios web de gran escala. Sin embargo, este fue uno de los logros más fundamentales de la informática que nos ha llevado durante dos décadas y seguirá siendo durante mucho tiempo. Bases de datos relacionales son excelentes para los sistemas de gestión de pedidos, bases de datos corporativas y P & L de datos.
En el núcleo de la base de datos relacional es el concepto de representación de la información en los registros. Cada registro se agrega a una tabla, que define el tipo de información. La base de datos ofrece una forma de buscar los registros usando un lenguaje de consulta, en la actualidad de SQL. La base de datos ofrece una manera de correlacionar la información de varias tablas.
La técnica de normalización de datos es correcta acerca de formas de compartimentación de los datos entre las tablas para minimizar la redundancia de datos y maximizar la velocidad de recuperación.
Via: Readwriteweb