<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;CEcHRXo_eSp7ImA9WhRWGU8.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116</id><updated>2012-01-07T02:40:34.441-05:00</updated><category term="Reviews" /><category term="IBM Certified Solution Designer - Object Oriented Analysis and Design vUML 2" /><category term="Guía IBM 833-834 : Análisis y Diseño Orientado a Objetos" /><category term="Guía IBM 839 : Rational Unified Process" /><category term="IBM Certified Solution Designer - IBM Rational Unified Process V7.0" /><category term="GWT" /><category term="Sun Certified Web Component Developer (SCWCD)" /><category term="Guía SCDJWS - Web Services" /><category term="OMG Certified UML Professional (OCUP)" /><category term="Sun Certified Developer For Java Web Services (SCDJWS)" /><category term="Guía SCMAD - J2ME" /><category term="Inclasificados" /><category term="Recetarios" /><category term="Certificación IBM" /><category term="Certificación Sun" /><category term="Libros revistas webs" /><category term="Causas justas" /><category term="Tutoriales" /><category term="Noticias" /><category term="En la cancha" /><category term="Sun Certified Mobile Application Developer (SCMAD)" /><category term="Java para principiantes" /><category term="IBM Certified SOA Associate" /><category term="Eventos" /><category term="Guía SCBCD - EJB 3.0" /><category term="Sun Certified Business Component Developer (SCBCD)" /><category term="Spring" /><category term="Certificaciones diversas" /><category term="Sun Certified Java Programmer (SCJP)" /><category term="Mocks preguntas y ejemplos" /><category term="Certificación Perú" /><category term="Presentaciones" /><category term="IBM Certified Specialist for Rational Requirements Management w/Use Cases" /><title>Certified (en Español)</title><subtitle type="html">Certificación Java, en castellano</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>269</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/certified-es" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="certified-es" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-nd/2.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">certified-es</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;A0MESHwzeip7ImA9Wx9QFEo.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-7505429698178299466</id><published>2010-12-27T13:13:00.005-05:00</published><updated>2010-12-27T14:50:09.282-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-27T14:50:09.282-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Spring" /><category scheme="http://www.blogger.com/atom/ns#" term="Presentaciones" /><title>Arquitectura Java EE y Spring Framework</title><content type="html">Hace unos meses -en mi anterior trabajo- realizé una presentación al equipo sobre fundamentos de arquitectura y su relación con Spring Framework. La presentación es fundamentalmente teórica así que van a encontrar poco código; &amp;nbsp;y consideré compartirla dado que estamos en campaña de resucitar el blog xD.&lt;br /&gt;
&lt;br /&gt;
Saludos, y hasta otra!&lt;br /&gt;
&lt;div id="__ss_4591339" style="width: 425px;"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/cptanalatriste/arquitectura-y-diseo-de-aplicaciones-java-ee" title="Arquitectura y diseño de aplicaciones Java EE"&gt;Arquitectura y diseño de aplicaciones Java EE&lt;/a&gt;&lt;/strong&gt;&lt;object height="355" id="__sse4591339" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=arquitecturaydiseodeaplicacionesj2ee-100623151516-phpapp02&amp;stripped_title=arquitectura-y-diseo-de-aplicaciones-java-ee&amp;userName=cptanalatriste" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4591339" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=arquitecturaydiseodeaplicacionesj2ee-100623151516-phpapp02&amp;stripped_title=arquitectura-y-diseo-de-aplicaciones-java-ee&amp;userName=cptanalatriste" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/cptanalatriste"&gt;Carlos Gavidia&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-7505429698178299466?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CdOtKAkB0L7NkMa3AZ3BRuBhRXE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CdOtKAkB0L7NkMa3AZ3BRuBhRXE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CdOtKAkB0L7NkMa3AZ3BRuBhRXE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CdOtKAkB0L7NkMa3AZ3BRuBhRXE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/7505429698178299466/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=7505429698178299466" title="7 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/7505429698178299466?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/7505429698178299466?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/12/arquitectura-java-ee-y-spring-framework.html" title="Arquitectura Java EE y Spring Framework" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><thr:total>7</thr:total></entry><entry gd:etag="W/&quot;DkAGRXo_eip7ImA9Wx9QEUk.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-1579649963632037023</id><published>2010-12-23T17:46:00.002-05:00</published><updated>2010-12-23T17:52:04.442-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-23T17:52:04.442-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GWT" /><category scheme="http://www.blogger.com/atom/ns#" term="Presentaciones" /><title>GWT para novatos</title><content type="html">&lt;div id="__ss_6307164" style="width: 425px;"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/cptanalatriste/gwt-u" title="GWT - Una introducción"&gt;GWT - Una introducción&lt;/a&gt;&lt;/strong&gt;&lt;object height="355" id="__sse6307164" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=gwt-101222155552-phpapp01&amp;stripped_title=gwt-u&amp;userName=cptanalatriste" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse6307164" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=gwt-101222155552-phpapp01&amp;stripped_title=gwt-u&amp;userName=cptanalatriste" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/cptanalatriste"&gt;Carlos Gavidia&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Me encargaron en el trabajo realizar una charla introductoria sobre GWT para el equipo. Después de leer durante algunos días -dado que soy un novato en la materia- preparé la presentación que adorna este post. La pongo a disposición de los interesados.&lt;br /&gt;
&lt;br /&gt;
Saludos, y hasta otra!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-1579649963632037023?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/psJppleN0yfzmV9ye2Ya0I2j94U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/psJppleN0yfzmV9ye2Ya0I2j94U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/psJppleN0yfzmV9ye2Ya0I2j94U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/psJppleN0yfzmV9ye2Ya0I2j94U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/1579649963632037023/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=1579649963632037023" title="1 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/1579649963632037023?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/1579649963632037023?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/12/gwt-para-novatos.html" title="GWT para novatos" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;Dk8BRnw_eyp7ImA9Wx9TFkw.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-15760417463538587</id><published>2010-11-24T11:06:00.001-05:00</published><updated>2010-11-24T11:07:37.243-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-24T11:07:37.243-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Eventos" /><title>Spring Community Day 2010</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_5IVIlML8wsI/TO03wSr7HRI/AAAAAAAAAvQ/a8v3NyM14K8/s1600/5203166042_de83d10ab3_z.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_5IVIlML8wsI/TO03wSr7HRI/AAAAAAAAAvQ/a8v3NyM14K8/s320/5203166042_de83d10ab3_z.jpg" width="226" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Creo que debo empezar esto post disculpándome por la ausencia prolongada: He andado tan ocupado últimamente que hasta se han reducido mis horas de sueño. Sin embargo, prometo encontrar espacio para actualizar el blog y evitar que se llene de telarañas. Palabra.&lt;br /&gt;
&lt;br /&gt;
Luego, quería invitar a los lectores peruanos al Spring Community Day 2010 que organiza &amp;nbsp;la comunidad Spring Perú. Habrá ponencias técnicas, presentación de casos prácticos, espacios de discusión y el infaltable coffee break (además, este blogger tendrá a su cargo una charla sobre Spring Web Services xD).&lt;br /&gt;
&lt;br /&gt;
El evento se realizará el 27 de Noviembre (este sábado) en el Campus de la UPC. Para ingresar es necesario colaborar con 10 soles que serán destinados íntegramente a financiar una Misión de Navidad para los niños del Asentamiento Humano San Alvino.&lt;br /&gt;
&lt;br /&gt;
Están todos cordialmente &amp;nbsp;invitados.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-15760417463538587?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/t_0g7SOiRbCMESUSB3cikGWnkbg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/t_0g7SOiRbCMESUSB3cikGWnkbg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/t_0g7SOiRbCMESUSB3cikGWnkbg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/t_0g7SOiRbCMESUSB3cikGWnkbg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/15760417463538587/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=15760417463538587" title="0 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/15760417463538587?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/15760417463538587?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/11/spring-community-day-2010.html" title="Spring Community Day 2010" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_5IVIlML8wsI/TO03wSr7HRI/AAAAAAAAAvQ/a8v3NyM14K8/s72-c/5203166042_de83d10ab3_z.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D08MQHkzfSp7ImA9Wx5WGUs.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-1512328916584840599</id><published>2010-10-01T15:09:00.001-05:00</published><updated>2010-10-01T15:44:41.785-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-01T15:44:41.785-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="En la cancha" /><title>Cohesión y el principio de responsabilidad única</title><content type="html">Imaginemos que nuestro siempre creativo usuario nos solicita un proceso que genere cierto reporte Excel con información de base de datos y se lo coloquemos en un servidor FTP para que lo pueda descargar luego. Dado que -para variar- quiere el reporte para ayer, construimos la siguiente solución apresurada:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_5IVIlML8wsI/TKY_UtCUJZI/AAAAAAAAAvI/7TmUhlNc9CA/s1600/post.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="148" src="http://2.bp.blogspot.com/_5IVIlML8wsI/TKY_UtCUJZI/AAAAAAAAAvI/7TmUhlNc9CA/s320/post.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Diseño improvisado&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;div&gt;Terminamos, el usuario lo prueba, mira que es bueno y nos felicita.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Pasan unos días y el mismo usuario nos pide una aplicación para que pueda colocar algunos documentos PDF en el mismo &amp;nbsp;servidor FTP. ¿Por qué no utilizamos a nuestra clase AdministradorDeReportes junto a su método enviarArchivoFTP()? Podríamos hacerlo, pero nuestra clase para poder ser compilada depende también de POI y de JDBC lo que le daría una carga extra de 5 megas a nuestro sencilla aplicación para PDF's. Esto pone en evidencia que nuestro diseño original tiene algunos problemitas.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;La cuestión es que nuestra clase AdministradorDeReportes tiene la responsabilidad de conectarse a base de datos, de generar un archivo Excel con esta data y de colocar el archivo en el servidor FTP; y si uno quiere reutilizar este componente pues no le queda otra que adquirir el paquete completo de responsabilidades que esta clase posee. ¿Y si queremos otra clase que genere el mismo reporte en HTML en un browser? Sería bastante conveniente utilizar el método obtenerInformacionBD ()de AdministradorDeReportes, pero una vez más tenemos el problema que esta clase tiene dependencias que no necesitamos (ni el API para conexión a FTP ni la generación de Excel). Dado que es obvio que nuestro diseño inicial tiene problemas, corregimos y planteamos lo siguiente:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_5IVIlML8wsI/TKY_emQ8DoI/AAAAAAAAAvM/V7ey5-I4gy8/s1600/post2.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="201" src="http://4.bp.blogspot.com/_5IVIlML8wsI/TKY_emQ8DoI/AAAAAAAAAvM/V7ey5-I4gy8/s320/post2.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Después de recapacitar, planteamos esto&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Con esta nueva solución, la aplicación para transferir archivos PDF solamente debería utilizar la clase ClienteFTP sin la sobrecarga del resto de API's que no necesita; y si se requiere el reporte HTML que planteábamos sólo dependeríamos de la clase ExtractorDeDatos. Este diseño tiene la peculiaridad que nuestras clases están bastante especializadas y tienen una única responsabilidad específica: Por ejemplo, la clase ClienteFTP se ocupa de la conexión con el servidor FTP y nada más. Es esta especialización lo que nos da bastante flexibilidad para la reutilización, que es lo que trata de decirnos &lt;a href="http://www.butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod"&gt;Robert C. Martin&lt;/a&gt; con su &lt;a href="http://en.wikipedia.org/wiki/Single_responsibility_principle"&gt;Principio de Responsabilidad Única&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;i&gt;“Nunca debe de haber más de una razón para que una clase sea modificada”&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;br /&gt;
&lt;/i&gt;&lt;/div&gt;Si vemos nuestro diseño inicial, la clase AdministradorDeReportes debería modificarse si es que se requieren datos extra en el reporte. Esta clase también debería modificarse si quieren que el reporte Excel tenga otros colores. Y si quisiéramos optimizar la conexión con el servidor FTP nuestra clase AdministradorDeReportes también debería pasar por mantenimiento, por lo que tenemos un ejemplo bastante claro de como violentar este principio. Ahora, en nuestra versión mejorada del diseño hemos transferido estas responsabilidades a las clases ExtractorDeDatos, ClienteFTP y ReporteadorExcel; de modo que cada cambio que mencionábamos &amp;nbsp;ahora impacta solamente en una clase de nuestro programa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-1512328916584840599?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VdTrQwvDFZN8sOHYb9TGLYa9oVU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VdTrQwvDFZN8sOHYb9TGLYa9oVU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VdTrQwvDFZN8sOHYb9TGLYa9oVU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VdTrQwvDFZN8sOHYb9TGLYa9oVU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/1512328916584840599/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=1512328916584840599" title="6 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/1512328916584840599?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/1512328916584840599?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/10/cohesion-y-el-principio-de.html" title="Cohesión y el principio de responsabilidad única" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_5IVIlML8wsI/TKY_UtCUJZI/AAAAAAAAAvI/7TmUhlNc9CA/s72-c/post.jpg" height="72" width="72" /><thr:total>6</thr:total></entry><entry gd:etag="W/&quot;C0MMQnc4eip7ImA9Wx5XF00.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-8852792392915931778</id><published>2010-09-16T19:01:00.004-05:00</published><updated>2010-09-17T00:31:23.932-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-17T00:31:23.932-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Certificación IBM" /><category scheme="http://www.blogger.com/atom/ns#" term="IBM Certified Specialist for Rational Requirements Management w/Use Cases" /><title>Casos de uso y descomposición funcional</title><content type="html">Imaginemos que estamos capturando requerimientos para una página web que tiene que incluir un foro. Hablamos con el usuario líder, y nos cuenta que es necesario que &amp;nbsp;el administrador del sistema esté en capacidad de bloquear el acceso a los usuarios que repetidamente muestren un comportamiento inadecuado en el foro (escriban en mayúsculas, resuciten &lt;i&gt;threads &lt;/i&gt;antiguos, utilicen palabras malsonantes y otras exquisiteces de los foristas). Después de la entrevista vamos a nuestra oficina, iniciamos nuestra herramienta CASE y aplicamos la técnica de casos de uso según lo que nos enseñaron en la universidad para producir este diagrama:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_5IVIlML8wsI/TJKtrvc4GsI/AAAAAAAAAu4/NRS9Oyd1I2A/s1600/post.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_5IVIlML8wsI/TJKtrvc4GsI/AAAAAAAAAu4/NRS9Oyd1I2A/s320/post.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Diagrama construido con StarUML&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Esta primera versión tiene algunos inconvenientes. Por definición,&lt;b&gt; un caso de uso debe producir valor para los actores con los que interactúa &lt;/b&gt;(según&lt;a href="http://www.amazon.com/Use-Case-Modeling-Kurt-Bittner/dp/0201709139"&gt; Kurt Bittner&lt;/a&gt;) y no creo que el Administrador encuentre mucho valor a la tarea de "Buscar Usuarios" o de "Mostrar Información de Usuario". A menos que se trate de reportes -y no es el caso- el Administrador del Foro no va a entrar a nuestra aplicación sólamente a realizar una búsqueda o a consultar información de un usuario, sino lo que desea es estar en capacidad de bloquear a los usuarios rebeldes. Por ahí ya tenemos problemas.&lt;br /&gt;
&lt;br /&gt;
Ahora, tal vez nuestra intención inicial de agregar tantos casos era para poner en evidencia que para bloquear a un usuario es necesario primero buscarlo, luego mostrar un formulario con su información básica, después &amp;nbsp;ingresar los motivos por los que se le va a bloquear para finalmente realizar el bloqueo. Si ese fue el caso caimos en otro error, dado que los casos de uso no "invocan" a otros casos de uso y mucho menos se comunican entre ellos. Realizar esto es intentar convertir los casos de uso en funciones, lo que nos lleva al problema de la &lt;b&gt;descomposición funcional:&lt;/b&gt; Descomponer un problema en partes pequeñas y aisladas entre sí, que trabajando juntas nos proveen de una funcionalidad del sistema.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;La descomposición funcional de casos de uso hace que estos &lt;b&gt;pierdan contexto&lt;/b&gt;, como el caso de uso "Asignar motivos de bloqueo" que no tiene sentido sin el resto de casos de uso del diagrama. También está el tema del v&lt;b&gt;alor para los actores&lt;/b&gt; que mencionábamos al inicio, el &amp;nbsp;mismo caso de uso "Asignar motivos de bloqueo" no le va a servir al Administrador si es que el usuario al final no termina bloqueado.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;Ahora ¿qué hacemos para no caer en esto?. Navegando me topé con &lt;a href="http://www.ibm.com/developerworks/rational/library/content/RationalEdge/jan03/UseCaseFAQS_TheRationalEdge_Jan2003.pdf"&gt;un documento de Kurt Bittner&lt;/a&gt; en el que nos sugiere tres cosas:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Centrarse en casos de uso que provean valor real a los stakeholders&lt;/b&gt;. En el caso de nuestra administrador, buscando usuarios no gana mucho.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Limitar el uso de "&lt;i&gt;includes&lt;/i&gt;"&lt;/b&gt; sólamente para representar descripciones comunes entre caso de uso. Y usarlas con muchísimo cuidado.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Limitar el uso de "&lt;i&gt;extends&lt;/i&gt;"&lt;/b&gt; sólamente para agregar comportamientos opcionales a casos de uso existentes que por si mismos generen valor. Personalmente, no me gusta mucho utilizar esta relación.&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;
Entonces, sabiendo esto borramos nuestro primer borrador defectuoso y lo cambiamos por este mucho más simple y elegante:&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_5IVIlML8wsI/TJKvvr5t3vI/AAAAAAAAAvA/mFC7CPsqqEc/s1600/post.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_5IVIlML8wsI/TJKvvr5t3vI/AAAAAAAAAvA/mFC7CPsqqEc/s320/post.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Este diagrama también lo hice con StarUML&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;En la especificación de caso de uso ya podemos explayarnos describiendo el flujo deseado. &amp;nbsp;Recuerden que un modelo de casos de uso es principal y mayoritariamente texto. Eso sería todo en esta entrega, hasta otra!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-8852792392915931778?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_iY7o51oDCFym30XFHFJ8cZ5iN4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_iY7o51oDCFym30XFHFJ8cZ5iN4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_iY7o51oDCFym30XFHFJ8cZ5iN4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_iY7o51oDCFym30XFHFJ8cZ5iN4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/8852792392915931778/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=8852792392915931778" title="3 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/8852792392915931778?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/8852792392915931778?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/09/casos-de-uso-y-descomposicion-funcional.html" title="Casos de uso y descomposición funcional" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_5IVIlML8wsI/TJKtrvc4GsI/AAAAAAAAAu4/NRS9Oyd1I2A/s72-c/post.jpg" height="72" width="72" /><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;DEQFQXk6eip7ImA9Wx5SFEU.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-6545152389089376935</id><published>2010-08-10T19:25:00.000-05:00</published><updated>2010-08-10T19:25:10.712-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-10T19:25:10.712-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="En la cancha" /><title>No hables con extraños, o la Ley de Deméter</title><content type="html">&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_5IVIlML8wsI/TGHrYNFphaI/AAAAAAAAAug/rCHtuzAE3vk/s1600/484px-Paul_Gauguin_111.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_5IVIlML8wsI/TGHrYNFphaI/AAAAAAAAAug/rCHtuzAE3vk/s320/484px-Paul_Gauguin_111.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Imagen: Autorretrato con Sombrero de Paul Gauguin&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Desde los primeros cursos de orientación a objetos de la universidad he escuchado que al programar se debe procurar siempre &lt;i&gt;"niveles bajos de acoplamiento y altos de cohesión"&lt;/i&gt;. Recién ahora que estoy ojeando &lt;a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X"&gt;The Pragmatic Programmer de &amp;nbsp;Andrew Hunt y David Thomas&lt;/a&gt; el tema del acoplamiento me ha quedado claro y quería compartir con ustedes mis hallazgos.&lt;br /&gt;
&lt;br /&gt;
Es más fácil entender este concepto si vemos un programa que no lo aplica. El libro propone este ejemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;i&gt; &amp;nbsp; public void plotDate(Date aDate, Selection aSelection) {&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; TimeZone tz = aSelection.getRecorder().getLocation().getTimeZone();&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; ...&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
La clase que contiene al método &lt;i&gt;plotDate &lt;/i&gt;está altamente acoplada, dado que su estructura actual depende de otras tres clases: &lt;i&gt;Selection&lt;/i&gt;, &lt;i&gt;Recorder &lt;/i&gt;y &lt;i&gt;Location&lt;/i&gt;. Esto nos pone en una situación delicada, dado que un cambio en cualquiera de esas tres clases tendría impacto en nuestro programa. Por ejemplo, si &lt;i&gt;Location &lt;/i&gt;hace que el método &lt;i&gt;getTimeZone &lt;/i&gt;sea privado, nuestro método tendría que redefinirse, y lo mismo pasaría con modificaciones a cualquiera de las otras clases dependientes. Es por eso que se recomienda mantener los niveles de acoplamiento mínimos (es decir, depender del mínimo número de clases) para evitar que las ocurrencias del resto deshagan nuestro trabajo. Si bajamos el nivel de acoplamiento de clase de arriba, nos quedaría algo así:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp;&lt;i&gt;&amp;nbsp; &amp;nbsp; public void plotDate(Date aDate, TimeZone aTz) {&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; ...&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Ahora nuestro método espera que le llegue una instacia de &lt;i&gt;TimeZone &lt;/i&gt;como parámetro y ya no la obtiene desde un objeto Selection. De este modo hemos reducido las dependencias de tres a una clase (sólamente&amp;nbsp;&lt;i&gt;TimeZone&amp;nbsp;&lt;/i&gt;), siendo responsabilidad de la clase cliente la obtención de la instancia de TimeZone que necesitamos. Esta clase cliente nos puede invocar de esta manera:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;i&gt; &amp;nbsp; plotDate(someDate, someSelection.getTimeZone());&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
El libro menciona que los síntomas clásicos de un programa altamente acoplado son que los cambios más simples impactan en componentes que no deberían, y que los programadores se resisten a darle mantenimiento al sistema por miedo a echar a perder algo.&lt;br /&gt;
&lt;br /&gt;
Descrito al problema, ahora toca describir la solución.&lt;br /&gt;
&lt;br /&gt;
La &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Law_of_Demeter"&gt;ley de Deméter&lt;/a&gt;&lt;/b&gt; -inventada en 1987 en la &amp;nbsp;Northeastern University - tiene como objetivo el minimizar las dependencias entre las clases de un programa dado, previniendo el acceso a objetos externos para consumir sus métodos. En resumen, la ley establece lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Cualquier método de un objeto debe invocar solamente a los siguientes métodos:&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;i&gt;Sus propios métodos&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Los métodos de los objetos que ha recibido como parámetros&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Los métodos de los objetos que posee como atributos&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Los métodos de los objetos declarados como variables locales&amp;nbsp;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
Con esto aseguramos el mínimo de dependencias posibles. Los dejo con una imagen extraída del libro que ilustra el concepto:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_5IVIlML8wsI/TGHs8If_xoI/AAAAAAAAAuo/xRf6AY7g5s0/s1600/post.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_5IVIlML8wsI/TGHs8If_xoI/AAAAAAAAAuo/xRf6AY7g5s0/s320/post.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Imagen tomada de The Pragmatic Programmer de Andrew Hunt y David Thomas&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Hasta otra!&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-6545152389089376935?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1wTt8uciFq-BixdLYMlkEO28iWc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1wTt8uciFq-BixdLYMlkEO28iWc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1wTt8uciFq-BixdLYMlkEO28iWc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1wTt8uciFq-BixdLYMlkEO28iWc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/6545152389089376935/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=6545152389089376935" title="0 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/6545152389089376935?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/6545152389089376935?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/08/no-hables-con-extranos-o-la-ley-de.html" title="No hables con extraños, o la Ley de Deméter" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_5IVIlML8wsI/TGHrYNFphaI/AAAAAAAAAug/rCHtuzAE3vk/s72-c/484px-Paul_Gauguin_111.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkEBR307fCp7ImA9Wx5TEUo.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-1051511746282520566</id><published>2010-07-26T15:02:00.002-05:00</published><updated>2010-07-26T15:04:16.304-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-26T15:04:16.304-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="En la cancha" /><title>Código vicioso</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_5IVIlML8wsI/TE3n0cIYxWI/AAAAAAAAAuQ/7jatMl-HolA/s1600/The-Smoker.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_5IVIlML8wsI/TE3n0cIYxWI/AAAAAAAAAuQ/7jatMl-HolA/s320/The-Smoker.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;(Imagen: El Fumador de Vincent Van Gogh)&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="MsoNormal"&gt;El que una aplicación funcione no significa siempre que esté bien construida, y es frecuente que detrás de una bonita y funcional interfaz de usuario se encuentre un pandemónium de líneas de código. Los americanos les llaman a estas joyitas de la programación &lt;i&gt;"code smell"&lt;/i&gt; &amp;nbsp;que vendrían a ser "Cualquier síntoma en el código fuente de un programa que nos indique la presencia probable de un problema mayor" según &lt;a href="http://en.wikipedia.org/wiki/Code_smell"&gt;Wikipedia&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;También en Wikipedia encontramos una pequeña lista de defectos famosos. Les listo algunos que me parecieron interesantes y frecuentes:&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Código duplicado: &lt;/b&gt;Es el producto de una de las más antiguas y populares técnicas de programación: el "copy-paste". A la larga representa un problema serio ya que los cambios que se realicen en una sección de código deben ser replicados en el resto de archivos donde hemos "reutilizado" esta funcionalidad. Para evitarlo podemos extender la clase, o simplemente encapsular esta funcionalidad en un método que sea invocado por los que lo requieren.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Clases extensas: &lt;/b&gt;&lt;a href="http://certified-es.blogspot.com/2010/04/etiqueta-para-programadores.html"&gt;Las convenciones de código en Java &lt;/a&gt;recomiendan que las clases no debe exceder las 2000 líneas. Si ese es el caso, probablemente tu clase esté haciendo más de lo que debería violentando el principio de &lt;a href="http://en.wikipedia.org/wiki/Cohesion_(computer_science)#High_cohesion"&gt;alta cohesión&lt;/a&gt;. Las clases deben tener responsabilidades especializadas, y si nuestro programa cuenta con &lt;a href="http://en.wikipedia.org/wiki/God_object"&gt;Objetos-Dios&lt;/a&gt; que hacen de todo es que tenemos un serio problema de diseño.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Envidia funcional:&lt;/b&gt; Sucede cuando una clase utiliza en exceso los métodos de otra clase. Imaginémonos una clase &lt;i&gt;ClaseEnvidiosa &lt;/i&gt;que tiene un método &lt;i&gt;calcularPromedio&lt;/i&gt;(). En &lt;i&gt;calcularPromedio&lt;/i&gt;(), invoca al método &lt;i&gt;obtenerNumeroDeCursos&lt;/i&gt;() de la clase Estudiante. Luego, invoca a &lt;i&gt;obtenerCalificacion&lt;/i&gt;(int i) de Estudiante &amp;nbsp;varias veces para sumar todos los valores obtenidos y al resultado dividirlo entre el número de cursos que obtuvo anteriormente. Finalmente, invoca a &lt;i&gt;setPromedio&lt;/i&gt;(double d) de Estudiante y le asigna el valor calculado. Se observa que &lt;i&gt;ClaseEnvidiosa &lt;/i&gt;invoca en exceso a los métodos de &lt;i&gt;Estudiante &lt;/i&gt;desde el método &lt;i&gt;calcularPromedio&lt;/i&gt;(), cuando lo más práctico es que el método &lt;i&gt;calcularPromedio&lt;/i&gt;() se encuentre en la misma clase &lt;i&gt;Estudiante&lt;/i&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Complejidad artificial:&lt;/b&gt; Utilizar en exceso patrones de diseño cuando es suficiente con un diseño sencillo. Recuerdo una aplicación donde el controlador &lt;i&gt;Struts&lt;/i&gt; invocaba&amp;nbsp; a un &lt;i&gt;Facade&lt;/i&gt;, que a su vez invocaba a un &lt;i&gt;BusinessDelegate &lt;/i&gt;que mediante un &lt;i&gt;EJB &lt;/i&gt;hacía uso de una clase &lt;i&gt;DAO &lt;/i&gt;que finalmente invocaba a un procedimiento almacenado. Y lo único que se hacía en cada capa de la aplicación &amp;nbsp;era pasar los parámetros a la capa inferior, hasta llegar al DAO que era el que realmente hacía el trabajo. ¿No era más sencillo contar con un &lt;i&gt;Facade &lt;/i&gt;y que éste invoque al &lt;i&gt;DAO &lt;/i&gt;directamente?&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Clase ociosa: &lt;/b&gt;Cuando una clase hace &amp;nbsp;muy poco. Por ejemplo, una clase con un sólo método que es invocado solamente por una clase. Tampoco hay que llevar lo de alta cohesión a extremos y para estas situaciones recomendaría que la funcionalidad de la clase ociosa sea absorbida por otra clase más robusta.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;o:p&gt;&amp;nbsp;Wikipedia señala más, pero esas son las que he encontrado (o he incurrido xD). Hasta otra!&lt;/o:p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-1051511746282520566?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zUmVrQzrY8S-sfGv19QTAnlrTqo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zUmVrQzrY8S-sfGv19QTAnlrTqo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zUmVrQzrY8S-sfGv19QTAnlrTqo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zUmVrQzrY8S-sfGv19QTAnlrTqo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/1051511746282520566/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=1051511746282520566" title="2 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/1051511746282520566?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/1051511746282520566?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/07/codigo-vicioso.html" title="Código vicioso" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_5IVIlML8wsI/TE3n0cIYxWI/AAAAAAAAAuQ/7jatMl-HolA/s72-c/The-Smoker.jpg" height="72" width="72" /><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CkUNQHk6fyp7ImA9WxFUFEU.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-9083056717528470869</id><published>2010-06-14T11:27:00.004-05:00</published><updated>2010-06-25T10:38:11.717-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-25T10:38:11.717-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="En la cancha" /><title>Pereza, impaciencia y soberbia</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_5IVIlML8wsI/TBZXDzNAEeI/AAAAAAAAAuI/nwIBaj9vvPA/s1600/Manuel+Tols%C3%A1+Fe_esperanza_y_caridad.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_5IVIlML8wsI/TBZXDzNAEeI/AAAAAAAAAuI/nwIBaj9vvPA/s320/Manuel+Tols%C3%A1+Fe_esperanza_y_caridad.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;b&gt;&lt;i&gt;(Imagen: Fé, esperanza y caridad. Esculturas de Manuel Tolsá en la Catedral de México)&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://es.wikipedia.org/wiki/Larry_Wall"&gt;Larry Wall&lt;/a&gt; es conocido en el medio por ser el creador de Perl y por ser el autor de &lt;a href="http://oreilly.com/catalog/9780596000271/?CMP=OTC-KW7501011010&amp;amp;ATT=9780596000271"&gt;Programming Perl&lt;/a&gt;, el libro de referencia de este lenguaje.&lt;br /&gt;
&lt;br /&gt;
En este libro, Wall le sugiere a los lectores que desarrollen las que -según el- son las tres grandes virtudes de todo gran programador: Pereza, Impaciencia y Soberbia.&lt;br /&gt;
&lt;br /&gt;
El programador &lt;b&gt;perezoso &lt;/b&gt;detesta hacer lo mismo dos veces, es por eso que procura siempre que el código que produzca sera reutilizable. Asimismo, el programador perezoso procura documentar siempre para evitar la molestia de tener que explicar sus programas al resto del equipo.&lt;br /&gt;
&lt;br /&gt;
El programador &lt;b&gt;impaciente &lt;/b&gt;no soporta estar mucho tiempo sin hacer nada. Es por eso que los programadores impacientes siempre están construyendo programas que quizás no necesiten ahora pero que con certeza necesitarán en el futuro.&lt;br /&gt;
&lt;br /&gt;
Por último, los programadores &lt;b&gt;soberbios&amp;nbsp;&lt;/b&gt;no toleran ser criticados. Para evitar críticas y burlas, los programadores soberbios producen código de calidad de modo que sólamente reciban elogios por su trabajo.&lt;br /&gt;
&lt;br /&gt;
Voy a tener que tomar esto bastante en cuenta al momento de buscar personal. Tal vez deberíamos poner un anuncio que diga &lt;i&gt;"Se solicitan desarrolladores perezosos, impacientes y soberbios. De no cumplir los requisitos, favor abstenerse"&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Hasta otra!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-9083056717528470869?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JtXDnfpP4jsFjrbk6aW8p2ppghM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JtXDnfpP4jsFjrbk6aW8p2ppghM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JtXDnfpP4jsFjrbk6aW8p2ppghM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JtXDnfpP4jsFjrbk6aW8p2ppghM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/9083056717528470869/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=9083056717528470869" title="2 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/9083056717528470869?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/9083056717528470869?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/06/pereza-impaciencia-y-orgullo.html" title="Pereza, impaciencia y soberbia" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_5IVIlML8wsI/TBZXDzNAEeI/AAAAAAAAAuI/nwIBaj9vvPA/s72-c/Manuel+Tols%C3%A1+Fe_esperanza_y_caridad.jpg" height="72" width="72" /><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;A04FRn49cSp7ImA9WxFVEk8.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-1591453982122639776</id><published>2010-06-09T16:40:00.016-05:00</published><updated>2010-06-10T23:18:37.069-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-10T23:18:37.069-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="En la cancha" /><title>Errare humanum est</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_5IVIlML8wsI/TBAJKhddABI/AAAAAAAAAtg/NOpqVHKEnsE/s1600/post.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_5IVIlML8wsI/TBAJKhddABI/AAAAAAAAAtg/NOpqVHKEnsE/s320/post.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif; font-size: 13px; font-style: italic; font-weight: bold; line-height: 20px;"&gt;(Imagen:&amp;nbsp;&lt;a href="http://geekandpoke.typepad.com/" style="color: #003366; text-decoration: none;"&gt;Geek and Poke de Oliver Widder&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Nadie es perfecto, ni siquiera los programadores, y mucho menos los programas que hacemos. Es por eso que son necesarios nuestros amigos de control de calidad, para decirnos - con cortesía- que nos hemos equivocado pero solicitando con insistencia que arreglemos lo que detectaron. &amp;nbsp;Sin embargo, la gente de control de calidad tampoco es perfecta y sucede con frecuencia que nuestros errores &amp;nbsp;(o &lt;i&gt;bugs&lt;/i&gt;, en argot del programador) llegan hasta el usuario final, que suele reaccionar muy mal cuando algo no funciona como quiere:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-style: italic;"&gt;"Estimado Perico: Nada en el sistema funciona como me dijeron que iba a funcionar y no puedo trabajar con un sistema en estas condiciones. Cuando trabajábamos con el sistema en Cobol no teníamos este tipo de problemas."&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Correos de esa naturaleza llegan a la bandeja de los desarrolladores, incluyendo a Jefes de Proyecto, Gerentes y demás interesados entre los destinatarios. Ahora, si el programador es novato y la gente de calidad es despistada este tipo de correos puede crecer en número y frecuencia; dejándonos con la bandeja de entrada llena y muchos bugs sin control.&lt;br /&gt;
&lt;br /&gt;
Es por eso que todo equipo de desarrollo necesita &lt;b&gt;una base de datos de bugs&lt;/b&gt; para tener control del estado de la aplicación: saber cuánto hemos reparado, cuánto nos falta reparar y quién está haciendo ese trabajo. Puse base de datos en negrita porque dada la importancia de esta tarea no podemos confiar en hojas excel ni archivos txt (aquí donde trabajo lo hemos intentado y hemos fracasado rotundamente).&amp;nbsp;Ahora en la empresa estamos empezando a &amp;nbsp;usar &lt;a href="http://www.bugzilla.org/"&gt;Bugzilla &lt;/a&gt;para el control de errores, y nos está yendo bien: es bastante completo y además es gratuito :D.&lt;br /&gt;
&lt;br /&gt;
Quería comentarles también que gracias a la recomendación de un compañero de trabajo -asiduo lector de este modesto blog- llegué a&lt;a href="http://www.joelonsoftware.com/articles/fog0000000029.html"&gt; un artículo de Joel Spolsky&lt;/a&gt; sobre sistemas de &amp;nbsp;reporte y control de incidencias. Les listo algunas ideas que me parecieron interesantes:&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;Un buen reporte de bugs debe tener 3 partes: Pasos para reproducir el bug, resultado esperado y resultado real.&lt;/b&gt; Por lo general los usuarios mandan correos poco descriptivos ( del tipo "¡nada funciona!", o con un screenshot y el asunto de "Arréglalo"). En el sistema de &amp;nbsp;reporte de errores (como nuestro Bugzilla) se debe registrar toda la información necesaria para que el programador pueda hacer su trabajo.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;Los bugs deben ser responsabilidad de una persona.&lt;/b&gt; En otras palabras, en todo momento debemos saber quien se está haciendo cargo del bug. Inicialmente puede estar asignado al Jefe de Proyecto, que puede derivarlo al Desarrollador Perico que luego lo asigna al Desarrollador Paco debido a que el error era en el módulo que él desarrolló. Siempre se debe conocer al responsable del bug, de modo que podamos echarle la culpa cuando persista el error xD.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;Sólo el que reporta el bug puede cerrar el bug.&lt;/b&gt; Porque sólamente el que registró el bug sabe a ciencia cierta que es lo que estaba mal. Una vez que el desarrollador termine de construir la solución, el registrador del bug (que puede ser personal de Control de Calidad o Usuarios finales) debe dar el visto bueno. Caso contrario, a continuar con las reparaciones xD.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;El sistema de registro de bugs debe ser masivamente usado.&lt;/b&gt; Para esto, Spolsky nos da algunos tips: Si eres desarrollador, sólamente repara bugs que te han asignado por el sistema. Si eres personal de Control de Calidad, sólamente reporta bugs por el sistema. Si eres Jefe de Proyecto, asigna bugs a tus desarrolladores por el sistema. De esa manera dejaremos de usar excel y emails para pasar a algo más organizado.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;ol&gt;&lt;/ol&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
En todos estos puntos Bugzilla nos va a ser de ayuda. Ojalá nos funcione: si le funcionó &lt;a href="http://www.bugzilla.org/installation-list/"&gt;a Facebook y a la NASA&lt;/a&gt; creo que a nosotros nos puede ser útil xD.&lt;br /&gt;
&lt;br /&gt;
Hasta otra!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-1591453982122639776?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Xj85RiY7GfV8iB1kGuDb_BusPZM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Xj85RiY7GfV8iB1kGuDb_BusPZM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Xj85RiY7GfV8iB1kGuDb_BusPZM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Xj85RiY7GfV8iB1kGuDb_BusPZM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/1591453982122639776/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=1591453982122639776" title="7 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/1591453982122639776?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/1591453982122639776?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/06/errare-humanum-est.html" title="Errare humanum est" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_5IVIlML8wsI/TBAJKhddABI/AAAAAAAAAtg/NOpqVHKEnsE/s72-c/post.jpg" height="72" width="72" /><thr:total>7</thr:total></entry><entry gd:etag="W/&quot;C0IDQ345fSp7ImA9WxFWGE0.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-1395530855053334876</id><published>2010-06-04T11:17:00.005-05:00</published><updated>2010-06-06T00:19:32.025-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-06T00:19:32.025-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="En la cancha" /><title>A propósito del Pair Programming</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_5IVIlML8wsI/TAkksT7uvVI/AAAAAAAAAtY/XDYkZk4bZOI/s1600/pair_programming.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_5IVIlML8wsI/TAkksT7uvVI/AAAAAAAAAtY/XDYkZk4bZOI/s320/pair_programming.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;i&gt;&lt;br /&gt;
&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;(Imagen: &lt;a href="http://geekandpoke.typepad.com/"&gt;Geek and Poke de Oliver Widder&lt;/a&gt;)&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;i&gt;Programador&lt;/i&gt;: Entonces, estamos de acuerdo. En las líneas pares alineamos mediante &lt;i&gt;tabs&lt;/i&gt;, y en las impares con espacios en blanco. En las sentencias "&lt;i&gt;if"&amp;nbsp;&lt;/i&gt;abrimos llaves en la misma línea, y en los bucles "&lt;i&gt;for&lt;/i&gt;" lo hacemos en la línea siguiente. Ahora... ¿Cómo hacemos con los bucles "&lt;i&gt;do&lt;/i&gt;" y "&lt;i&gt;while&lt;/i&gt;"?&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Nota al pie:&lt;/i&gt; Programación en pareja&lt;/li&gt;
&lt;/ul&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;(Traducción libre)&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Sobre cómo el&lt;a href="http://certified-es.blogspot.com/2010/05/el-amigo-elegido.html"&gt; pair programming&lt;/a&gt; no siempre es una buena idea (y la necesidad de establecer&amp;nbsp;&lt;a href="http://certified-es.blogspot.com/2010/04/etiqueta-para-programadores.html"&gt;convenciones de código&lt;/a&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-1395530855053334876?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IGUK187rLJIUbv7-7gZz-JIoqWM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IGUK187rLJIUbv7-7gZz-JIoqWM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IGUK187rLJIUbv7-7gZz-JIoqWM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IGUK187rLJIUbv7-7gZz-JIoqWM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/1395530855053334876/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=1395530855053334876" title="0 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/1395530855053334876?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/1395530855053334876?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/06/proposito-del-pair-programming.html" title="A propósito del Pair Programming" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_5IVIlML8wsI/TAkksT7uvVI/AAAAAAAAAtY/XDYkZk4bZOI/s72-c/pair_programming.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEIDQ3c_cCp7ImA9WxFWE0w.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-3263906188185016209</id><published>2010-05-29T23:57:00.005-05:00</published><updated>2010-05-31T08:29:32.948-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-31T08:29:32.948-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="En la cancha" /><title>El Síndrome del estudiante</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_5IVIlML8wsI/TAHv0fJtkhI/AAAAAAAAAtQ/3_nMQxH55mg/s1600/phdcomics.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_5IVIlML8wsI/TAHv0fJtkhI/AAAAAAAAAtQ/3_nMQxH55mg/s320/phdcomics.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;(Imagen: &lt;/i&gt;&lt;/b&gt;&lt;a href="http://www.phdcomics.com/"&gt;&lt;b&gt;&lt;i&gt;Piled Higher and Deeper de Jorge Cham&lt;/i&gt;&lt;/b&gt;&lt;/a&gt;&lt;b&gt;&lt;i&gt;)&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Érase una vez un proyecto de software, y érase también un jefe de proyecto que estaba elaborando su cronograma. Como era un buen jefe de proyecto, siempre consultaba a los &amp;nbsp;desarrolladores antes de realizar estimaciones:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;- Dime Perico ¿Cuánto te tomaría construir este componente?&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Perico sabía que componentes similares le habían tomado un día. Pero Perico estaba aún en la universidad y necesitaba a veces algunas horas de trabajo para avanzar ciertas tareas. Siendo consiente de esto, Perico respondió:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;- Jefe, este componente como mínimo me toma dos días&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
El jefe de proyecto entonces agregó a su cronograma la actividad "Construcción de componente", la asignó a Perico y le colocó un tiempo de dos días. Sin embargo, recordó que el proyecto era para un cliente nuevo cuya plataforma no le era familiar al equipo, y mucho menos a Perico. El jefe de proyecto lo pensó mucho, y al final le asignó cuatro días al componente de Perico, dado que uno nunca sabe lo que puede pasar.&lt;br /&gt;
&lt;br /&gt;
El Jefe de Proyecto hizo esto para todas las actividades del proyecto, y le entregó el cronograma al Gerente de Desarrollo. El Gerente observó el cronograma y se sorprendió del poco tiempo del proyecto. Además, históricamente los proyectos de nuestro Jefe de Proyecto siempre se atrasaban, por lo que como medida preventiva le agregó un día a todas las actividades. Hecho esto, le hizo llegar el cronograma al cliente, junto con el costo del proyecto.&lt;br /&gt;
&lt;br /&gt;
El cliente recibió el cronograma. Le pareció un tiempo prudente, y por tratarse de un cliente importante el costo no significaba ningún problema para él. Aprobó el cronograma, firmaron lo que tenían que firmar y el proyecto empezó a caminar.&lt;br /&gt;
&lt;br /&gt;
Cuando a Perico le hicieron llegar el cronograma, lo primero que notó fue que para hacer un componente -bastante simple a su criterio- le habían asignado cinco días. Perico tomó esto con bastante alegría dado que la universidad le estaba consumiendo bastante tiempo. Siendo lunes, Perico pensó:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;- Voy a estudiar los cursos de la universidad hasta el martes, y el miércoles comienzo a hacer este insignificante componente&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Y así lo hizo, estudió mucho hasta el martes y el miercoles comenzó con el componente. Hizo lo que siempre hacía cuando se trataba de esos componentes. Al finalizar el miércoles lo tenía listo, para alegría de Perico y del Jefe de Proyecto.&lt;br /&gt;
&lt;br /&gt;
El jueves desplegaron el componente en los servidores de prueba del cliente; y como el jefe de proyecto había previsto, no el componente no funcionaba como debería.&lt;br /&gt;
&lt;br /&gt;
Se lo hicieron saber a Perico, y se pasó todo el jueves tratando de descubrir porqué el componente funcionaba en su computadora y no en los servidores del cliente (que usaban un software que ni Perico ni el Jefe de Proyecto habían visto antes).&lt;br /&gt;
&lt;br /&gt;
Perico leyó todo el jueves y también el viernes. Más o menos a las ocho de la noche ya tenía una idea de lo que tenía que hacer, y eso implicaba hacer el componente de nuevo. Con mucha verguenza, Perico le confesó a su jefe que necesitaba dos días más. Con más verguenza que Perico, el Jefe de Proyecto le informó de esto al Gerente de Proyectos, quien se enojó bastante pero se sorprendió muy poco: Los proyectos de nuestro Jefe de Proyectos siempre se atrasaban a pesar de lo holgado de su cronograma.&lt;br /&gt;
&lt;br /&gt;
¿Les suena familiar? A mi me ha pasado un montón de veces, y es un ejemplo clásico del &lt;a href="http://es.wikipedia.org/wiki/S%C3%ADndrome_del_estudiante"&gt;Síndrome del estudiante&lt;/a&gt; (no creo que sea necesario explicar el porqué del nombre xD) : Las personas empiezan a dedicarse al máximo a las tareas asignadas recién unos días antes de la fecha límite. Esto lleva a un desperdicio de la holgura que uno pueda considerar al momento de estimar tiempos de tareas. Fue descrito por &lt;a href="http://www.amazon.com/Critical-Chain-Eliyahu-M-Goldratt/dp/0884271536"&gt;Eliyahu M. Goldratt en su libro "Cadena crítica"&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
El Síndrome ya lo conocía por experiencia propia, pero me lo presentaron formalmente hoy en el curso de Gestión de Proyectos Informáticos. Cuando el profesor nos diga el antídoto, se los hago saber.&lt;br /&gt;
&lt;br /&gt;
Hasta otra!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-3263906188185016209?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NHP-6JqmIgmJxZrOcpIY3OrEqDA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NHP-6JqmIgmJxZrOcpIY3OrEqDA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NHP-6JqmIgmJxZrOcpIY3OrEqDA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NHP-6JqmIgmJxZrOcpIY3OrEqDA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/3263906188185016209/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=3263906188185016209" title="8 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/3263906188185016209?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/3263906188185016209?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/05/el-sindrome-del-estudiante.html" title="El Síndrome del estudiante" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_5IVIlML8wsI/TAHv0fJtkhI/AAAAAAAAAtQ/3_nMQxH55mg/s72-c/phdcomics.gif" height="72" width="72" /><thr:total>8</thr:total></entry><entry gd:etag="W/&quot;C0QGQ3w5eCp7ImA9WxFQFk4.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-2554195671543641482</id><published>2010-05-11T20:02:00.001-05:00</published><updated>2010-05-11T21:28:42.220-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-11T21:28:42.220-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="En la cancha" /><title>El amigo elegido</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_5IVIlML8wsI/S-n9iJ4HG0I/AAAAAAAAAs0/k3872u2Sqec/s1600/batman_robin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_5IVIlML8wsI/S-n9iJ4HG0I/AAAAAAAAAs0/k3872u2Sqec/s320/batman_robin.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Una vez trabajé con un programador que disfrutaba viendo programar a los demás. Podía observar por horas a su programador objetivo sin que este tenga la más mínima idea de que su código estaba siendo escrutado al milímetro. Eso sí, si no entendía alguna línea de código o detectaba algún &lt;i&gt;bug &lt;/i&gt;no tenía ningún reparo en interrumpirte, lo que llegaba a ser molesto si es que esto sucedía muy a menudo.&lt;br /&gt;
&lt;br /&gt;
Me acuerdo de esto debido a que hace un tiempo en una reunión de la empresa mencionaron que tenían planes de implementar una política de&lt;i&gt;&lt;a href="http://en.wikipedia.org/wiki/Pair_programming"&gt; pair programming&lt;/a&gt;&lt;/i&gt;. Esto implica que vas a ser observado mientras programas, y vas a tener observar programar a alguien: dos desarrolladores construyendo el mismo código en una sola estación de trabajo.&lt;br /&gt;
&lt;br /&gt;
Son pocas las ocasiones en las que he tenido otros ojos -aparte de los míos- sobre el código que produzco. Las que más recuerdo son la del programador &lt;i&gt;voyeur &amp;nbsp;&lt;/i&gt;mencionado al inicio del post&lt;i&gt;&amp;nbsp;&lt;/i&gt;y una funcionalidad bastante compleja que nos encargaron a dos programadores bastante novatos (que éramos entonces). Era tan difícil y nos causó tantos problemas que le llamábamos &lt;a href="http://es.wikipedia.org/wiki/Coco_(folclore)"&gt;"El Cuco"&lt;/a&gt;. Fue necesario juntar lo poco que los dos sabíamos para sacar el requerimiento adelante, y nos pasábamos bastante tiempo conversando sobre el código que uno de los dos escribía.&lt;br /&gt;
&lt;br /&gt;
Valgan verdades, durante el desarrollo del Cuco aprendí bastante, y si algo le debo reconocer al&lt;i&gt; Pair Programming&lt;/i&gt; es que es una manera eficiente de distribuir el conocimiento entre desarrolladores. Por otro lado, en muchas ocasiones el programador sigiloso me hizo notar errores que tuve que corregir y no llegaron a producción, por lo que la calidad de lo desarrollado aumentó.&lt;br /&gt;
&lt;br /&gt;
Ahora, si vemos el vaso medio vacío, hay gente que por su personalidad trabaja mejor sola y no va a aceptar de ninguna manera que les pongas un compañero al costado (ni aunque se trate de &lt;a href="http://pastamanvibration.files.wordpress.com/2008/07/allison-stokke11.jpg"&gt;Allison Stokke&lt;/a&gt;).Además, si pones a programar a tu desarrollador Senior junto al Junior a largo plazo vas a tener otro desarrollador experto, pero a corto plazo estás perdiendo software de calidad que el desarrollador senior podría estar produciendo en vez de andar de profesor. Esos costos deben evaluarse. Y... ¿que pasaría si pones a trabajar juntos a dos desarrolladores senior? Podrían construir software maravilloso, como podrían terminar peleando y acusándose mutuamente de incompetentes (por lo general los buenos programadores son bastante orgullosos).&lt;br /&gt;
&lt;br /&gt;
Definitivamente, si dos programadores van a trabajar juntos sus personalidades deben ser compatibles para que se toleren mutuamente 8 horas al día (que en nuestro sector por lo general suelen ser muchas más). &amp;nbsp;&lt;a href="http://www.codinghorror.com/blog/2009/02/whos-your-coding-buddy.html"&gt;Jeff Atwood en su blog &lt;/a&gt;postula que todos los desarrolladores deberían tener un amigo programador (el les llama &lt;i&gt;coding buddy&lt;/i&gt;), con el que se tenga la confianza suficiente como para compartir código y aceptar sugerencias. También menciona que debe ser una persona con un gusto por la programación similar al tuyo, y al que respetes y sobre todo admires profesionalmente. Ahora, se espera que una persona con estas características trabaje contigo, caso contrario Atwood te recomienda renunciar. Este sistema del "amigo programador" sería algo así como un&lt;i&gt; pair programming&lt;/i&gt; informal y de mutuo acuerdo.&lt;br /&gt;
&lt;br /&gt;
A la fecha no han vuelto a mencionar de nuevo lo del &lt;i&gt;Pair Programming&lt;/i&gt; en mi compañía. Hasta entonces, sigo programando como el Llanero Solitario xD.&lt;br /&gt;
&lt;br /&gt;
Hasta otra!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-2554195671543641482?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dqHvID0q1LTl01XyWiAn3MKUFFA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dqHvID0q1LTl01XyWiAn3MKUFFA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dqHvID0q1LTl01XyWiAn3MKUFFA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dqHvID0q1LTl01XyWiAn3MKUFFA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/2554195671543641482/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=2554195671543641482" title="3 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/2554195671543641482?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/2554195671543641482?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/05/el-amigo-elegido.html" title="El amigo elegido" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_5IVIlML8wsI/S-n9iJ4HG0I/AAAAAAAAAs0/k3872u2Sqec/s72-c/batman_robin.png" height="72" width="72" /><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;A04CQHozfyp7ImA9WxFRFk4.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-6332217243614276594</id><published>2010-04-29T12:22:00.005-05:00</published><updated>2010-04-30T10:06:01.487-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-30T10:06:01.487-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="En la cancha" /><title>A propósito de la Ley de Brooks</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/80000/8000/300/88361/88361.strip.print.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="99" src="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/80000/8000/300/88361/88361.strip.print.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;(Imagen: &lt;a href="http://dilbert.com/"&gt;Dilbert de Scott Adams&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;i&gt;Jefe&lt;/i&gt;: ¿Cuánto demoraría tu proyecto si le agregamos dos personas?&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Dilbert&lt;/i&gt;: Añádele un mes de entrenamiento, un mes por la complejidad generada y uno más para controlar el drama&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Jefe&lt;/i&gt;: Pero después de todo eso...&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Dilbert&lt;/i&gt;: Ellos serán tan productivos como esta reunión.&lt;/li&gt;
&lt;/ul&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;(Traducción libre)&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;Definitivamente, Dilbert en tres viñetas dice mucho más que &lt;a href="http://certified-es.blogspot.com/2010/01/una-fabula.html"&gt;mi post&lt;/a&gt; xD.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-6332217243614276594?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6_g-thlbZSstUEL7JJlMizJqgg8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6_g-thlbZSstUEL7JJlMizJqgg8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6_g-thlbZSstUEL7JJlMizJqgg8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6_g-thlbZSstUEL7JJlMizJqgg8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/6332217243614276594/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=6332217243614276594" title="0 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/6332217243614276594?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/6332217243614276594?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/04/proposito-de-la-ley-de-brooks.html" title="A propósito de la Ley de Brooks" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEcER3c_fCp7ImA9WhRWGU8.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-3943763595890263197</id><published>2010-04-26T20:08:00.008-05:00</published><updated>2012-01-07T02:40:06.944-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-07T02:40:06.944-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="En la cancha" /><title>En busca del programador perdido</title><content type="html">&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;a href="http://2.bp.blogspot.com/_5IVIlML8wsI/S9Y3DVEwXUI/AAAAAAAAAss/w3Vs0x-IorQ/s1600/post.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_5IVIlML8wsI/S9Y3DVEwXUI/AAAAAAAAAss/w3Vs0x-IorQ/s320/post.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
La entrevista de trabajo en la que me fue peor fue para la empresa en la que trabajo ahora. Las entrevistas a las que estaba acostumbrado eran con señores enternados de mediana edad, que me preguntaban sobre lo que había estudiado, lo que mejor sabía y lo que había hecho. Convérsabamos unos minutos, me contaban lo que haría en caso de ingresar y me despedían con una sonrisa. En algunas ocasiones me tomaban un examen técnico escrito, y en el peor de los casos un test psicológico (que es todo un rollo que ya contaré). Sin embargo esa vez, fue diferente:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;-Hola Carlos, mucho gusto. Necesitamos que hagas un mantenimiento a una tabla. Tienes una hora.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Me dijo en ese entonces el que sería mi jefe, un ingeniero un poco mayor que yo vestido de forma casual. La IDE que tenía que usar era el &lt;a href="http://www-01.ibm.com/software/awdtools/developer/application/"&gt;IBM RAD&lt;/a&gt;, que nunca había visto antes; y tenía que conectarme a una base de datos &lt;a href="http://www-01.ibm.com/software/data/informix/"&gt;Informix&lt;/a&gt;, cuya existencia me enteré el día de la entrevista. Mi futuro jefe me ofreció una clase de Conexión a Base de Datos, que cuando agregué al IDE estaba llena de errores de compilación. No tenía internet, y como me había dicho, tenía solamente una hora.&lt;br /&gt;
&lt;br /&gt;
Depuré la clase de conexión y comencé a construir el mantenimiento con mis casi inexistentes conocimientos de IBM RAD. Cuando la señorita de recursos humanos me dijo que el tiempo había terminado, sólamente tenía listo el registro y la eliminación. Salí bastante triste, dado que un amigo mío me había recomendado y había hecho un soberano papelón. Para sorpresa mía, me llamaron a los pocos días, por lo que asumí que fue el lobby de amigo lo que me había hecho ingresar.&amp;nbsp;Después me vine a enterar que mi mediocre examen fue uno de los mejores (y que no entré a la empresa por tráfico de influencias) por lo que me había hecho merecedor del puesto.&lt;br /&gt;
&lt;br /&gt;
Pasó el tiempo, y de evaluado pasé a evaluador. En efecto, ningún postulante podía hacer el bendito mantenimiento, ni siquiera un solo método operativo. Relajamos un poco el asunto y dimos hora y media de tiempo. Nada, ni siquiera el EAR desplegado. Cambiamos a Oracle -un DBMS más popular por estos lares- e instalamos IDE's a gusto del postulante (Eclipse y Netbeans). Ninguno podía terrminar. Cuando habilitamos el uso de Internet ya las cosas comenzaron a mejorar; pero aún así nos topábamos frecuentemente con programadores que no pueden hacer el mantenimiento de una tabla de 5 campos.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.codinghorror.com/blog/"&gt;Jeff Atwood&lt;/a&gt; -en su artículo &lt;a href="http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html"&gt;Why can't programmers... program?&lt;/a&gt;- señala que en USA se vive una problemática similar, y que buscar un programador competente se ha hecho una tarea difícil. Señala que emplean muchas horas entrevistando a gente que no tiene la más mínima noción de lo que es programar. En ese mismo artículo cita a Isram, que en su blog propone el &lt;a href="http://imranontech.com/2007/01/24/using-fizzbuzz-to-find-developers-who-grok-coding/"&gt;siguiente problema a los postulantes para verificar sus habilidades:&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Escriba un programa que imprima los números del 1 al 100. Para los múltiplos de tres imprima "Fizz" en vez del número, y para los múltiplos de cinco escriba "Buzz". Para los números que son múltiplos de tres y cinco escriba "FizzBuzz".&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Según el autor, la mayoría de graduados de ciencias de la computación demoran más de 15 minutos en la solución o simplemente no pueden hacerlo (tal vez por eso en Estados Unidos en desarrollo de software tercericen tanto) . Por otro lado, Joel Spolsky sostiene que en toda entrevista a desarrolladores &lt;a href="http://certified-es.blogspot.com/2010/03/el-test-de-joel-para-equipos-de.html"&gt;se debe exigir codificar&lt;/a&gt;.&amp;nbsp; Parece sensato, y yo creo que si le hacemos caso nos aseguramos el descartar a los que no puedan con la pregunta FizzBuzz xD.&lt;br /&gt;
&lt;br /&gt;
Hasta otra!&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-3943763595890263197?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/blqOBqTKQ_Yz1paMm5BrHN6vyXg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/blqOBqTKQ_Yz1paMm5BrHN6vyXg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/blqOBqTKQ_Yz1paMm5BrHN6vyXg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/blqOBqTKQ_Yz1paMm5BrHN6vyXg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/3943763595890263197/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=3943763595890263197" title="5 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/3943763595890263197?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/3943763595890263197?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/04/en-busca-del-programador-perdido.html" title="En busca del programador perdido" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_5IVIlML8wsI/S9Y3DVEwXUI/AAAAAAAAAss/w3Vs0x-IorQ/s72-c/post.jpg" height="72" width="72" /><thr:total>5</thr:total></entry><entry gd:etag="W/&quot;CEYDSXc_eSp7ImA9WxFSF08.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-113144753442340425</id><published>2010-04-19T15:45:00.013-05:00</published><updated>2010-04-19T19:09:38.941-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-19T19:09:38.941-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="En la cancha" /><title>Etiqueta para programadores</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_5IVIlML8wsI/S8y9MA6bheI/AAAAAAAAAsk/XRdeAc2-OSA/s1600/post.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_5IVIlML8wsI/S8y9MA6bheI/AAAAAAAAAsk/XRdeAc2-OSA/s320/post.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Recuerdo que en la universidad existía un curso electivo de "Protocolo", donde te instruían en las buenas maneras en el comer y el actuar. La evaluación final era asistir a una cena de gala en una embajada y no hacer quedar mal a la profesora xD .&lt;br /&gt;
&lt;br /&gt;
Citando a&amp;nbsp;&lt;a href="http://www.otrastardes.com/2008/02/26/frieda-holler/"&gt;Frieda Holler&lt;/a&gt;, la etiqueta tiene que ver bastante con el respeto, &amp;nbsp;y saber como comportarse demuestra consideración con los demás. Y así como es necesario ser educado a la hora de comer, hay que saber también ser correcto al momento de programar. Codificar de manera ordenada y clara es una muestra de respeto hacia el programador que va a dar mantenimiento a lo que has construido. No indentar, por ejemplo, puede ser considerado una malcriadez.&lt;br /&gt;
&lt;br /&gt;
Ningún profesor en la universidad me mencionó que existían convenciones de programación, así que en mis primeros años era bastante salvaje al codificar.&amp;nbsp;Cuando entré a trabajar, el código desordenado -pero funcional- que en la universidad me hubiera valido un 20 era devuelto por el área de Arquitectura indicándome que indente, que comente y que&amp;nbsp;siga los estándares. De rechazo en rechazo fui ordenándome de a pocos y ahora ya guardo ciertas formas con el código fuente.&lt;br /&gt;
&lt;br /&gt;
El listado a continuación es un extracto de &lt;a href="http://java.sun.com/docs/codeconv/"&gt;Java Code Conventions&lt;/a&gt;, que siendo publicado por Sun Microsystems puede considerarse oficial. Ojalá les sea de ayuda, y les sugiero programen siempre pensando en el desarrollador que va &amp;nbsp;a dar mantenimiento a su código (de modo que no te eche maldiciones xD). Dicho esto, comenzamos:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&amp;nbsp;Los archivos Java con más de 2000 líneas -incluyendo líneas en blanco y comentarios- deben evitarse.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Las primeras líneas de un archivo Java deben contener comentarios de entrada, de preferencia en este formato:&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="java" name="code"&gt;/*
&amp;nbsp;* Nombre de clase
*
&amp;nbsp;* Versión
&amp;nbsp;*
&amp;nbsp;* Aviso de Copyright
&amp;nbsp;*/&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;Dentro de una clase las primeras variables en declararse son las variables de clase (estáticas) y luego las variables de instancia. Dentro de cada categoría, primero deben colocarse las variables públicas, luego las protegidas y por último las privadas.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Un archivo Java debe tener la siguiente estructura:&lt;/li&gt;
&lt;/ul&gt;&lt;ol&gt;&lt;li&gt;Documentación de clase/interfaz&lt;/li&gt;
&lt;li&gt;Declaración de clase&lt;/li&gt;
&lt;li&gt;Variables de clase&lt;/li&gt;
&lt;li&gt;Variables de instancia&lt;/li&gt;
&lt;li&gt;Constructores&lt;/li&gt;
&lt;li&gt;Métodos&lt;/li&gt;
&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;Una línea de código no debe exceder de 80 caracteres. Las líneas que excedan esta longitud pueden dividirse de esta manera:&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="java" name="code"&gt;function(longExpression1, longExpression2, longExpression3,
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; longExpression4, longExpression5);
&lt;/pre&gt;&lt;br /&gt;
En la caso de sentencias condicionales:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;if ((condition1 &amp;amp;&amp;amp; condition2)
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|| (condition3 &amp;amp;&amp;amp; condition4)
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;||!(condition5 &amp;amp;&amp;amp; condition6)) {
&amp;nbsp;&amp;nbsp; &amp;nbsp;doSomethingAboutIt();
}
&lt;/pre&gt;&lt;br /&gt;
Y para sentencias ternarias:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;alpha = (aLongBooleanExpression) ? beta
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : gamma;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Los comentarios deben utilizarse para brindar información adicional que no está explícita en el código fuente.&lt;/li&gt;
&lt;li&gt;Los comentarios no deben estar delimitados en cajas hechas de asteriscos u otros caracteres.&lt;/li&gt;
&lt;li&gt;Los comentarios en bloque deben usar al inicio de cada archivo java y antes de cada método. Un comentario en bloque debe estar separado del resto del código por una línea en blanco. Todas las líneas de un comentario en bloque comienzan con un asterisco (*). Por ejemplo:&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="java" name="code"&gt;/*
&amp;nbsp;* Este es un comentario en bloque
&amp;nbsp;*/
&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Se pueden usar comentarios cortos de uno línea indentados al mismo nivel del código fuente. Si el comentario no puede estar contenido en una sóla línea, debe utilizarse el formato de comentarios en bloque. Un comentario de una línea debe estar precedido de una línea en blanco. Así:&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="java" name="code"&gt;if (condition) {
&amp;nbsp;&amp;nbsp; &amp;nbsp;/* Acciones para la condición */
&amp;nbsp;&amp;nbsp; &amp;nbsp;...
}&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Los comentarios de documentación describen clases Java, interfaces, constructores, métodos y atributos. Cada comentario de documentación se encuentra delimitado por /** ...*/, y debe aparecer justo antes de la declaración:&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="java" name="code"&gt;/**
&amp;nbsp;* La clase Example provee...
&amp;nbsp;*/
class Example { ...
&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Los comentarios de documentación no deben colocarse dentro de un método o una definición de constructor, dado que Java asocia los comentarios de documentación a la primera documentación después del comentario.&lt;/li&gt;
&lt;li&gt;Se recomienda utilizar una declaración por línea. Entonces, es preferible utilizar esto:&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="java" name="code"&gt;int level; // nivel de indentación
int size; &amp;nbsp;// tamaño de la mesa
&lt;/pre&gt;que esto:&lt;br /&gt;
&lt;pre class="java" name="code"&gt;int level, size;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Colocar las declaraciones sólamente al inicio de los bloques (un bloque está limitado por llaves). No se debe esperar a declarar las variables justo antes de utilizarlas. Así:&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="java" name="code"&gt;void MyMethod() {
&amp;nbsp;&amp;nbsp; &amp;nbsp;int int1; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // inicio del bloque del método
&amp;nbsp;&amp;nbsp; &amp;nbsp;if (condition) {
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int int2; &amp;nbsp; &amp;nbsp; // inicio del bloque "if"
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;...
&amp;nbsp;&amp;nbsp; &amp;nbsp;}
}
&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Tratar siempre de inicializar las variables locales al momento de declararlas.&lt;/li&gt;
&lt;li&gt;Utilizar siempre llaves para sentencias condicionales (if). Evitar este formato:&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="java" name="code"&gt;if (condition) //EVITAR!! UTILIZAR LLAVES!
statement;
&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Cada sentencia switch debe incluir la condición default. Dentro de default, utilizar break es redundante pero evita errores en caso se agreguen nuevas condiciones. Cuando no se requiera incluir break en un case, agregar el comentario /* falls through */:&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="java" name="code"&gt;switch (condition) {
case ABC:
statements;
&amp;nbsp;&amp;nbsp; &amp;nbsp;/* falls through */
case DEF:
statements;
&amp;nbsp;&amp;nbsp; &amp;nbsp;break;
case XYZ:
statements;
&amp;nbsp;&amp;nbsp; &amp;nbsp;break;
default:
statements;
&amp;nbsp;&amp;nbsp; &amp;nbsp;break;
}&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Los nombre de clase debe ser sustantivos, donde la primera letra de cada palabra interna comience con mayúsculas. Utilizar palabras completas y evitar acrónimos y abreviaturas:&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="java" name="code"&gt;class Raster;
class ImageSprite;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Los nombres de los métodos debe ser verbos, la primera letra del nombre del método debe estar en minúsculas. La primera letra de cada palabra interna debe estar en mayúsculas:&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="java" name="code"&gt;run();
runFast();
getBackground();
&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Las variables declaradas como constantes deben tener nombres en mayúscula, y las palabras internas deben estar separadas por guiones bajos (_). Así:&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="java" name="code"&gt;int MIN_WIDTH = 4;
int MAX_WIDTH = 999;
int GET_THE_CPU = 1;
&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;No hacer las variables de instacia y de clase públicas a menos que se tenga una buena razón.&lt;/li&gt;
&lt;li&gt;Evitar hacer referencia a variables o métodos de clase desde objetos. Usar para esto el nombre de la clase.&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="java" name="code"&gt;classMethod(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //OK
AClass.classMethod(); &amp;nbsp; &amp;nbsp; &amp;nbsp;//OK
anObject.classMethod(); &amp;nbsp; &amp;nbsp;//EVITAR!
&lt;/pre&gt;&lt;br /&gt;
&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-113144753442340425?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XgUwggNj1ZqRCE9VsEoWKWpLGt4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XgUwggNj1ZqRCE9VsEoWKWpLGt4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XgUwggNj1ZqRCE9VsEoWKWpLGt4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XgUwggNj1ZqRCE9VsEoWKWpLGt4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/113144753442340425/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=113144753442340425" title="1 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/113144753442340425?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/113144753442340425?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/04/etiqueta-para-programadores.html" title="Etiqueta para programadores" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_5IVIlML8wsI/S8y9MA6bheI/AAAAAAAAAsk/XRdeAc2-OSA/s72-c/post.jpg" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DkUERHk_fip7ImA9WxFVE0w.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-7884415173207536301</id><published>2010-04-12T11:42:00.013-05:00</published><updated>2010-06-11T22:43:25.746-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-11T22:43:25.746-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IBM Certified SOA Associate" /><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="Certificación IBM" /><category scheme="http://www.blogger.com/atom/ns#" term="Recetarios" /><category scheme="http://www.blogger.com/atom/ns#" term="Certificación Perú" /><title>Recetario IBM 669</title><content type="html">&lt;a href="http://4.bp.blogspot.com/_5IVIlML8wsI/S8NN8QLtGrI/AAAAAAAAAsc/Eo-7WhaVxYg/s1600/post.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5459292870834723506" src="http://4.bp.blogspot.com/_5IVIlML8wsI/S8NN8QLtGrI/AAAAAAAAAsc/Eo-7WhaVxYg/s320/post.JPG" style="cursor: hand; display: block; height: 150px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div&gt;Hace unas semanas obtuve la certificación SOA de IBM de SOA, así que ahora puedo poner en el &lt;i&gt;resumé &lt;/i&gt;que soy&lt;a href="http://www-03.ibm.com/certify/certs/45000202.shtml"&gt; IBM Certified SOA Associate&lt;/a&gt;. En realidad, no creo que la forma en la que me preparé sea un ejemplo a seguir -por eso la demora en el post- pero igual la comentaré para que sirva de referencia a la gente que se lo quiera tomar más en serio.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Comenzó Marzo y con él la temporada de certificaciones gratuitas en la empresa en la que trabajo. En esos días andaba bastante ocupado con un software en producción bastante problemático, por lo que si quería certificarme tenía que ser en algo que no me demande demasiado tiempo (de preferencia, algo que ya conozca xD). Opté por la de SOA porque mis fundamentos de Web Services están bastante sólidos -modestia aparte xD- y un par de compañeros ya tenían la certificación así que podrían facilitarme orientación y material. Programé la certificación para fin de mes porque parecía un tiempo razonable.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=cerenesp-20&amp;amp;l=bil&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=0470376848" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; margin: 0px; padding-bottom: 0px !important; padding-left: 0px !important; padding-right: 0px !important; padding-top: 0px !important;" width="1" /&gt;Como siempre, revisé lo que la gente de &lt;a href="http://www.coderanch.com/t/471596/Product-Other-Certifications/certification/Cleared-IBM-IBM"&gt;Javaranch &lt;/a&gt;recomendaba para la certificación. Muchos coincidían en que &lt;a href="http://www.amazon.com/Service-Oriented-Architecture-Dummies-Computer/dp/0470054352"&gt;SOA for Dummies de Judith Hurwitz&lt;/a&gt; era un buen punto de partida, así que me conseguí el libro y lo revisaba cuando podía. Como todo libro &lt;i&gt;For Dummies&lt;/i&gt;, era bastante didáctico, elemental y bastante bueno para un novicio como yo. Encontrándome ya por el capítulo 10 caí en la cuenta que ya faltaban dos semanas para el día D por lo que necesitaba enfocarme más en el examen y en los temas en los que me iban a evaluar (el libro de Hurwitz es bastante amplio, y no contiene exactamente lo que IBM evalúa). Recurrí nuevamente a JavaRanch donde me recomendaron &lt;a href="https://www6.software.ibm.com/developerworks/education/ws-soa-ibmcertified/ws-soa-ibmcertified-pdf.pdf"&gt;SOA Fundamentals in a Nutshell&lt;/a&gt;, un documento IBM de 34 páginas especialmente orientado a la certificación. Lo leí completo, con lo que tuve una mejor idea de qué es lo que IBM espera que uno sepa.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Revisé también&lt;a href="http://www-03.ibm.com/certify/tests/obj669.shtml"&gt; la web del examen&lt;/a&gt; y me percaté que aún me quedaban muchos objetivos por cubrir. Entonces, era necesario revisar las lecturas que IBM sugería. El listado era inmenso, e incluye Redbooks, artículos de DeveloperWorks y cursos en línea. Dado que no disponía de mucho tiempo -ni ganas, que el tema de SOA no me emociona mucho- revisé solamente esto:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.redbooks.ibm.com/abstracts/redp4233.html?Open"&gt;Best Practices for SOA Managemen&lt;/a&gt;t (Capítulos 1 - 3)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.redbooks.ibm.com/abstracts/sg247310.html?Open"&gt;Understanding SOA Security Design and Implementation&lt;/a&gt; (Capítulo 1)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.redbooks.ibm.com/abstracts/sg247386.html?Open"&gt;WebSphere Service Registry and Repository Handbook &lt;/a&gt;(Capítulo 1)&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Ya con esto me quedó más claro que es lo que IBM entiende por SOA. Ahora que ya tenía más confianza me puse a buscar &lt;i&gt;mocks &lt;/i&gt;para hacerme una idea de cómo era el examen (y desistir si es que estaba muy difícil xD). Una vez más por Javaranch me topé con &lt;a href="http://tech.groups.yahoo.com/group/ibmsoacert/"&gt;un grupo Yahoo de prepaparación para el examen SOA&lt;/a&gt;, donde estaban colgadas algunas preguntas de ejemplo. La mayoría de preguntas eran "de opinión" y a mi parecer eran bastante relativas; por ejemplo "¿Porqué la característa X es importante?" o "¿Cúales son los beneficios de utilizar Y?". En los documentos que había leído no se encontraban exactamente estas definiciones, pero tenía ya el suficiente conocimiento para hacerme una idea y responder a estas preguntas de acuerdo a mi criterio. Para sorpresa mía, parecía que mi criterio coincidía con el de IBM xD.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;El 31 de Marzo me acerqué a &lt;a href="http://www.newhorizons.com/LocalWeb/default.aspx?groupid=452"&gt;New Horizons&lt;/a&gt; a dar mi examen. Como ya me habían anticipado los mocks, las preguntas "de opinión" eran mayoría, y las respondí con lo que me dictaba el sentido común. Las preguntas técnicas fueron poquísimas, y casi en su totalidad eran sobre temas de Web Services. Terminé el examen, y en el reporte de Prometric decía que había aprobado.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Eso sería todo. Espero les sea de utilidad.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Hasta otra!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-7884415173207536301?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1Kv-8WQhRflnqY9qnobIXJ-jLVo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1Kv-8WQhRflnqY9qnobIXJ-jLVo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1Kv-8WQhRflnqY9qnobIXJ-jLVo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1Kv-8WQhRflnqY9qnobIXJ-jLVo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/7884415173207536301/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=7884415173207536301" title="6 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/7884415173207536301?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/7884415173207536301?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/04/recetario-ibm-669.html" title="Recetario IBM 669" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_5IVIlML8wsI/S8NN8QLtGrI/AAAAAAAAAsc/Eo-7WhaVxYg/s72-c/post.JPG" height="72" width="72" /><thr:total>6</thr:total></entry><entry gd:etag="W/&quot;AkAMQH4-fyp7ImA9WxBaGU0.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-4559578540151334963</id><published>2010-03-29T18:47:00.017-05:00</published><updated>2010-03-29T19:26:21.057-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-29T19:26:21.057-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tutoriales" /><title>How-to: Crear un Servicio Web JAX-RPC con IBM Websphere Integration Developer</title><content type="html">&lt;div&gt;Una nueva sección en el blog! Dejamos temporalmente la retórica académica para bajar al llano. En esta primera entrega trataremos de dejar funcionando un servicio web en un servidos&lt;a href="http://www-01.ibm.com/software/webservers/appserv/was/"&gt; IBM Websphere Application Server&lt;/a&gt; (a partir de ahora WAS), haciendo uso del&lt;a href="http://www-01.ibm.com/software/integration/wid/"&gt; IBM Websphere Integration Developer&lt;/a&gt; (a partir de ahora WID) para facilitarnos las cosas. Dicho esto, empezamos:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Existen dos "enfoques" en la creación de Servicios Web: Con el enfoque ascendente, comenzamos con la construcción de las clases java y es base a estas clases que la herramienta nos genera la interfaz WSDL del servicio web. Si es que conoces mucho Java y poco XML, esta es tu opción. Por otro lado, en el enfoque descendente empezamos por definir la interfaz WSDL y es en base a este documento que la herramienta nos genera las clases Java en las que incluiremos la funcionalidad que necesitamos. Si es que te llevas bien con XML, este debe ser tu enfoque. Personalmente no es mi caso, pero es lo que utilizaremos en este tutorial xD.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El primer paso es definir una biblioteca donde crearemos nuestro documento WSDL y demás artefactos XML que podamos requerir. Vamos a File-&gt;New-&gt;Library, y le ponemos un nombre bonito a nuestra biblioteca :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_5IVIlML8wsI/S7E80zjUxlI/AAAAAAAAAqk/nVsOXlzqaeI/s1600/newLibrary.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 233px;" src="http://3.bp.blogspot.com/_5IVIlML8wsI/S7E80zjUxlI/AAAAAAAAAqk/nVsOXlzqaeI/s320/newLibrary.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5454207501611615826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Con la biblioteca creada, podemos empezar la construcción de nuestra interfaz WSDL. Uno de los puntos fuertes del WID es que puedes crear este documento siendo un total analfabeto de XML. Lógicamente ese no es nuestro caso, pero definir el WSDL mediante Wizards es más rápido y menos propenso a errores (además, XML no es de mis tópicos favoritos xD). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Entonces, comencemos con esto. Un servicio Web ofrece una serie de operaciones a sus clientes, y cada una de estas operaciones tiene parámetros de entrada y de salida. Empezaremos definiendo la estructura de nuestros parámetros de entrada, mediante &lt;i&gt;Business Objects&lt;/i&gt; del WID. Clic derecho en nuestra biblioteca-&gt;new-&gt;Business Object. Le ponemos un nombre a nuestro objeto de negocio, y si queremos le asignamos una carpeta en la biblioteca:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_5IVIlML8wsI/S7E-B8h6flI/AAAAAAAAAqs/C8krD1pKRhI/s1600/newBusinessObject.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 196px;" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S7E-B8h6flI/AAAAAAAAAqs/C8krD1pKRhI/s320/newBusinessObject.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5454208826871545426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El Business Object que hemos definido nos servirá para encapsular los parámetros de entrada que necesitará una de las operaciones de nuestro servicio web. Mediante el WID, asignamos como campos del Business Object la información que necesitamos como entrada a nuestra operación (Y hasta ahora, no hemos visto una sóla línea de XML) :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_5IVIlML8wsI/S7E-72ugStI/AAAAAAAAAq0/mfv5Tya6Gz8/s1600/atributosBO.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 223px;" src="http://3.bp.blogspot.com/_5IVIlML8wsI/S7E-72ugStI/AAAAAAAAAq0/mfv5Tya6Gz8/s320/atributosBO.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5454209821746154194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El WID nos permite definir el tipo de dato de cada campo, así como el número de ocurrencias y otras cosillas más. Pero, ¿que está haciendo el WID tras bambalinas? Pues toma la información que le entregamos y convierte nuesto colorido diagrama en una definición de esquema XML. Si no me creen, hagan clic derecho en el Business Object -&gt;Open With-&gt;Text Editor para que puedan verlo con sus propios ojos:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5IVIlML8wsI/S7FAJYnJBkI/AAAAAAAAAq8/OQk6DgjGGsk/s1600/xml-esquema.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 195px;" src="http://2.bp.blogspot.com/_5IVIlML8wsI/S7FAJYnJBkI/AAAAAAAAAq8/OQk6DgjGGsk/s320/xml-esquema.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5454211153692001858" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Una definición de esquema XML puede ser utilizada para definir tipos en un documento WSDL, pero eso ya lo veremos luego xD. Ahora, es necesario crear otro Business Object que represente el resultado de la operación que definiremos luego. Procedemos de manera similar que con nuestro parámetro de entrada:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_5IVIlML8wsI/S7FAdeV2HbI/AAAAAAAAArE/37xk73Oq-lQ/s1600/responseBO.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 186px;" src="http://3.bp.blogspot.com/_5IVIlML8wsI/S7FAdeV2HbI/AAAAAAAAArE/37xk73Oq-lQ/s320/responseBO.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5454211498827455922" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora tenemos también una definición de esquema XML para los resultados de nuestra operación. Por si acaso, las definiciones de esquema XML son un estándar independiente y bastante complejo: soporta herencia, tipos compuestos y agrupaciones de diversa índole que pueden transformar nuestro modesto diagramita de un Business Object en algo mucho más monstruoso. Para efectos de simplicidad y compatibilidad se recomienda mantener nuestros esquemas sencillos, en el desarrollo de web service las incompatibilidades ("Mi cliente no soporta eso que está usando tu servicio") son pan de cada día.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tenemos definidos los parámetros, el resultado, ahora estamos listos para la interfaz. Clic derecho en la biblioteca-&gt;New-&gt;Interface. Le colocamos un nombre y le asignamos una carpeta:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5IVIlML8wsI/S7FBLNK27jI/AAAAAAAAArM/7gHASH8Zw9U/s1600/newInterface.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 227px;" src="http://2.bp.blogspot.com/_5IVIlML8wsI/S7FBLNK27jI/AAAAAAAAArM/7gHASH8Zw9U/s320/newInterface.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5454212284491951666" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tenemos ya la interfaz de nuestro servicio web, y necesitamos agregarle las operaciones que va a soportar. Definimos una operación de solicitud-respuesta (la otra opción son las operaciones de una vía, donde el cliente no espera una respuesta del servicio), le asignamos un nombre y asignamos como tipos de entrada y de salida instancias de los esquemas XML que hemos definido en los pasos anteriores. Deberían ver algo así:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_5IVIlML8wsI/S7FBqO_LF3I/AAAAAAAAArU/o6uy-Lk7OiQ/s1600/interfaceReady.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 138px;" src="http://3.bp.blogspot.com/_5IVIlML8wsI/S7FBqO_LF3I/AAAAAAAAArU/o6uy-Lk7OiQ/s320/interfaceReady.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5454212817555756914" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Una vez más, es momento de la pregunta:¿Y qué está haciendo en realidad el WID? Pues está construyendo un documento WSDL para nosotros, haciendo referencia a los esquemas XML que definimos anteriormente. Para los incrédulos, pueden hacer clic derecho en la interfaz-&gt;Open with text editor:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5IVIlML8wsI/S7FB4hO42NI/AAAAAAAAArc/f3WI6k85NWE/s1600/wsdl-text.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 224px;" src="http://2.bp.blogspot.com/_5IVIlML8wsI/S7FB4hO42NI/AAAAAAAAArc/f3WI6k85NWE/s320/wsdl-text.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5454213062971676882" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Como ven, tenemos un WSDL convencional con elementos "import" que hacen referencia a los esquemas XML que ya teníamos. Pero,si ya han visto un WSDL antes, se habrán dado cuenta que le faltan dos cosas importantes: el elemento &lt;i&gt;service &lt;/i&gt;y el elemento &lt;i&gt;binding&lt;/i&gt;. Para terminar nuestro WSDL, necesitamos crear un Módulo de Mediación en WID. Seleccionamos File-&gt;New-&gt;Mediation Module. Le ponemos un nombre, seleccionamos Next y hacemos referencia a la biblioteca (Library) que habíamos creado antes:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5IVIlML8wsI/S7FCWttM_AI/AAAAAAAAArk/bwLw75Asqa4/s1600/newMediation.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://2.bp.blogspot.com/_5IVIlML8wsI/S7FCWttM_AI/AAAAAAAAArk/bwLw75Asqa4/s320/newMediation.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5454213581716126722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El WID nos muestra un diagrama de ensamblado con un solitario Flujo de Mediación  al medio. Es momento de agregarle a ese Flujo una interfaz, que es el WSDL a medias que tenemos en nuestra biblioteca: Clic al Export-&gt;Add Interface y ya:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_5IVIlML8wsI/S7FC2ItRDOI/AAAAAAAAArs/RSqP7hbo8CU/s1600/addInterface.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 155px;" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S7FC2ItRDOI/AAAAAAAAArs/RSqP7hbo8CU/s320/addInterface.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5454214121540095202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora que nuestro Flujo de Mediación tiene ya una interfaz, podemos generar el &lt;i&gt;Export&lt;/i&gt;. Clic derecho en el Export-&gt;Generate Export, y predeciblemente seleccionamos "Web Service Binding". Escogemos SOAP como estándar de mensajería y HTTP como medio de transporte. Terminado esto, se observa que ha aparecido un nuevo elemento en nuestra biblioteca, bajo la categoría de Web Service Port: ese es nuestro WSDL completito. Vamos a echarle un ojo dándole clic derecho-&gt;open with-&gt;XML Editor. Lo primero que salta a la vista es que mediante un elemento import hace referencia al WSDL incompleto que creamos al inicio. También notamos que ya se han incluido los elementos binding y service, y que aún no hemos redactado una línea de XML :D&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5IVIlML8wsI/S7FDUDuWklI/AAAAAAAAAr0/pQ50o2XGCng/s1600/wsdl-text.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 224px;" src="http://2.bp.blogspot.com/_5IVIlML8wsI/S7FDUDuWklI/AAAAAAAAAr0/pQ50o2XGCng/s320/wsdl-text.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5454214635598549586" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Con esto damos por terminado el tema de WSDL, para construir la aplicación Java que hará todo lo que nuestra interfaz dice (en teoría xD). Primero, necesitamos una aplicación Web Dinámica: Seleccionamos File-&gt;New-&gt;Other-&gt;Dynamic Web Project. Le ponemos un nombre al proyecto, un nombre al EAR que la contendrá y sobretodo seleccionamos donde pensamos desplegar nuestra aplicación. En nuesto caso, optamos por nuestro viejo y fiel WAS 6:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5IVIlML8wsI/S7FDn4vXkmI/AAAAAAAAAr8/87LYZisXg4M/s1600/newWebProject.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 271px;" src="http://2.bp.blogspot.com/_5IVIlML8wsI/S7FDn4vXkmI/AAAAAAAAAr8/87LYZisXg4M/s320/newWebProject.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5454214976247403106" /&gt;&lt;/a&gt;*&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Y el WID generosamente nos proporciona la estructura básica de una aplicación Web en Java. Ahora se viene lo bueno: clic derecho en el proyecto Web-&gt;New-&gt;Other-&gt; Web Service para configurar lo que será nuestro servicio Web. Lo primero es el tipo de Servicio Web, para esto JAX-RPC (que es la tecnología que usaremos) nos da dos alternativas: usar un Java Bean como Endpoint o un EJB. Por simplicidad usamos el primero, y como ya tenemos nuestro WSDL preparado el desarrollo va a ser Descedente. Por lo expuesto, seleccionamos "Top Down Java Bean Web Service". Al tratarse de un desarrollo descendente seleccionamos el WSDL que teníamos preparado, y le indicamos una vez más que desplegaremos en un WAS. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5IVIlML8wsI/S7FD8khctFI/AAAAAAAAAsE/O8Y4YUm0eY8/s1600/webservice-1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 275px; height: 320px;" src="http://2.bp.blogspot.com/_5IVIlML8wsI/S7FD8khctFI/AAAAAAAAAsE/O8Y4YUm0eY8/s320/webservice-1.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5454215331597562962" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Seleccionamos siguiente. El WID nos muestra una casilla, que nos permite asociarle un paquete específico a un namespace determinado (caso contrario WID creará los paquetes, y no lo hace con estilo xD). Obviamos este paso, seleccionamos Finish y el WID se encargará de generar todo lo necesario para que podamos programar.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_5IVIlML8wsI/S7FETyva3lI/AAAAAAAAAsM/o4kfiglEvik/s1600/jaxrpc_files.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 293px;" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S7FETyva3lI/AAAAAAAAAsM/o4kfiglEvik/s320/jaxrpc_files.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5454215730551250514" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Echémoles un ojo a parte de lo mucho que ha generado el WID para nosotros. Observamos la interfaz del Endpoint (llamada también SEI: Service Endpoint Interface) que contiene las operaciones que nuestro cliente puede invocar mediante SOAP (en nuestro caso, sólo una). Como lo establece JAX-RPC, la SEI hereda de jax.rmi.Remote, y todos los métodos declaran la excepción java.rmi.RemoteException. También, el WID nos ha generado la implementación de esta interfaz -también conocida como SIB, Service Implementation Bean- que es donde irá la lógica de implementación del servicio.También está por ahí el descriptor de despliegue del servicio web, y los archivos de mapeo del JAX-RPC, pero por ahora dejémoslo ahí xD.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora, veamos si es que no les he mentido y si es que este servicio funciona. Al momento de generar el servicio web, el WID ha colocado el WSDL y todos los XSD (definiciones de esquemas XML) necesarios dentro de la carpeta WEB-INF/wsdl. Clic derecho al WSDL definitivo-&gt; Web Services-&gt; Test with Web Service Explorer. Esta herramienta también la he visto en Eclipse, y es una forma bastante práctiva de ver si tu servicio funciona o no. Seleccionamos la única operación de nuestro servicio -notar que nos muestra un formulario para el ingreso de parámetros- y le damos Go. Si es que en la parte inferior aparece algo similar a la estructra de respuesta que hemos definido, es que hemos triunfado. Eso sería todo, por lo que declaro terminado el post más largo de la historia de este blog. Hasta otra!!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_5IVIlML8wsI/S7FFGVGKwyI/AAAAAAAAAsU/SBQhP77ieh8/s1600/wse.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_5IVIlML8wsI/S7FFGVGKwyI/AAAAAAAAAsU/SBQhP77ieh8/s320/wse.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5454216598766928674" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PS: Un agradecimiento a Carlos Lazo, que fue el que me ilustró en estas lides xD&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-4559578540151334963?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2fVhcRxJLniCPr8BFwALl-Je6pA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2fVhcRxJLniCPr8BFwALl-Je6pA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2fVhcRxJLniCPr8BFwALl-Je6pA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2fVhcRxJLniCPr8BFwALl-Je6pA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/4559578540151334963/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=4559578540151334963" title="0 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/4559578540151334963?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/4559578540151334963?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/03/how-to-crear-un-servicio-web-jax-rpc.html" title="How-to: Crear un Servicio Web JAX-RPC con IBM Websphere Integration Developer" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_5IVIlML8wsI/S7E80zjUxlI/AAAAAAAAAqk/nVsOXlzqaeI/s72-c/newLibrary.JPG" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkQMRH4-eCp7ImA9WxBbFkQ.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-3455707732939500467</id><published>2010-03-15T17:22:00.013-05:00</published><updated>2010-03-15T18:06:25.050-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-15T18:06:25.050-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="En la cancha" /><title>El test de Joel para equipos de desarrollo</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5IVIlML8wsI/S56zM5ZmjHI/AAAAAAAAAqU/UZF6ziTzGyQ/s1600-h/NolanTheTrial1947.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 237px;" src="http://2.bp.blogspot.com/_5IVIlML8wsI/S56zM5ZmjHI/AAAAAAAAAqU/UZF6ziTzGyQ/s320/NolanTheTrial1947.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5448989633312885874" /&gt;&lt;/a&gt;&lt;b&gt;&lt;i&gt;(Imagen: Sidney Nolan - The trial)&lt;/i&gt;&lt;/b&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hay muchas señales que nos indican que un equipo de desarrollo no está funcionando como debería: muchos bugs, programadores trasnochados y  cronogramas incumplidos son algunos de los más importantes. Joel Spolsky -en su &lt;a href="http://www.joelonsoftware.com/"&gt;blog &lt;/a&gt;- intenta formalizar esto un poco más y propone &lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html"&gt;un examen de 12 preguntas&lt;/a&gt; para saber que tan bien -o mal- se desempeña un equipo de desarrollo. Aquí se los presento (y pór favor, no se depriman si reprueban xD):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;1. ¿Utilizan software de control de versiones?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Siempre las primeras preguntas son las más fáciles xD. Afortunadamente, no me ha tocado trabajar en un proyecto donde no se utilicen estas herramientas. La más primitiva -pero eficiente- que he utilizado es Microsoft Source Safe en una de sus versiones primeras (y no se integraba al IDE); ya más adelante me topé con el &lt;a href="http://es.wikipedia.org/wiki/CVS"&gt;CVS &lt;/a&gt;y el &lt;a href="http://subversion.tigris.org/"&gt;SVN &lt;/a&gt;(que &lt;a href="http://www.eclipse.org/subversive/"&gt;trabajan de maravilla con Eclipse&lt;/a&gt;). Las ventajas de estas herramientas son muchas -mi favorita es que te permite detectar quien malogró tu código xD- y los costos son mínimos: los más populares son software libre, y sólo necesitarías una PC que te sirva como servidor. No hay excusa para no usarlos.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;2. ¿Pueden generar un ejecutable en un sólo paso?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;En el caso de aplicaciones J2EE, implica qué es lo que tienes que hacer para tener el EAR listo para el despliegue el producción. Mientras menos se tenga que hacer, mejor (dado que se reducen las posibilidades que metas la pata xD). Aquí uno podría ayudarse en scripts de &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt;, aunque ahora las IDE's ya ayudan bastante (i.e clic derecho-&gt; Exportar a EAR. &lt;i&gt;C'est fini&lt;/i&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;3. ¿Integran el código diariamente?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;He visto con frecuencia la mala costumbre de esperar hasta pocos días antes del pase a producción para integrar el código construido por los programadores del proyecto. Cuando esto sucede, se obtiene una versión bastante inconsistente de la aplicación (faltan clases, algunas clases son sobreescritas, otras se repiten, y muchas atrocidades más) que lleva días estabilizar. Para evitar esta pesadilla, es mejor realizar integraciones diarias y subsanar las inconsistencias al instante: de ese modo dividimos la molestia de integrar en porciones más digeribles xD.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;4. ¿Cuéntan con una base de datos de incidencias (&lt;i&gt;bugs&lt;/i&gt;)?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Después de un pase -a pruebas de usuario o a producción- lo natural es que empiezen a llegar correos con errores a subsanar. Si se trata de un usuario insistente, puede llegar a llamarte y si es un usuario con poder puedes tener al gerente esperando a tu costado hasta que se solucione el error (me ha pasado). Es importante que las incidencias que lleguen estén centralizadas para evitar 1. Que se reporten como incidencias temas que ya han sido resueltos 2. Que ningún error quede sin ser atendido. A los usuarios les gusta llevar bastante este control mediante hojas excel, lo malo es que estos documentos son tan manoseados que se llega a tener 5 versiones simultáneas del mismo documento (esto también me ha pasado). La solución ideal es una base de datos de bugs, que según Joel debe tener esta información:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Secuencia de pasos para replicar el error&lt;/li&gt;&lt;li&gt;Comportamiento esperado (lo que debería hacer y no está haciendo)&lt;/li&gt;&lt;li&gt;Comportamiento actual (lo que el software hace y no debería hacer)&lt;/li&gt;&lt;li&gt;Responsable (el que crucificaremos si esto no se soluciona)&lt;/li&gt;&lt;li&gt;Estado (si el &lt;i&gt;bug &lt;/i&gt;se eliminó no)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;5.¿Se corrigen los errores antes de desarrollar nuevas funcionalidades?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Otra cuestión que he visto con frecuencia. La gente de control de calidad envía un voluminoso listado de incidencias, que es derivado al &lt;i&gt;trainee &lt;/i&gt;mientras los desarrolladores siguen produciendo más código defectuoso. Como deben de haberles dicho muchas veces en la universidad -y Joel nos lo recuerda- mientras más te demores en corregir un &lt;i&gt;bug &lt;/i&gt;más te va a costar hacerlo (en tiempo y en dinero). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;6. ¿Se está al día con el cronograma?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Esta es difícil. La estimación en software es un arte oscuro, y me siento medio chamán cuando me piden que estime cuando me demoraría desarrollar la funcionalidad XYZ. A veces me liga, y a veces no. Sé que existen metodologías formales, pero por dejadez no he profundizado mucho en ellas y me remito a mi experiencia para estimar. Según RUP, si estimara en intervalos de tiempo más pequeños (iteraciones) en vez de intentar estimar el proyecto de porrazo la calidad del cronograma aumentaría. Suena bastante lógico, pero aún no lo he intentado xD.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;7. ¿Redactan especificaciones?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Entiéndase especificaciones como documentos antes de programar (i.e especificaciones de casos de uso). No conozco desarrollador al que le guste documentar, y por ahora esa tarea penosa se la delegamos a los practicantes (&lt;i&gt;trainees&lt;/i&gt;), y sabemos que eso está mal y nos sentimos culpables por eso xD. Joel plantea dos soluciones: 1. Mandar a los desarrolladores a cursos de redacción y 2. Centralizar la redacción de especificaciones en los jefes de proyecto. Me quedo con la segunda xD.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;8. ¿Los programadores tienen la tranquilidad que necesitan?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Aquí Joel hace énfasis en la necesidad de silencio y de no ser interrumpido (por eso, el a sus programadores les asigna oficinas propias :S). Yo creo que depende bastante de la cultura de la organización. Por ejemplo, donde trabajo religiosamente a las dos de la tarde ponemos la radio para escuchar un programa humorístico radial; y todos trabajamos sin problemas y nadie se ha quejado. Ahora, cuando quiero programar en serio y no quiero ser molestado me pongo las audífinos para escuchar The Vines a todo volumen. Como dije, cuestión de estilos xD.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;9. ¿Utilizan las mejores herramientas del mercado?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Empezando por el hardware. No se puede desarrollar software en la computadora que utiliza la secretaria para redactar en Word (y el Messenger xD). Si es que la PC se demora 5 minutos en compilar, lo que va a pasar es que el desarrollador se va a aburrir y va a bajar a comerse un aperitivo. Lo mismo con el software: puedes desarrollar procedimientos PL/SQL con el &lt;a href="http://www.oracle.com/technology/products/database/sql_developer/index.html"&gt;SQL Developer de Oracle&lt;/a&gt; (que es gratis) pero lo harías más rápido y mejor con el PL/SQL Developer (que te cuesta muchos dólares más). La idea es que el desarrollador esté feliz, para que el desarrollador sea productivo xD.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;10. ¿Cuentan con personal de control de calidad?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;A pesar de lo insistentes y quiquillosos que son, reconozco que son importantes. Ellos detectan errores que nuestro usuario final no verá, y nos hacen ver que a pesar de lo maravillosos que somos... los desarrolladores también nos equivocamos (en raras ocasiones xD). Según Joel, por cada tres programadores debe haber un tester. Creo que nos quedamos cortos xD&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;11. ¿Se requiere que los postulantes programen durante su entrevista?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;De hecho que es la única manera de saber si es que el postulante sabe tanto como dice en su Curriculum, aunque siempre que yo he sido el entrevistado me han ocurrido percances. Varias veces me han hecho programar en IDE's que desconocía (lo que hacía que me demore más) y otra me hicieron usar clases que ni siquiera compilaban. Siempre debe procurarse que el postulente se encuentre en "condiciones ideales" xD.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;12. ¿Utilizan el test de usabilidad del pasillo?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Esa es nueva xD. Consiste en hacer que cualquier individuo que encuentres en el pasillo (i.e el encargado de limpieza, la chica de la cafetería, etc) utilice la aplicación que estás desarrollando. Si no tienen la más mínima idea de qué hacer, vas por mal camino.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora, a calificarse. Si tienes 12 (como Microsoft) vas bien, si tienes 11 es tolerable pero si tienes 10 o menos estás en serios problemas (Joel dixit). Por cuestiones de confidencialidad, no les puedo decir como quedó mi equipo, pero me gustaría que ustedes -visitantes anónimos- me digan como le fue al suyo. Hasta otra!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-3455707732939500467?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dsPZjGEs2kfTM8g_NanYinpOPtM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dsPZjGEs2kfTM8g_NanYinpOPtM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dsPZjGEs2kfTM8g_NanYinpOPtM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dsPZjGEs2kfTM8g_NanYinpOPtM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/3455707732939500467/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=3455707732939500467" title="1 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/3455707732939500467?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/3455707732939500467?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/03/el-test-de-joel-para-equipos-de.html" title="El test de Joel para equipos de desarrollo" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_5IVIlML8wsI/S56zM5ZmjHI/AAAAAAAAAqU/UZF6ziTzGyQ/s72-c/NolanTheTrial1947.jpg" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DEQAQX4zeCp7ImA9WxBXF04.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-2193762709965605344</id><published>2010-01-28T18:06:00.005-05:00</published><updated>2010-01-28T22:39:00.080-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-28T22:39:00.080-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="En la cancha" /><title>Una fábula</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_5IVIlML8wsI/S2IYuLgoc2I/AAAAAAAAAqA/X3ot8RNybYE/s1600-h/F%C3%A1bula_%28El_Greco,_c._1600%29.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 248px;" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S2IYuLgoc2I/AAAAAAAAAqA/X3ot8RNybYE/s320/F%C3%A1bula_%28El_Greco,_c._1600%29.jpg" alt="" id="BLOGGER_PHOTO_ID_5431931282204947298" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;(Imagen: El Greco - Fábula)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Érase una vez un proyecto de software, y como es muy común con los proyectos de software, estaba bastante atrasado.&lt;br /&gt;&lt;br /&gt;A pesar de todas las horas extras que habían empleado Hugo y Paco- los desarrolladores- y las muchas horas extras que emplearían, terminar el proyecto en la fecha acordada parecía imposible. Y los programadores se lo dijeron a su Jefe:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;- Jefe, sólamente trabajando 48 horas al día podríamos terminar esto a tiempo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El Jefe , que era el que había hecho la promesa de terminar al cliente, se puso a pensar como solucionar esta situación, dado que parte de su trabajo era quedar bien con el cliente. Fue entonces que tuvo una brillante idea:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;- Muchachos, vamos a pedirles a Pepe y Toño que les den una mano.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fue entonces que Pepe y Toño pasaron a formar parte del equipo de Hugo, Paco y el Jefe. Pepe y Toño eran programadores bastante capaces, pero dado que eran nuevos en el proyecto necesitaban cierta orientación para ponerse al corriente.&lt;br /&gt;&lt;br /&gt;Por esto, Hugo se tomó un día en explicarles a Pepe y Toño en que consistiá la aplicación, y los problemas que ésta iba a solucionar. En ese día, hubiera podido avanzar el 20% de lo que faltaba por hacer,  pero se dedico a ilustrar a Pepe y Toño.&lt;br /&gt;&lt;br /&gt;Paco por otra parte, se tomo un día también para explicarles la arquitectura de la aplicación, los estándares que estaban siguiendo y las librerías que se estaban usando. De no haber tenido que hacer esto, hubiera avanzado un 30% más de los pendientes del proyecto.&lt;br /&gt;&lt;br /&gt;Después de estos dos días de capacitación, Pepe y Toño se pusieron a programar. Pero como aún estaban frescos - y Hugo y Paco no eran buenos profesores- dejaron unos cuántos bugs que Hugo y Paco tuvieron que reparar. Esto les tomó un día a los dos, en el que hubieran construido el 50% de lo que necesitaban hacer si no hubieran tenido que reparar bugs.&lt;br /&gt;&lt;br /&gt;Llegó la fecha prometida, y para sorpresa del Jefe, el proyecto todavía no estaba listo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Moraleja:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;"Añadir mano de obra a un proyecto de software que se encuentre atrasado hace que se atrase aún más"&lt;/span&gt;. Este es el enunciado de la &lt;span style="font-weight: bold;"&gt;Ley de Brooks&lt;/span&gt; para el desarrollo de Software, propuesta por &lt;span style="font-weight: bold;"&gt;Fred Brooks&lt;/span&gt; en su libro &lt;i&gt;The Mythical Man Month&lt;/i&gt; (de 1975!! Desde entonces ya se sabe esto xD). Dicho de otra manera por el propio Brooks, "Nueve mujeres no pueden hacer un bebe en un mes". Casi todos los Jefes que conozco desconocen este principio, así que el objetivo de este post es educarlos xD. Pueden encontrar más en &lt;a href="http://en.wikipedia.org/wiki/Brooks%27s_law"&gt;Wikipedia&lt;/a&gt;, o en este excelente artículo de &lt;a href="http://www.joelonsoftware.com/items/2010/01/22.html"&gt;Joel Spolsky&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-2193762709965605344?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hCwLYkQnq8apM4Gn6A34c2ayTfA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hCwLYkQnq8apM4Gn6A34c2ayTfA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hCwLYkQnq8apM4Gn6A34c2ayTfA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hCwLYkQnq8apM4Gn6A34c2ayTfA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/2193762709965605344/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=2193762709965605344" title="10 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/2193762709965605344?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/2193762709965605344?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2010/01/una-fabula.html" title="Una fábula" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_5IVIlML8wsI/S2IYuLgoc2I/AAAAAAAAAqA/X3ot8RNybYE/s72-c/F%C3%A1bula_%28El_Greco,_c._1600%29.jpg" height="72" width="72" /><thr:total>10</thr:total></entry><entry gd:etag="W/&quot;DE8NQ3Y8fip7ImA9WxNaGUs.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-7249891345176452800</id><published>2009-12-04T17:43:00.002-05:00</published><updated>2009-12-04T17:48:12.876-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-04T17:48:12.876-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="En la cancha" /><title>Los mandamientos del desarrollo de software</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_5IVIlML8wsI/SxmQzI_FHrI/AAAAAAAAApU/C0nOfTxodN8/s1600-h/post.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 320px;" src="http://1.bp.blogspot.com/_5IVIlML8wsI/SxmQzI_FHrI/AAAAAAAAApU/C0nOfTxodN8/s320/post.JPG" alt="" id="BLOGGER_PHOTO_ID_5411515635522150066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Buceando en la web me topé con el artículo &lt;a href="http://www.computer.org/portal/web/buildyourcareer/fa035?utm_source=bronto&amp;amp;utm_medium=email&amp;amp;utm_term=Forgotten+Facts+About+Software+Engineering&amp;amp;utm_content=c.gavidia%40hotmail.com&amp;amp;utm_campaign=BYC-Issue+38-December+3"&gt;"Frequently Forgottenn Fundamental Facts about Software Engineering" de Robert L. Glass&lt;/a&gt;, en las que el autor enumera los que él considera los "teoremas" básicos a tener en cuenta al momento de construir software, y que lamentablemente parece que nadie considera. El listado que menciona lo realizó en base a su experiencia profesional y muchas de los principios que menciona han sido violentados en mi compañía, y a veces por mi persona. Paso a enumerar los que me llamaron la atención, junto a unos apuntes de mi parte:&lt;br /&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;Los buenos programadores son por lo general 30 veces mejores que los programadores mediocres. Dado esto, no se debe escatimar en los salarios de los programadores buenos, dado que siempre producen más de lo esperado&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;En una compañía en la que estuve, empezaron a reemplazar Analistas Programadores (gente con experiencia) por practicantes (novatos o "trainees"), bajo la excusa de reducir costos y aumentar la productividad -más programadores con menos presupuesto-. Lógicamente, un practicante demoraba 2 semanas en hacer lo que un AP podía hacer en un día, así que no creo que les haya resultado beneficioso.&lt;br /&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;El uso de una nueva herramienta o técnica reduce la productividad de los programadores y la calidad del producto inicialmente. Se obtienen beneficios una vez superada la curva de aprendizaje.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;El arquitecto de donde trabajo es bastante "creativo", y constantemente incluye nuevas tecnologías en las aplicaciones que desarrollamos. El documentarnos sobre  la tecnología nos toma como una semana, y cuando nos ponemos a desarrollar definitivamente lo hacemos más lento que con tecnologías más familiares. Pero ver cosas nuevas siempre es divertido xD.&lt;br /&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;El mejorar un atributo de calidad generalmente perjudica a otro atributo de calidad. Por ejemplo, el mejorar la eficiencia perjudica la flexibilidad a cambios de la aplicación.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Se me viene a la mente el uso de procedimientos almacenados en base de datos: disminuyen el tiempo de respuesta pero te hacen imposible el cambiar de DBMS. Como dicen por ahí, nada es gratis en la vida.&lt;br /&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;La detección y solución de errores representan el 40% de los costos de desarrollo. Por eso es una de las fases más importantes del ciclo de vida del desarrollo.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Yo me arriesgaría a decir que hasta el 50% de los costos.&lt;br /&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;De un software -que según un programador promedio ha sido exhaustivamente probado- sólamente se han ejecutado el 55%-60% de sus rutas lógicas. El soporte automático, como analizadores de cobertura, puede elevar este número a 85%-90%. Las pruebas al 100% son imposibles.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Es por esto que el personal de control de calidad no nos cae nada bien. Siempre salen con casos que uno nunca pensaba que se iban dar, y que generan un nada discreto mensaje de error. Aunque como se dice por acá, es mejor que lo vea un tester a que lo vea el usuario xD.&lt;br /&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;El software siempre contiene defectos residuales, aún después del proceso de eliminación de errores más riguroso. El objetivo es minimizarlos en número y en severidad.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Y sobre todo, que aparezcan después que se haya terminado la garantía xD.&lt;br /&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;Las mayoría de las tareas de desarrollo de software y de mantenimiento de software son las mismas- excepto por la tarea de mantenimiento adicional "Comprender el producto existente". Esta tarea es de suma importancia, y consume casi el 30% del tiempo de mantenimiento. Por esto, se puede decir que el mantenimiento es más difícil que el desarrollo de software.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Bastante cierto... no hay nada más difícil de entender que el código ajeno. Lo digo con conocimiento de causa, que sufrí 1 año dando mantenimiento a aplicaciones que parecían hechas por chimpancés.&lt;br /&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;Cuando un proyecto pasa de requerimientos a diseño, la complejidad del proceso de solución produce una exploción de "requerimientos derivados". La lista de requerimientos de la fase de diseño es por lo general 50 veces mayor que la lista de requerimientos original.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Nos pasa todos los días, y ocasiona amanecidas y/o retrasos.&lt;br /&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;La mayoría de estimaciones de software se desarrollan al inicio del ciclo de vida. Es decir, ocurren antes de la fase de requerimientos y por ende antes de comprender el problema. La estimación por lo general ocurre en el tiempo inapropiado.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Es por esto que los cronogramas de desarrollo son las artefactos más desatendidos e ignorados que conozco. Los hacen por protocolo, pero a la larga nadie los sigue (al menos en mi compañía). Tal vez cronogramas por iteración, como señala RUP, serían la solución.&lt;br /&gt;&lt;br /&gt;Esos son los que me parecen más importantes, y creo que si los jefes de proyecto los leyeran nuestros días serían más llevaderos. A ver que opinan ustedes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-7249891345176452800?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ePdlrRrUrfe2o-oECqyPlrwsG-g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ePdlrRrUrfe2o-oECqyPlrwsG-g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ePdlrRrUrfe2o-oECqyPlrwsG-g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ePdlrRrUrfe2o-oECqyPlrwsG-g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/7249891345176452800/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=7249891345176452800" title="9 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/7249891345176452800?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/7249891345176452800?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2009/12/los-mandamientos-del-desarrollo-de.html" title="Los mandamientos del desarrollo de software" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_5IVIlML8wsI/SxmQzI_FHrI/AAAAAAAAApU/C0nOfTxodN8/s72-c/post.JPG" height="72" width="72" /><thr:total>9</thr:total></entry><entry gd:etag="W/&quot;DkUERHk_cCp7ImA9WxFVE0w.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-3218935056390332285</id><published>2009-11-21T10:05:00.013-05:00</published><updated>2010-06-11T22:43:25.748-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-11T22:43:25.748-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inclasificados" /><category scheme="http://www.blogger.com/atom/ns#" term="IBM Certified Solution Designer - IBM Rational Unified Process V7.0" /><category scheme="http://www.blogger.com/atom/ns#" term="Certificación IBM" /><category scheme="http://www.blogger.com/atom/ns#" term="Recetarios" /><category scheme="http://www.blogger.com/atom/ns#" term="Certificación Perú" /><title>Recetario IBM 839</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_5IVIlML8wsI/SwgCCPqGYjI/AAAAAAAAApM/R38J8bG1TgY/s1600/success-1.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 318px; height: 320px;" src="http://1.bp.blogspot.com/_5IVIlML8wsI/SwgCCPqGYjI/AAAAAAAAApM/R38J8bG1TgY/s320/success-1.gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5406573590244385330" /&gt;&lt;/a&gt;Este es otro post de Recetario, por lo que podrán inferir que ya obtuve la certificación &lt;a href="http://www-03.ibm.com/certify/certs/38008003.shtml"&gt;IBM Certified Solution Designer - IBM Rational Unified Process V7.0&lt;/a&gt;. Una vez más, procedo a contarles lo que tuve que hacer para tener este diploma en mi colección.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si es que son asiduos del blog ya sabrán que venía de &lt;a href="http://certified-es.blogspot.com/2009/10/recetario-ibm-833-834.html"&gt;obtener la IBM Certified Solution Designer - Object Oriented Analysis and Design, vUML 2&lt;/a&gt; y me encontraba en búsqueda de otra certificación con orientación a Ingeniería de Software y no tanto a Programación. Había pensado en un momento en la &lt;a href="http://www.openedgetech.com/detalles.html"&gt;Certified ScrumMaster&lt;/a&gt;, pero para obtenerla es requisito haber asistido a un curso -bastante caro- antes de poder de dar el examen; así que mejor opté por la muy accesible certificación RUP de IBM: Un sólo examen y sin pre-requisitos.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Había visto un poco de RUP en la universidad, pero eso fue hace muchos años y mi memoria es bastante frágil, así que el primer paso era conseguirme un libro que refresque esos conocimientos que creía ya perdidos. Buceando en Amazon me topé con&lt;a href="http://www.amazon.com/Rational-Unified-Process-Introduction-2nd/dp/0201707101"&gt; The Rational Unified Process: An Introduction de Philippe Kruchten&lt;/a&gt;, que viene a ser una guía para principiantes -o para jefes de proyecto, según se vea xD- del proceso RUP. Me leí hasta la última página del libro, y creyéndome ya un Dios en RUP me dispuse a probar suerte con los &lt;a href="http://www.elitecertify.com/000-839.htm"&gt;mocks de Elite Certify&lt;/a&gt;, solamente para fracasar y darme cuenta que aún faltaba mucho por leer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Probando con los mocks me di cuenta que el contenido de las disciplinas de RUP (o sea, lo que había visto en la universidad y lo que había leído en el libro de Kruchten) es sólamente una pequeña parte del examen, y que más de la mitad del mismo trata sobre elementos del proceso y de temas de desarrollo iterativo. Recurrí entonces al material del curso &lt;a href="http://www-304.ibm.com/jct03001c/services/learning/ites.wss/us/en?pageType=course_description&amp;amp;courseCode=RP401"&gt;IBM Essentials of the Rational Unified Process V7.0&lt;/a&gt;, que ya trataba más a detalle el desarrollo iterativo y los work products del proceso pero aún obviaba los elementos del método y del proceso, por lo que seguía reprobando los mocks que intentaba resolver.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La solución una vez más vino de los amigos de &lt;a href="http://www.coderanch.com/t/145785/Product-Other-Certifications/certification/IBM-RUP-Certification-Test-anyone"&gt;Javaranch&lt;/a&gt;. Un forista que ya había obtenido la certificación recomendaba la web de &lt;a href="http://members.tele2.nl/hadmiraal/rup/frameset.htm"&gt;Hans Admiraal&lt;/a&gt;, así que de curioso fui a echarle una ojeada. Hans es un consultor especializado en RUP, y ofrece entrenamiento -lógicamente a un costo- para poder obtener la certificación que estaba buscando. Como "bonus track", Hans a colocado también un documento PDF donde indica que contenidos del &lt;a href="http://members.tele2.nl/hadmiraal/rup/frameset.htm"&gt;Rational Method Composer&lt;/a&gt; había que revisar para cubrir todos los temas de la certificación. Yo tenía instalado el RMC desde que me encontraba estudiando para el IBM 833-834, por lo que grande fue mi sorpresa al descubrir que TODOS los temas de la certificación estaban descritos ahí, y a detalle. Seguí al pie de la letra los consejos de Hans y leí lo que él indicó, gracias a eso ya no tuve problemas con los mocks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sintiéndome bastante confiado, fui a decirle a la gente de mi trabajo que quería dar la certificación, que me encontraba listo y que esperaba que al tratarse de un partner de IBM me pagasen el examen - como había ocurrido con los exámenes 833 y 834. Contra todo pronóstico, me dijeron que esta vez no podían afrontar el gasto, y que si quería certificarme los 240$ (200$ del examen y 40$ de gastos administrativos de &lt;a href="http://www.newhorizons.com/localweb/default.aspx?groupid=452"&gt;New Horizons&lt;/a&gt;) tendrían que salir de mi bolsillo. Habiéndole dedicado ya tanto tiempo a la certificación, no me quedó otra que aceptar, así que este fin de mes mi salario estará más chiquito que de costumbre.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Programé el examen para el martes pasado, me acerqué a las instalaciones de New Horizons para dar el examen y lo aprobé con una calificación que me deja satisfecho. Ahora pienso tomarme otro descanso, y probablemente al certificación que venga sea la &lt;a href="http://www-03.ibm.com/certify/certs/45000202.shtml"&gt;IBM Certified SOA Associate&lt;/a&gt;, aunque ahora que no es gratis no estoy tan seguro. ¡Hasta otra!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-3218935056390332285?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uFIwydsQzwzk_HAxU8SRWLiFjWY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uFIwydsQzwzk_HAxU8SRWLiFjWY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uFIwydsQzwzk_HAxU8SRWLiFjWY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uFIwydsQzwzk_HAxU8SRWLiFjWY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/3218935056390332285/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=3218935056390332285" title="5 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/3218935056390332285?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/3218935056390332285?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2009/11/recetario-ibm-839.html" title="Recetario IBM 839" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_5IVIlML8wsI/SwgCCPqGYjI/AAAAAAAAApM/R38J8bG1TgY/s72-c/success-1.gif" height="72" width="72" /><thr:total>5</thr:total></entry><entry gd:etag="W/&quot;CU4MSXYzeSp7ImA9WxFVE0w.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-4652760722154161409</id><published>2009-11-06T16:07:00.002-05:00</published><updated>2010-06-11T22:39:48.881-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-11T22:39:48.881-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Guía IBM 839 : Rational Unified Process" /><category scheme="http://www.blogger.com/atom/ns#" term="IBM Certified Solution Designer - IBM Rational Unified Process V7.0" /><category scheme="http://www.blogger.com/atom/ns#" term="Certificación IBM" /><title>Demostrar valor iterativamente</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_5IVIlML8wsI/SvSUqRroi7I/AAAAAAAAApA/fa7D55zcLEU/s1600-h/post.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 288px; height: 320px;" src="http://4.bp.blogspot.com/_5IVIlML8wsI/SvSUqRroi7I/AAAAAAAAApA/fa7D55zcLEU/s320/post.JPG" alt="" id="BLOGGER_PHOTO_ID_5401105307145898930" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;(Imagen: El Greco - Visión del Apocalipsis)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este principio explica los beneficios del desarrollo iterativo de software. Un proceso iterativo hace posible acomodarse al cambio, obtener retroalimentación y adaptarla al proyecto, reducir riesgos de manera temprana y ajustar el proceso dinámicamente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Beneficios&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Reducción temprana del riesgo&lt;/li&gt;&lt;li&gt;Mayor capacidad de predicción a lo largo del proyecto.&lt;/li&gt;&lt;li&gt;Confianza entre los stakeholders&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Patrón&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Permitir retroalimentación al incrementar el valor para el usuario en cada iteración&lt;/li&gt;&lt;li&gt;Adaptar los planes usando un proceso iterativo&lt;/li&gt;&lt;li&gt;Aceptar el cambio y administrarlo&lt;/li&gt;&lt;li&gt;Atacar los mayores riesgos técnicos, de negocio y de programación tempranamente.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Anti-patrones&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Planear todo el ciclo de vida a detalle, controlar las variaciones respecto al plan (esto puede contribuir al fracaso del proyecto)&lt;/li&gt;&lt;li&gt;Evaluar el estado en los primeros dos tercios del proyecto confiando en la revisión de especificaciones, en vez de evaluar el estatus de resultados de pruebas y demostraciones de software funcionando.&lt;/li&gt;&lt;/ul&gt;Basado en el navegador de proceso del &lt;a href="http://www-01.ibm.com/software/awdtools/rmc/"&gt;IBM Rational Method Composer&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-4652760722154161409?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/08vmHXKNBX0qjhB7mfF_TcuyIM8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/08vmHXKNBX0qjhB7mfF_TcuyIM8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/08vmHXKNBX0qjhB7mfF_TcuyIM8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/08vmHXKNBX0qjhB7mfF_TcuyIM8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/4652760722154161409/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=4652760722154161409" title="0 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/4652760722154161409?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/4652760722154161409?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2009/11/demostrar-valor-iterativamente.html" title="Demostrar valor iterativamente" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_5IVIlML8wsI/SvSUqRroi7I/AAAAAAAAApA/fa7D55zcLEU/s72-c/post.JPG" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CU4MSXYzeyp7ImA9WxFVE0w.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-6906970674960416134</id><published>2009-11-06T15:53:00.003-05:00</published><updated>2010-06-11T22:39:48.883-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-11T22:39:48.883-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Guía IBM 839 : Rational Unified Process" /><category scheme="http://www.blogger.com/atom/ns#" term="IBM Certified Solution Designer - IBM Rational Unified Process V7.0" /><category scheme="http://www.blogger.com/atom/ns#" term="Certificación IBM" /><title>Colaboración entre equipos</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_5IVIlML8wsI/SvSPBeb37gI/AAAAAAAAAo4/Ujz89nHia6Y/s1600-h/post.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 186px; height: 320px;" src="http://3.bp.blogspot.com/_5IVIlML8wsI/SvSPBeb37gI/AAAAAAAAAo4/Ujz89nHia6Y/s320/post.JPG" alt="" id="BLOGGER_PHOTO_ID_5401099108636683778" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;(Imagen: El Greco - La Sagrada Trinidad)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este principio resalta la importancia de promover uno óptima comunicación entre miembros del proyecto. Esto se logra a través de una organización del equipo apropiada y configurando entornos de colaboración efectivos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Beneficios&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Productividad del equipo&lt;/li&gt;&lt;li&gt;Mejor acoplamiento entre las necesidades del negocio y el desarrollo y operaciones de los sistemas software.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Patrón:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Motivar a la gente para que realice su mejor esfuerzo&lt;/li&gt;&lt;li&gt;Crear equipos auto-administrados&lt;/li&gt;&lt;li&gt;Promover la colaboración horizontal entre funciones (como analistas, desarrolladores, testers)&lt;/li&gt;&lt;li&gt;Proveer entornos de colaboración efectivos.&lt;/li&gt;&lt;li&gt;Integrar a los equipos de negocios, software y de operación.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Anti-patrones&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Explotar a los desarrolladores, haciéndolos trabajar largas jornadas, incluyendo fines de semana&lt;/li&gt;&lt;li&gt;Tener gente altamente especializada equipada con las mejores herramientas para realizar su trabajo, con colaboración limitada entre miembros del equipo e integración limitada entre sus herramientas. Se asumo que si cada uno realiza bien su trabajo el resultado será bueno.&lt;/li&gt;&lt;/ul&gt;Basado en el navegador de proceso del &lt;a href="http://www-01.ibm.com/software/awdtools/rmc/"&gt;IBM Rational Method Composer&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-6906970674960416134?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cB-pHHCJGynPV0vJH08o5rdcb1A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cB-pHHCJGynPV0vJH08o5rdcb1A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cB-pHHCJGynPV0vJH08o5rdcb1A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cB-pHHCJGynPV0vJH08o5rdcb1A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/6906970674960416134/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=6906970674960416134" title="0 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/6906970674960416134?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/6906970674960416134?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2009/11/colaboracion-entre-equipos.html" title="Colaboración entre equipos" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_5IVIlML8wsI/SvSPBeb37gI/AAAAAAAAAo4/Ujz89nHia6Y/s72-c/post.JPG" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CU4MSXYzfSp7ImA9WxFVE0w.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-2245105761818103537</id><published>2009-11-06T15:33:00.003-05:00</published><updated>2010-06-11T22:39:48.885-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-11T22:39:48.885-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Guía IBM 839 : Rational Unified Process" /><category scheme="http://www.blogger.com/atom/ns#" term="IBM Certified Solution Designer - IBM Rational Unified Process V7.0" /><category scheme="http://www.blogger.com/atom/ns#" term="Certificación IBM" /><title>Disciplina: Requerimientos</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_5IVIlML8wsI/SvSIJUnr5LI/AAAAAAAAAow/Sjd7v21KX-A/s1600-h/post.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 286px; height: 320px;" src="http://3.bp.blogspot.com/_5IVIlML8wsI/SvSIJUnr5LI/AAAAAAAAAow/Sjd7v21KX-A/s320/post.JPG" alt="" id="BLOGGER_PHOTO_ID_5401091546859431090" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;(Imagen: El Greco - Vista de Toledo)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Propósito&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Establecer y mantener acuerdos entre los clientes y otros stakeholders sobre lo que el sistema debe hacer&lt;/li&gt;&lt;li&gt;Proveer a los desarrolladores del sistema de un mejor entendimiento de los requerimientos del sistema.&lt;/li&gt;&lt;li&gt;Definir los límites del sistema&lt;/li&gt;&lt;li&gt;Proveer las bases para planificar el contenido técnico de cada iteración&lt;/li&gt;&lt;li&gt;Proveer las bases para estimar el costo y el tiempo del desarrollo del sistema.&lt;/li&gt;&lt;li&gt;Desarrollar una interfaz de usuario para el sistema, centrándose en las necesidades y objetivos de los usuarios.&lt;/li&gt;&lt;/ul&gt;Basado en el material del curso&lt;a href="http://www-304.ibm.com/jct03001c/services/learning/ites.wss/us/en?pageType=course_description&amp;amp;courseCode=RP401"&gt; PRJ270: Essentials of the Rational Unified Process V7.0&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-2245105761818103537?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KUUYLhYm40FvP9BVbjlr0VqLw-I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KUUYLhYm40FvP9BVbjlr0VqLw-I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KUUYLhYm40FvP9BVbjlr0VqLw-I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KUUYLhYm40FvP9BVbjlr0VqLw-I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/2245105761818103537/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=2245105761818103537" title="0 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/2245105761818103537?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/2245105761818103537?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2009/11/disciplina-requerimientos.html" title="Disciplina: Requerimientos" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_5IVIlML8wsI/SvSIJUnr5LI/AAAAAAAAAow/Sjd7v21KX-A/s72-c/post.JPG" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CU4MSXYzfip7ImA9WxFVE0w.&quot;"><id>tag:blogger.com,1999:blog-3011868110297097116.post-6446885922992592098</id><published>2009-11-06T14:48:00.003-05:00</published><updated>2010-06-11T22:39:48.886-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-11T22:39:48.886-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Guía IBM 839 : Rational Unified Process" /><category scheme="http://www.blogger.com/atom/ns#" term="IBM Certified Solution Designer - IBM Rational Unified Process V7.0" /><category scheme="http://www.blogger.com/atom/ns#" term="Certificación IBM" /><title>Disciplina: Modelamiento del Negocio</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_5IVIlML8wsI/SvR9sTar97I/AAAAAAAAAoo/pLSLAEOc2H4/s1600-h/post.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 249px; height: 320px;" src="http://3.bp.blogspot.com/_5IVIlML8wsI/SvR9sTar97I/AAAAAAAAAoo/pLSLAEOc2H4/s320/post.JPG" alt="" id="BLOGGER_PHOTO_ID_5401080053203990450" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;(Imagen: Diapostitivas del &lt;/span&gt;&lt;a style="font-weight: bold; font-style: italic;" href="http://www-304.ibm.com/jct03001c/services/learning/ites.wss/us/en?pageType=course_description&amp;amp;courseCode=RP401"&gt;curso de IBM&lt;/a&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Propósito: &lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Comprender los problemas de la organización objetivo e identificar oportunidades de mejora.&lt;/li&gt;&lt;li&gt;Asegurarse que los clientes y los usuarios finales tengan una comprensión similar de la organización objetivo.&lt;/li&gt;&lt;li&gt;Obtener requerimientos del sistema para dar soporte a la organización objetivo.&lt;/li&gt;&lt;li&gt;Comprender la estructura y la dinámica de la organización en donde se va a desplegar el sistema.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Esta disciplina usa un enfoque similar al de desarrollo de sistemas.&lt;br /&gt;&lt;br /&gt;El modelamiento de negocio sirve de entrada a la disciplina de &lt;span style="font-weight: bold;"&gt;Requerimientos&lt;/span&gt;, dado que los modelos de caso de uso del negocio ayudan a comprender los requerimientos del sistema e identificar casos de uso del sistema. Sirve también de entrada a la disciplina de &lt;span style="font-weight: bold;"&gt;análisis y diseño&lt;/span&gt;, ya que las entidades de negocio del modelo de análisis del negocio ayudan a identificar clases entidad del modelo de análisis&lt;br /&gt;&lt;br /&gt;Basado en el material del curso&lt;a href="http://www-304.ibm.com/jct03001c/services/learning/ites.wss/us/en?pageType=course_description&amp;amp;courseCode=RP401"&gt; PRJ270: Essentials of the Rational Unified Process V7.0&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3011868110297097116-6446885922992592098?l=certified-es.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8nHd5FLHfymx9jt04CQRMesmjiQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8nHd5FLHfymx9jt04CQRMesmjiQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8nHd5FLHfymx9jt04CQRMesmjiQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8nHd5FLHfymx9jt04CQRMesmjiQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://certified-es.blogspot.com/feeds/6446885922992592098/comments/default" title="Comentarios de la entrada" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3011868110297097116&amp;postID=6446885922992592098" title="0 Comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/6446885922992592098?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3011868110297097116/posts/default/6446885922992592098?v=2" /><link rel="alternate" type="text/html" href="http://certified-es.blogspot.com/2009/11/disciplina-modelamiento-del-negocio.html" title="Disciplina: Modelamiento del Negocio" /><author><name>Capitán Alatriste</name><uri>http://www.blogger.com/profile/05251475836524665876</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_5IVIlML8wsI/S1Od4yj0TTI/AAAAAAAAApg/gOa216v4mD0/S220/Untitled+197.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_5IVIlML8wsI/SvR9sTar97I/AAAAAAAAAoo/pLSLAEOc2H4/s72-c/post.JPG" height="72" width="72" /><thr:total>0</thr:total></entry></feed>

