<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1292532279691646783</id><updated>2012-01-26T18:12:14.982-03:00</updated><title type='text'>Modelos de Software con Objetos</title><subtitle type='html'>Mi idea es postear lo que conozco sobre modelar/desarrollar con objetos, en base a lo que damos en la materia de POO y DAO de la UBA y mi experiencia personal</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default?start-index=101&amp;max-results=100'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>155</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1297404188551587455</id><published>2012-01-26T18:11:00.000-03:00</published><updated>2012-01-26T18:12:14.986-03:00</updated><title type='text'>About "names" when designing with Objects</title><content type='html'>&lt;a href="http://tinyurl.com/6ndcnbs"&gt;http://tinyurl.com/6ndcnbs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hope you like it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-1297404188551587455?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1297404188551587455/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1297404188551587455' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1297404188551587455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1297404188551587455'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2012/01/about-names-when-designing-with-objects.html' title='About &quot;names&quot; when designing with Objects'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-4630735778798964674</id><published>2011-06-30T08:53:00.001-03:00</published><updated>2011-06-30T08:54:34.894-03:00</updated><title type='text'>FAST te ayuda a ir a ESUG 2011!</title><content type='html'>En FAST siempre estamos pensando la manera de hacer crecer la comunidad Argentina de Smalltalk. Es por ello que uno de nuestros objetivos siempre fue conectarnos y afianzar los lazos de amistad con las otras comunidades de Smalltalk del mundo.&lt;br /&gt;&lt;br /&gt;Nos da mucha alegría comunicar que, como acción para lograr este objetivo, nos propusimos este año ayudar económicamente con 3.000 pesos a un Smalltalker que quiera ir a la conferencia de ESUG que se realiza este año en Escocia. (Para más información sobre la conferencia ver: http://www.esug.org/wiki/pier/Conferences/2011). &lt;br /&gt;&lt;br /&gt;¿Quiénes pueden participar?&lt;br /&gt;Hay dos requisitos para los que deseen presentarse:&lt;br /&gt;1) Deben tener aceptada algún tipo de presentación en la conferencia, ya sea un paper de investigación, una charla en el área de desarrollo o participar del "Innovation Technology Award".&lt;br /&gt;2) El viaje no debe estar subsidiado totalmente por la empresa/universidad donde trabajan (más información abajo)&lt;br /&gt;&lt;br /&gt;¿Qué hay que hacer? &lt;br /&gt;Es muy sencillo, simplemente mandar un mail a quieroIrAEsug2011@fast.org.ar con el subject: QUIERO IR A ESUG 2011, indicando nombre, apellido, y qué presentación realizarás (ya sea paper, presentación o sistema como parte del innovation technology award).&lt;br /&gt;&lt;br /&gt;¿Hasta cuándo hay tiempo?&lt;br /&gt;Los pedidos serán aceptados hasta el 8 de Julio del 2011 inclusive&lt;br /&gt;&lt;br /&gt;¿Cuándo sabré si salí sorteado?&lt;br /&gt;El resultado del sorteo será comunicado el 13 de Julio del 2011&lt;br /&gt;&lt;br /&gt;¿Cómo se realizará el sorteo?&lt;br /&gt;Se ordenará la lista de personas que se presentaron de manera random, &lt;br /&gt;El que quede primero en la lista será el ganador del sorteo.&lt;br /&gt;Si por algún motivo la persona ganadora del sorteo no puede ir, se lo sacará de la lista y el siguiente será el acreedor del sorteo. Así sucesivamente hasta que la persona ganadora acepte y utilice el premio.&lt;br /&gt;&lt;br /&gt;¿Si gané, cuando recibiré la plata y cómo?&lt;br /&gt;La plata se entregará por medio de una transferencia bancaria 5 días hábiles después de haber ganado el sorteo.&lt;br /&gt;Para recibir el dinero deberá presentar una copia del pago de la registración a ESUG y del pago del pasaje de avión. Si luego de pasados esos 5 días dicha presentación no se realiza, el premio será acreditado a la siguiente persona en la lista.&lt;br /&gt;&lt;br /&gt;¿La empresa donde trabajo me paga el viaje y el congreso, puedo participar?&lt;br /&gt;No. Este sorteo es para aquellas personas que irán a ESUG por sus propios medios, ya sea de manera parcial o total.&lt;br /&gt;Se utilizará la copia del pago de la registración y del pago del pasaje de avión para comprobar que esto sea así.&lt;br /&gt;&lt;br /&gt;¿La empresa donde trabajo/universidad donde hago investigación me ayuda con un porcentaje del costo, puedo participar?&lt;br /&gt;Sí, siempre y cuando el total que otorguemos más lo que aporte la empresa/universidad donde trabajás no supere el costo total del viaje (pasaje de avión, hospedaje y registración al congreso)&lt;br /&gt;La intención es otorgar este dinero a gente que realmente lo necesite, confiamos en que se abstendrán aquellos que no cumplan con este requisito. &lt;br /&gt;&lt;br /&gt;¿Dudas?&lt;br /&gt;Mandar un mail a quieroIrAEsug2011@fast.org.ar&lt;br /&gt;&lt;br /&gt;Realmente nos da mucha alegría poder ayudar de esta manera, esperamos que a ustedes también.&lt;br /&gt;Go Smalltalk!&lt;br /&gt;&lt;br /&gt;FAST: Fundación Argentina de Smalltalk &lt;br /&gt;http://www.fast.org.ar&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-4630735778798964674?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/4630735778798964674/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=4630735778798964674' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4630735778798964674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4630735778798964674'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2011/06/fast-te-ayuda-ir-esug-2011.html' title='FAST te ayuda a ir a ESUG 2011!'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-2936524652902104633</id><published>2011-06-22T09:40:00.001-03:00</published><updated>2011-06-22T09:40:49.755-03:00</updated><title type='text'>Smalltalks 2011 Call for Papers</title><content type='html'>CALL FOR PAPERS&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SMALLTALKS 2011&lt;br /&gt;5th International Conference on Smalltalk Technologies&lt;br /&gt;Research Track: Call for Papers&lt;br /&gt;November 3th - 5th, 2011&lt;br /&gt;&lt;br /&gt;Important dates:&lt;br /&gt;&lt;br /&gt;Submission (Hard Deadline): August 22th, 2011 (Argentinian time:&lt;br /&gt;UTC/GMT -3 hours).&lt;br /&gt;Notification of acceptance: September 23th, 2011.&lt;br /&gt;Camera Ready Submission: October 7th, 2011.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Conference Location: Universidad Nacional de Quilmes (Argentina)&lt;br /&gt;&lt;br /&gt;The Smalltalks series of conferences (www.fast.org.ar) is a lively&lt;br /&gt;forum on Smalltalk-based software&lt;br /&gt;technologies that brings together more than 200 people from both&lt;br /&gt;academia and industry for a period of three days.&lt;br /&gt;&lt;br /&gt;Past editions of Smalltalks have included many high-quality&lt;br /&gt;presentations from industry and research.&lt;br /&gt;These contributions have shown interesting applications of Smalltalk,&lt;br /&gt;advances in the Smalltalk language, didactic uses of Smalltalk and so&lt;br /&gt;on.&lt;br /&gt;&lt;br /&gt;Similar to last year, Smalltalks 2011 will include a dedicated research&lt;br /&gt;track.&lt;br /&gt;We welcome submissions to this research track presenting original&lt;br /&gt;scientific contributions to, or using, Smalltalk in general.&lt;br /&gt;&lt;br /&gt;Topics of interest include, but are not restricted to:&lt;br /&gt;&lt;br /&gt;-        Aspects, Aspect Languages and Applications.&lt;br /&gt;-        Ambient Intelligence, Ubiquitous / Pervasive Computing and&lt;br /&gt;Embedded Systems.&lt;br /&gt;-        Compilation Technology, Optimization, Virtual Machines.&lt;br /&gt;-        Educational Material.&lt;br /&gt;-        Language Engineering, Extensions.&lt;br /&gt;-        Model Driven Engineering / Development.&lt;br /&gt;-        Meta-Modeling, Reflection and Meta-programming.&lt;br /&gt;-        Programming in the Large, Design, Architectures and Components.&lt;br /&gt;-        Programming Environments, Browsers, User Interfaces, UI Frameworks.&lt;br /&gt;-        Source-code analysis and manipulation (Static analysis,&lt;br /&gt;refactoring, type inference, metrics).&lt;br /&gt;-        Team Management.&lt;br /&gt;-        Testing, Extreme Programming / Practices.&lt;br /&gt;-        Web Services, Internet Applications, Event-driven Programming.&lt;br /&gt;-        Experience Reports.&lt;br /&gt;&lt;br /&gt;Important dates:&lt;br /&gt;&lt;br /&gt;Submission (Hard Deadline): August 22th, 2011 (Argentinian time:&lt;br /&gt;UTC/GMT -3 hours).&lt;br /&gt;Notification of acceptance: September 23th, 2011.&lt;br /&gt;Camera Ready Submission: October 7th, 2011.&lt;br /&gt;&lt;br /&gt;Papers:&lt;br /&gt;&lt;br /&gt;Papers should be written in English, in PDF-format and should not exceed 15&lt;br /&gt;pages (including references and figures), using the Elsevier journal format.&lt;br /&gt;&lt;br /&gt;Templates for LaTeX formats can be found at&lt;br /&gt;http://www.elsevier.com/wps/find/authorsview.authors/elsart&lt;br /&gt;&lt;br /&gt;Papers must be submitted through the EasyChair submission web site at&lt;br /&gt;https://www.easychair.org/conferences/?conf=smalltalks2011&lt;br /&gt;&lt;br /&gt;The accepted papers will be digitally available on the conference&lt;br /&gt;website. We are currently negotiating a special edition of a journal&lt;br /&gt;for which the best papers will get invited.&lt;br /&gt;&lt;br /&gt;Papers submitted must not have been previously published and must not be&lt;br /&gt;under review for publication elsewhere. Papers must strictly adhere to&lt;br /&gt;submission guidelines. If you have questions, please send an e-mail to&lt;br /&gt;Jannik Laval and Andy Kellens to smalltalks2011-chair@fast.org.ar.&lt;br /&gt;&lt;br /&gt;Program Committee&lt;br /&gt;--------------------------&lt;br /&gt;- Gonzalo Zabala (Universidad Abierta Interamericana, Argentina)&lt;br /&gt;- Hernan Wilkinson (Universidad de Buenos Aires, Argentina)&lt;br /&gt;- Serge Stinckwich (Institut de recherche pour le developppement, France)&lt;br /&gt;- Mircea Lungu (University of Bern, Switzerland)&lt;br /&gt;- Tudor Girba (Sw-eng. Software Engineering GmbH, Switzerland)&lt;br /&gt;- Johan Fabry (DCC, Universidad de Chile, Chile)&lt;br /&gt;- Luc Fabresse (Ecole des Mines Douai, France)&lt;br /&gt;- Marcus Denker (INRIA Lille, France)&lt;br /&gt;- Coen De Roover (Vrije Universiteit Brussel, Belgium)&lt;br /&gt;- Damien Cassou (Hasso-Plattner-Institut, Potsdam, Germany)&lt;br /&gt;- Gilad Bracha (SAP Labs, Palo Alto, USA)&lt;br /&gt;- Noury Bouraqadi (Ecole des Mines Douai, France)&lt;br /&gt;- Alexandre Bergel (DCC, Universidad de Chile, Chile)&lt;br /&gt;- Gabriela Arevalo (Universidad Nacional de Quilmes, Argentina)&lt;br /&gt;&lt;br /&gt;Program Chairs&lt;br /&gt;--------------------&lt;br /&gt;Andy Kellens (Vrije Universiteit Brussel, Belgium)&lt;br /&gt;Jannik Laval (INRIA Lille/LABRI Bordeaux, France)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-2936524652902104633?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/2936524652902104633/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=2936524652902104633' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2936524652902104633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2936524652902104633'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2011/06/smalltalks-2011-call-for-papers.html' title='Smalltalks 2011 Call for Papers'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-8023476183386704846</id><published>2011-03-01T08:04:00.001-03:00</published><updated>2011-03-01T08:05:35.329-03:00</updated><title type='text'>Estamos sorteando un lugar en el curso de TDD</title><content type='html'>Para aquellos que están interesados en participar en el curso, les comento que estamos sorteando un lugar. Para anotarse vayan a http://tinyurl.com/4s35vsh&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-8023476183386704846?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/8023476183386704846/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=8023476183386704846' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8023476183386704846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8023476183386704846'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2011/03/estamos-sorteando-un-lugar-en-el-curso.html' title='Estamos sorteando un lugar en el curso de TDD'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-8448735497017055769</id><published>2011-02-10T10:06:00.003-03:00</published><updated>2011-02-10T10:10:35.343-03:00</updated><title type='text'>FAST ayuda a Guido y Javier a ir a la Deep Into Smalltalk School en INRIA</title><content type='html'>En FAST (http://www.fast.org.ar) estamos muy contentos de haber podido ayudar a Guido Chari y Javier Pimas en su viaje a Francia para participar en la "Deep into Smalltalk School" (http://rmod.lille.inria.fr/web/pier/blog/2011-01-23) que el Inria está organizando con soporte de ESUG.&lt;br /&gt;Además de organizar las conferencias de Smalltalk uno de nuestros objetivos es poder ayudar a la comunidad de Smalltalk Argentina en todo lo referente a la investigación y promoción industrial de Smalltalk.&lt;br /&gt;Guido y Javier están terminando su tesis de licenciatura sobre SqueakNos y luego de este curso serán especialistas en la VM de Smalltalk!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-8448735497017055769?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/8448735497017055769/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=8448735497017055769' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8448735497017055769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8448735497017055769'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2011/02/fast-ayuda-guido-y-javier-ir-la-deep.html' title='FAST ayuda a Guido y Javier a ir a la Deep Into Smalltalk School en INRIA'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-7296513864718205054</id><published>2010-10-15T17:48:00.003-03:00</published><updated>2010-10-15T17:49:52.521-03:00</updated><title type='text'>Entrevista sobre por qué Smalltalk es tan importante en Argentina</title><content type='html'>Este año durante ESUG, nos hicieron una entrevista a Leandro Caniglia y a mi sobre por qué creíamos que Smalltalk era tan importante en Argentina. &lt;br /&gt;Pueden verla en &lt;a href="http://blip.tv/file/4211623/"&gt;http://blip.tv/file/4211623/&lt;/a&gt;&lt;br /&gt;Por supuesto que es una visión subjetiva de los motivos, pero espero que les guste.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-7296513864718205054?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/7296513864718205054/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=7296513864718205054' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7296513864718205054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7296513864718205054'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2010/10/entrevista-sobre-por-que-smalltalk-es.html' title='Entrevista sobre por qué Smalltalk es tan importante en Argentina'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-3637502820441460949</id><published>2010-10-14T21:52:00.002-03:00</published><updated>2010-10-14T21:57:49.123-03:00</updated><title type='text'>TDD en lenguajes estáticamente tipados y dinámicamente tipados</title><content type='html'>Subí un video que compara cómo se comporta la técnica de Test Driven Development (TDD) utilizando lenguajes estáticamente tipados (en este caso Java) y dinámicamente tipado (en este caso Smalltalk). El video está divididó en dos partes:&lt;br /&gt;&lt;br /&gt;1) &lt;a href="http://www.youtube.com/watch?v=RLAZjiK4UHc"&gt;http://www.youtube.com/watch?v=RLAZjiK4UHc&lt;/a&gt;&lt;br /&gt;2) &lt;a href="http://www.youtube.com/watch?v=wXW9WN9ay2E"&gt;http://www.youtube.com/watch?v=wXW9WN9ay2E&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Traté de ser lo más objetivo posible. Por supuesto, es solo un experimiento y no se puede inferir todas las diferencias que ya conocemos entre estos tipos de lenguajes, pero sí puede servir como punto de partida para investigar un poco más el tema.&lt;br /&gt;Espero que les gusten las conclusiones :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-3637502820441460949?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/3637502820441460949/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=3637502820441460949' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3637502820441460949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3637502820441460949'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2010/10/tdd-en-lenguajes-estaticamente-tipados.html' title='TDD en lenguajes estáticamente tipados y dinámicamente tipados'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-3109266989839995684</id><published>2010-10-12T14:28:00.002-03:00</published><updated>2010-10-12T14:29:02.286-03:00</updated><title type='text'>Entrada gratis para el curso de TDD!!</title><content type='html'>Vamos a sortear una entrada gratis para el curso de TDD (http://tinyurl.com/25n4zwq) este jueves 14 en http://tinyurl.com/2du3yox &lt;br /&gt;Aprovechen!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-3109266989839995684?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/3109266989839995684/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=3109266989839995684' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3109266989839995684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3109266989839995684'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2010/10/entrada-gratis-para-el-curso-de-tdd.html' title='Entrada gratis para el curso de TDD!!'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-3325280381089307417</id><published>2010-10-05T15:17:00.001-03:00</published><updated>2010-10-05T15:18:50.228-03:00</updated><title type='text'>TDD practicado en lenguajes dinámicos vs. lenguajes estáticos</title><content type='html'>eEte jueves 7 de octubre a las 18.30, en el grupo argentino de Ruby en Urban Station, El Salvador 4588 en Palermo Soho voy a dar una charla sobre TDD practicado en lenguajes dinámicos vs. lenguajes estáticos. Acá está la breve descripción:&lt;br /&gt;La charla se centra en mostrar las diferencias esenciales que surgen al utilizar la técnica de Test Driven Development (TDD) en lenguajes dinámicos como Ruby respecto de lenguajes estáticos como Java.&lt;br /&gt;Se hará una pequeña introducción sobre TDD y una demostración en vivo de las diferencias utilizando para ello otro lenguaje dinámico, Smalltalk, antecesor de Ruby y Java como lenguaje estático.&lt;br /&gt;Los espero!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-3325280381089307417?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/3325280381089307417/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=3325280381089307417' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3325280381089307417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3325280381089307417'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2010/10/tdd-practicado-en-lenguajes-dinamicos.html' title='TDD practicado en lenguajes dinámicos vs. lenguajes estáticos'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-9008775155007473359</id><published>2010-09-27T21:49:00.002-03:00</published><updated>2010-09-27T21:54:01.252-03:00</updated><title type='text'>Smalltalks 2010 - Declarado de Interés Provincial</title><content type='html'>La provincia de Entre Ríos declaró de Interés Provincial a la 4ta conferencia de Smalltalk en Argentina, Smalltalks!&lt;br /&gt;No se imaginan lo contento que estamos!! Por más que sea una cuestión formal, es una gran reconocimiento hacia el evento, la comunidad de Smalltalk en Argentina y Smalltalk, así que estamos más que contentos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-9008775155007473359?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/9008775155007473359/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=9008775155007473359' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/9008775155007473359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/9008775155007473359'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2010/09/smalltalks-2010-declarado-de-interes.html' title='Smalltalks 2010 - Declarado de Interés Provincial'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1331987868315405093</id><published>2010-09-22T14:55:00.004-03:00</published><updated>2010-09-22T15:06:06.725-03:00</updated><title type='text'>Smalltalks 2010 - Inscripción abierta!!</title><content type='html'>Ya está abierta la inscripción para Smalltalks 2010! pueden registrase en &lt;a href="http://www.fast.org.ar/"&gt;http://www.fast.org.ar/&lt;/a&gt;&lt;br /&gt;Este año lo hacemos en Concepción del Uruguay, Entre Rios, a solo 3 horas de Buenos Aires. Estamos arreglando descuentos con hoteles para aquellos que lo necesiten.&lt;br /&gt;Además tenemos confirmada la visita de &lt;a href="http://www.lukas-renggli.ch/"&gt;Lukas Renggli&lt;/a&gt; (creador de SeaSide entre otras cosas) y &lt;a href="http://bracha.org/Site/Home.html"&gt;Gilad Bracha&lt;/a&gt; (creador de Newspeak). Tenemos un par de personalidades más en tratativas, así que no dejen de anotarse y presentarnos sus trabajos, va a ser una conferencia muy interesante!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-1331987868315405093?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1331987868315405093/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1331987868315405093' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1331987868315405093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1331987868315405093'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2010/09/smalltalks-2010-inscripcion-abierta.html' title='Smalltalks 2010 - Inscripción abierta!!'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-8841655188380806804</id><published>2010-09-07T20:56:00.004-03:00</published><updated>2010-09-07T21:01:03.353-03:00</updated><title type='text'>Curso de Test Driven Development para todos!</title><content type='html'>Tengo el agrado de notificarles que está abierta la inscripción a uno de los cursos de &lt;span style="font-weight:bold;"&gt;Test Driven Development&lt;/span&gt; (TDD) que ofrecemos en 10Pines, el cual se denomina &lt;span style="font-weight:bold;"&gt;“Construcción de Software Robusto con Test Driven Development”&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/span&gt; a realizarse a partir del 15 de noviembre del corriente año.&lt;br /&gt;Test Driven Development (TDD) es una de las prácticas ágiles que más adopción tuvo dentro de la comunidad de desarrollo de software debido a su simplicidad como proceso y efectividad directamente relacionada con la calidad del sistema generado. TDD ayuda a producir diseños más simples y menos acoplados, creando al mismo tiempo un gran conjunto de test que nos dan “&lt;span style="font-weight:bold;"&gt;coraje&lt;/span&gt;” al momento de realizar cambios o incrementar la funcionalidad de un sistema. Hay estudios que muestran que usando TDD, la tasa de error de los sistemas disminuye 10 veces aumentando al mismo tiempo la satisfacción laboral y técnica de los desarrolladores.&lt;br /&gt;  El curso, de 16 hrs, posee una breve introducción teórica para luego concentrarse en ejercicios prácticos especialmente preparados para que los asistentes aprendan la técnica.&lt;br /&gt;  Pero como el nombre del curso lo indica, este no se centra únicamente en TDD sino en la construcción de software robusto, por lo tanto además de aprender la técnica de TDD,  se realizarán &lt;span style="font-weight:bold;"&gt;discusiones enriquecedoras de diseño y arquitectura&lt;/span&gt; que les permitirá complementar, validar y aumentar tus conocimientos sobre el desarrollo de software utilizando objetos.&lt;br /&gt;  Para más información sobre los objetivos, días, disponibilidad y costos del curso, hace click acá: &lt;a href="http://www.10pines.com/content/construccion-de-software-robusto-con-tdd"&gt;Construcción de Software Robusto con Test Driven Development&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight:bold;"&gt;Los espero!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-8841655188380806804?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/8841655188380806804/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=8841655188380806804' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8841655188380806804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8841655188380806804'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2010/09/curso-de-test-driven-development-para.html' title='Curso de Test Driven Development para todos!'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-4092788822455819507</id><published>2010-08-30T11:03:00.002-03:00</published><updated>2010-08-30T11:26:04.155-03:00</updated><title type='text'>Por qué las base de datos relacionales van a desaparecer</title><content type='html'>Si, si, es una predicción medio loca y hasta pareciera absurda dado el estado actual de tecnologías, pero hay mucho indicios que me llevan a pensar lo que puse en el título. &lt;br /&gt;En realidad, son todos indicios tecnológicos y no de negocios, pero como nuestra profesión se basa en la tecnología creo que en algún momento se hará fuerte una tecnología que desplazará a las base de datos relacionales de la misma manera que ellas desplazaron a los archivos jerárquicos (como vsam, etc).&lt;br /&gt;Lo que me llevó a pensar esto nuevamente es un proyecto en el cual estoy haciendo coaching en el cual estamos usando Java como lenguaje de programación y Hibernate para conectarnos a una base de datos relacional. Hubo dos "colaboraciones" que me hicieron recordar lo antiguo de esta tecnología:&lt;br /&gt;&lt;br /&gt;1) Cada vez que se quiere persistir un objeto, hay que hacer: session.save(anObject)&lt;br /&gt;2) Cada vez que se quiere borrar un objeto, hay que hacer: session.delete(anObject)&lt;br /&gt;&lt;br /&gt;¿Qué tiene de malo tener que hacer esto? Simplemente que en otras tecnologías no es necesario hacerlo! por lo tanto son más simples desde el punto de vista de utilización  lo que implica que son menos propensas a error. &lt;br /&gt;Para el caso 1), en una tecnología como la que usa GemStone, no es necesario decirle a un objeto que quiero que se persista, simplemente si ese objeto es referenciado desde un objeto persistido, este se persiste. Simple, natural, lógico.&lt;br /&gt;El caso 2) es quizá el más fuerte puesto que me hizo acordar al manejo de memoria manual, ¿recuerdan c++, tener que hacer "delete anObject" para desalocarlo y todos los problemas que ello conllevaba? Acá estamos en el mismo caso, utilizar base de datos relacionales es como utilizar un manejo de memoria manual algo que por suerte ya está abandonado (salvo para casos muy particulares). ¿Por qué tenemos que borrar un objeto explícitamente cuando el mismo puede desaparecer automáticamente, como cuando se realiza un garbage collect?. Por suerte ya hay tecnologías que hacen esto (de vuelta GemStone) y "borran" objetos cuando los mismos no están más referenciados. Simple, natural, lógico.&lt;br /&gt;Creo que estos dos casos son indicios que muestran que trabajar con base de datos relacionales en algún momento tiene que cambiar. En algún momento nos tenemos que dar cuenta que trabajar con ellas es trabajar en un paradigma "viejo", similar al procedural donde se separan "datos" de "código", en vez de utilizar un paradigma que ya está probado ser más robusto y escalable para desarrollo de aplicaciones como el de objetos.&lt;br /&gt;Claro está que la base de datos relacionales tienen sus ventajas. Por ahí la más fuerte desde el punto de vista tecnológico es el SQL, pero al mismo tiempo para mi es su cruz, es lo que no va a permitir que la tecnología evolucione, cambie paradigmáticamente. Y por supuesto no hay que dejar de ver la fuerza comercial que ellas tienen, pero como dije antes, en algún momento la comunidad estará preparada para algo nuevo, distinto, cuando se cansen de tener que hacer save y delete y se den cuenta que si en memoria no hay que hacer eso, ¿por qué hay que hacerlo con el disco?, en definitiva el disco es "memoria" y debería estar abstraído (salvo cuando hay que hacer aplicaciones que deben diferenciarlos :-) ).&lt;br /&gt;Claro está que a los dos problemas que mencioné hay que agregar varios más, como el problemático mapeo, manejo de identidad, manejo de caching y unicidad, etc., problemas que en otras tecnologías no existen...&lt;br /&gt;Para concluir, ¿cuándo pasará esto? No creo que rápidamente... de la misma manera que a las base de datos relacionales les costó desplazar a los archivos planos y jerárquicos, no será inmediato reemplazar a estas. Por ahí en 10 años se empiece a divisar y entender que hay una alternativa a ellas, no creo que antes, a menos que aparezca un player nuevo en la comunidad, un player que sea respetado y tenga fuerza y logre imponer el quiebre paradigmático... por ahí ese player puede ser VMWare si se da cuenta del productozo que compró (GemStone), pero habrá que ver si sus "gurús" logran salirse del paradigma actual y ver más allá... el tiempo dirá.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-4092788822455819507?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/4092788822455819507/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=4092788822455819507' title='8 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4092788822455819507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4092788822455819507'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2010/08/por-que-las-base-de-datos-relacionales.html' title='Por qué las base de datos relacionales van a desaparecer'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-734033838865369617</id><published>2010-08-29T14:25:00.003-03:00</published><updated>2010-08-29T14:34:08.244-03:00</updated><title type='text'>¿A quién le creo?</title><content type='html'>Este comentario no tiene nada que ver con objetos ni sistemas, sino más bien con la realidad que nos está golpeando a los argentinos respecto de los medios de comunicación. &lt;br /&gt;El viernes mientras caminaba hacia un cliente para dar un coaching de TDD me encontré con un kiosko que tenía a los diarios Clarín y Tiempo Argentino juntos, motivo por el cual pude observar una contradicción impresionante sobre la misma noticia en la primera plana de ambos diarios. &lt;br /&gt;Clarín decía: "Papaleo declaró que estaba libre cuando vendió Papel Prensa". (ver &lt;a href="http://www.clarin.com/ediciones-anteriores/edicion-impresa/20100827"&gt;http://www.clarin.com/ediciones-anteriores/edicion-impresa/20100827&lt;/a&gt;)&lt;br /&gt;Tiempo Argentino decía: "Papaleo ratificó que entregó Papel Prensa bajo presión" (ver &lt;a href="http://tiempo.elargentino.com/ediciones/2010-08-27/notas"&gt;http://tiempo.elargentino.com/ediciones/2010-08-27/notas&lt;/a&gt;)&lt;br /&gt;¿Quién dice la verdad? Clarín? Tiempo Argentino? Ninguno? o los dos? ¿Qué contradicción no?.&lt;br /&gt;Sinceramente no me inclino por Clarín, ya se han visto tantas manipulaciones que realizó que seguro esta es otra más. ¿Qué ha acerca de Tiempo Argentino? Es oficialista y nos han hecho creer que generalmente ser oficialista está mal y que los políticos siempre mienten, ah, pero claro, los que nos han metido en la cabeza eso fueron los periodistas (y también bastante los políticos con su actuar realmente)... ¿entonces?...&lt;br /&gt;Finalmente me quedo con lo que me recordó mi viejo hoy por la mañana: "En una guerra la primero que pierde es la verdad"... creo que este es un ejemplo claro.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-734033838865369617?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/734033838865369617/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=734033838865369617' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/734033838865369617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/734033838865369617'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2010/08/quien-le-creo.html' title='¿A quién le creo?'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-7915185000837454138</id><published>2010-08-06T09:53:00.002-03:00</published><updated>2010-08-06T11:14:47.184-03:00</updated><title type='text'>Tributo a Alan Kay en su cumpleaños 70</title><content type='html'>La gente de ViewPoints ha publicado un &lt;a href="http://vpri.org/pov/"&gt;libro&lt;/a&gt; (que se puede bajar on-line) como tributo a Alan Kay en el cual personas que trabajaron con él escribieron un capítulo cada uno. Hay varios capítulos interesantes como por supuesto el de Adele Goldberg, con un poco de historia también... Por ejemplo no sabía que el primer "cliente" comercial de Smalltalk fue la CIA!!! jaja, increíble... menos mal que no lo siguieron usando o por lo menos no sabemos si lo siguen usado... o por ahí el motivo por el cual Smalltalk no creció más fue por que la CIA no quizo!! claro! por fin lo entiendo :-) y bue, la teoría conspirativa siempre tiene que estar presente :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-7915185000837454138?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/7915185000837454138/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=7915185000837454138' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7915185000837454138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7915185000837454138'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2010/08/tributo-alan-kay-en-su-cumpleanos-70.html' title='Tributo a Alan Kay en su cumpleaños 70'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-5675976214480446232</id><published>2010-08-04T17:56:00.002-03:00</published><updated>2010-08-04T18:03:19.708-03:00</updated><title type='text'>Working effectively...</title><content type='html'>with legacy code... Ese es el nombre de un libro que estuve hojeando (últimamente me cuesta mucho leer libros técnicos, me aburren!! lo cual no es un buen sintoma...) que está interesante, es recomendable pero que muestra nuevamente la cantidad de problemas que surgen en el mantenimiento de sistemas desarrollados con lenguajes estáticamente tipados. &lt;br /&gt;Básicamente, el mayor problema es el acoplamiento que produce tipar las variables lo cual impede al momento de tener que escribir tests para código existente utilizar objetos que simplemente sean polimórficos con los objetos reales pero solamente para el conjunto de mensajes que se le envían y no para todo el protocolo declarado en el tipo!&lt;br /&gt;Si, ok, están los mock objects y sus librerías para hacer su uso más fácil, pero igual sigue siendo más laburo del necesario o por lo menos del que llevaría en un lenguaje dinámicamente tipado como Smalltalk...&lt;br /&gt;Por último, el libro muestra muchos errores de diseño típicos muy interesantes que haciendo TDD desde el comienzo no se cometerían que nuevamente tienen que ver con lograr diseños más desacoplados, algo que venimos comentando en nuestro curso de TDD desde que empezamos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-5675976214480446232?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/5675976214480446232/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=5675976214480446232' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/5675976214480446232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/5675976214480446232'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2010/08/working-effectively.html' title='Working effectively...'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1604346595451860396</id><published>2010-08-04T17:50:00.002-03:00</published><updated>2010-08-04T17:56:41.784-03:00</updated><title type='text'>Para los que aman la historia de nuestra profesión...</title><content type='html'>como yo, salió una entrevista a Edgar Dijkstra realizada en el 2001 en la última Computer. La verdad, muy recomendable para conocer un poco más sobre el principio de nuestra profesión con comentarios sobre Algol-60, Peter Naur, Hoare, N. Wirth (y su relación con el paper de GOTO Considered Harmfull)... y como no podía faltar, la comparación USA/Europa que propició el comentario de Alan Kay en su Turing Award Lecture.&lt;br /&gt;La entrevista completa está online para todos en: &lt;a href="http://www.cbi.umn.edu/oh/display.phtml?id=320"&gt;http://www.cbi.umn.edu/oh/display.phtml?id=320&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-1604346595451860396?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1604346595451860396/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1604346595451860396' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1604346595451860396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1604346595451860396'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2010/08/para-los-que-aman-la-historia-de.html' title='Para los que aman la historia de nuestra profesión...'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-5184786082815948208</id><published>2010-06-22T09:16:00.003-03:00</published><updated>2010-06-22T09:36:26.697-03:00</updated><title type='text'>Smalltalks 2010 Research Track: Call for Papers</title><content type='html'>Con esto, queda oficialmente anunciado el congreso Smalltalks 2010!!!&lt;br /&gt;Este año lo haremos en la UTN de Concepción del Uruguay, Entre Rios. &lt;br /&gt;Estamos muy contentos de poder hacerlo ahí, una facultad que ha hecho mucho por Smalltalk y ha traido mucha gente a todos los congresos, y estamos muy contentos de poder hacerlo en otra ciudad que no sea Buenos Aires puesto que nuestro objetivo es llevar Smalltalk a todo el país.&lt;br /&gt;Por favor! miren que comité tenemos!!! la put... una maravilla (todo laburo de Gabriela Arevalo, grande Gaby!!)&lt;br /&gt;Para la gente de Buenos Aires, les comento que estamos trabajando para hacer que el viaje y hospedaje sea factible para todos. &lt;br /&gt;Personalmente creo que esta bueno salir un poco de la "gran ciudad", conocer otros lugares de nuestro país y apoyar la difusión de Smalltalk de esta manera, espero que puedan apoyarnos en esta iniciativa!&lt;br /&gt;--------------------------------------------------------------------------------------------&lt;br /&gt; CALL FOR PAPERS&lt;br /&gt;&lt;br /&gt; SMALLTALKS 2010&lt;br /&gt; 4th Argentinian Smalltalk Conference&lt;br /&gt; Research Track: Call for Papers&lt;br /&gt; November 11th – 13th, 2010&lt;br /&gt; Important dates:&lt;br /&gt; Submission (Hard Deadline): September 7th, 2010 (Argentinian time: UTC/GMT&lt;br /&gt; -3 hours).&lt;br /&gt; Notification of acceptance: October 6th, 2010.&lt;br /&gt; Camera Ready Submission: October 20th, 2010.&lt;br /&gt; ---------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt; Conference Site: Universidad Tecnológica Nacional (UTN), Concepción del&lt;br /&gt; Uruguay (Entre Ríos, Argentina)&lt;br /&gt;&lt;br /&gt; In the past three years the Smalltalks series of conferences (www.fast.org.ar)&lt;br /&gt; have been a lively forum on Smalltalk-based software technologies that&lt;br /&gt; attracted over more than 200 people from both academia and industry for&lt;br /&gt; three days.&lt;br /&gt;&lt;br /&gt; During the first three conferences, the industrial partners showed the&lt;br /&gt; applicability of Smalltalk in business, while researches (both students and&lt;br /&gt; professors) showed their advances and didactic uses of Smalltalk. The&lt;br /&gt; presented&lt;br /&gt; approaches and methodologies concerned the language, its implementation&lt;br /&gt;  technology, its programming tools as well as the software development&lt;br /&gt; culture it supports.&lt;br /&gt;&lt;br /&gt; This year the accepted papers not only will be available in the website but&lt;br /&gt; also the best ranked ones will be published in a special edition of Elsevier&lt;br /&gt; COMLAN Journal. Thus, we invite to submit papers in the research track on&lt;br /&gt; original scientific research conducted in and/or for Smalltalk in general.&lt;br /&gt;&lt;br /&gt; Topics of interest include, but are not restricted to:&lt;br /&gt;&lt;br /&gt; •        Aspects, Aspect Languages and Applications.&lt;br /&gt; •        Ambient Intelligence, Ubiquitous / Pervasive Computing and Embedded&lt;br /&gt; Systems.&lt;br /&gt; •        Compilation Technology, Optimization, Virtual Machines.&lt;br /&gt; •        Educational Material.&lt;br /&gt; •        Language Engineering, Extensions.&lt;br /&gt; •        Model Driven Engineering / Development.&lt;br /&gt; •        Meta-Modeling, Reflection and Meta-programming.&lt;br /&gt; •        Programming in the Large, Design, Architectures and Components.&lt;br /&gt; •        Programming Environments, Browsers, User Interfaces, UI&lt;br /&gt; Frameworks.&lt;br /&gt; •        Reasoning About Code (Analysis, Refactoring, Type Inference,&lt;br /&gt; Metrics).&lt;br /&gt; •        Team Management.&lt;br /&gt; •        Testing, Extreme Programming / Practices.&lt;br /&gt; •        Web Services, Internet Applications, Event-driven Programming.&lt;br /&gt; •        Experience Reports.&lt;br /&gt;&lt;br /&gt; Important dates:&lt;br /&gt;&lt;br /&gt; Submission (Hard Deadline): September 7th, 2010 (Argentinian time: UTC/GMT&lt;br /&gt; -3 hours).&lt;br /&gt; Notification of acceptance: October 6th, 2010.&lt;br /&gt; Camera Ready Submission: October 20th, 2010.&lt;br /&gt;&lt;br /&gt; Papers:&lt;br /&gt;&lt;br /&gt; Papers should be written in English, in pdf-format and not exceed 15 pages&lt;br /&gt; (including references and figures), using Elsevier journal format.&lt;br /&gt;&lt;br /&gt; Templates for LaTeX formats can be found at&lt;br /&gt; http://www.elsevier.com/wps/find/authorsview.authors/elsart&lt;br /&gt;&lt;br /&gt; Papers must be submitted through the EasyChair submission web site at&lt;br /&gt;  http://www.easychair.org/conferences/?conf=smalltalks10&lt;br /&gt; The accepted papers will be digitally available in the conference website.&lt;br /&gt; From accepted papers, selected ones will be published in a special edition&lt;br /&gt; of Elsevier COMLAN Journal.&lt;br /&gt;&lt;br /&gt; Papers submitted must not have been previously published and must not be&lt;br /&gt; under review for publication elsewhere. Papers must strictly adhere to&lt;br /&gt; submission guidelines. If you have questions, please send an e-mail to&lt;br /&gt; Marcus Denker and Gabriela Arévalo to smalltalks2010-chair@fast.org.ar using&lt;br /&gt; [Smalltalks2010-RT] as tag in the e-mail subject.&lt;br /&gt;&lt;br /&gt; Program Committee&lt;br /&gt; --------------------------&lt;br /&gt; •        Alexandre Bergel (DCC, Universidad de Chile, Chile)&lt;br /&gt; •        Noury Bouraqadi (Ecole des Mines, Douai, France)&lt;br /&gt; •        Gilad Bracha (Ministry of Truth, USA)&lt;br /&gt; •        Johan Brichau (Inceptive.be, Belgium)&lt;br /&gt; •        Johan Fabry (DCC, Universidad de Chile, Chile)&lt;br /&gt; •        Alejandro Fernandez (LIFIA - Facultad de Informática – UNLP,&lt;br /&gt; Argentina)&lt;br /&gt; •        Tudor Girba (Sw-eng. Software Engineering GmbH, Switzerland)&lt;br /&gt; •        Andy Kellens (SOFT, Vrije Universiteit Brussels, Belgium)&lt;br /&gt; •        Michele Lanza (University of Lugano, Switzerland)&lt;br /&gt; •        Adrian Lienhard (SCG, University of Bern, Switzerland)&lt;br /&gt; •        Damien Pollet (INRIA / Université de Lille 1, France)&lt;br /&gt; •        Lukas Renggli (SCG, University of Bern, Switzerland)&lt;br /&gt; •        David Röthlisberger (SCG, University of Bern, Switzerland)&lt;br /&gt; •        Tom Van Cutsem (SOFT, Vrije Universeit Brussels, Belgium)&lt;br /&gt;&lt;br /&gt; Program Chairs&lt;br /&gt; --------------------&lt;br /&gt; •        Marcus Denker (INRIA, Lille, France)&lt;br /&gt; •        Gabriela Arévalo (Universidad Austral, Buenos Aires, Argentina)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-5184786082815948208?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/5184786082815948208/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=5184786082815948208' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/5184786082815948208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/5184786082815948208'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2010/06/smalltalks-2010-research-track-call-for.html' title='Smalltalks 2010 Research Track: Call for Papers'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-8780342302157550568</id><published>2010-03-15T07:49:00.002-03:00</published><updated>2010-03-15T08:03:03.635-03:00</updated><title type='text'>Conclusiones sobre el Open Agile del Sabado</title><content type='html'>Este sábado fui al open agile que se realizó en el centro cultural Borges y del cual 10Pines fue auspiciante. Personalmente me gusta mucho la dinámica de los "open space", se logran charlas muy interesantes y todos aportan su conocimiento, si nunca fueron a un evento de este tipo, les aconsejo por lo menos ir una vez para ver cómo se realiza.&lt;br /&gt;Respecto de la parte técnica del evento, saqué un par de conclusiones que quería compartir:&lt;br /&gt;1) Me llamó la atención la confusión que existe entre TDD y test. Vi que hay muchas personas que creen que TDD es la única solución de test y lo quiren usar para resolver todos los problemas como la generación de UI, configuración de sistemas, etc. Sin embargo TDD implica desarrollo de software y no solo eso, implica escribir el test primero, por lo tanto testear la UI no es hacer TDD porque para poder hacerlo es necesario tener la UI por lo que no se escribe el test primero. Testear la configuración de un sistema no es TDD puesto que no se está desarrollando nada, etc. En conclusión TDD es una técnica más que entre otras cosas ayuda a testear, pero no es la única técnica de testing.&lt;br /&gt;2) Me sorprende cómo cuando se habla de buen diseño la gente relativiza tanto el término "buen", hasta el punto donde puede ser "mal" y no hay problema. Esto es algo que me ha pasado en otros ámbitos y la facultad también, pareciera que el diseño de una aplicación puede ser cualquier cosa y hablar de "buen diseño" no tiene sentido. Yo soy completamente contrario a esa opinión. Para mi existen buenos y malos diseños y se pueden determinar en base a un conjunto de criterios bien establecidos que tienen que ver con aquellos que atacan la esencia del software y su desarrollo. Cuestiones como mantenibilidad, representabilidad, semántica, etc. son características esenciales del software que definen que tan bien o no está diseñado. Por último existe un conjunto de características no esenciales en la cual el diseño puede diferir fuertemente, como performance, usabilidad, etc. y donde creo que si se puede relativizar un poco más que es bueno o malo puesto que son características más contextuales que esenciales&lt;br /&gt;3) Cada vez me lamento más que Kent Beck haya llamado a SUnit así. En realidad me lamento la parte de Unit puesto que a partir de esto se relaciona TDD únicamente con test unitarios y hay mucho más que test unitarios en tdd. Los test pueden ser bien funcionales, pueden ser user stories, se puede usar xUnit para escribir test de programación o diseño que nada tienen que ver con que sean "unitarios"... en fin, una lástima la confusión que se genera por este nombre.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-8780342302157550568?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/8780342302157550568/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=8780342302157550568' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8780342302157550568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8780342302157550568'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2010/03/conclusiones-sobre-el-open-agile-del.html' title='Conclusiones sobre el Open Agile del Sabado'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-2557412692025634536</id><published>2009-12-03T08:02:00.002-03:00</published><updated>2009-12-03T08:24:49.937-03:00</updated><title type='text'>Videos de Smalltalks 2009</title><content type='html'>Que tal,&lt;br /&gt; James Foster está publicando los videos que filmó es su blog. La verdad que se está tomando un trabajo impresionante porque los está combinando con las slides, muchas gracias James!!&lt;br /&gt; Acá está el link a la apertura del congreso http://www.youtube.com/watch?v=UzRZmFKxqO4&lt;br /&gt; Y aca el link al blog de James http://programminggems.wordpress.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-2557412692025634536?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/2557412692025634536/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=2557412692025634536' title='4 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2557412692025634536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2557412692025634536'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/12/videos-de-smalltalks-2009.html' title='Videos de Smalltalks 2009'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-7385213257372343934</id><published>2009-11-05T14:46:00.003-03:00</published><updated>2009-11-05T14:47:19.366-03:00</updated><title type='text'>Jornada de Calidad</title><content type='html'>Un post para mi olvidado blog :-)&lt;br /&gt;Voy a dar una charla de TDD en las Jornadas de Calidad de la Ort: http://campus.ort.edu.ar/ceo/noticia/61244/jornada-de-calidad-de-software&lt;br /&gt;&lt;br /&gt;Por otro lado no olviden de verificar www.fast.org.ar dentro de poco estará el cronograma publicado!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-7385213257372343934?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/7385213257372343934/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=7385213257372343934' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7385213257372343934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7385213257372343934'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/11/jornada-de-calidad.html' title='Jornada de Calidad'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-4478103526226693674</id><published>2009-08-23T22:10:00.000-03:00</published><updated>2009-08-23T22:11:18.893-03:00</updated><title type='text'>Smalltalks 2009 - Tercera Conferencia Argentina de Smalltalk</title><content type='html'>Del Jueves 19 al Sábado 21  de Noviembre del corriente año, &lt;br /&gt;se llevará a cabo en la Facultad de Ciencias Exactas y Naturales (FCEN) de&lt;br /&gt;la Universidad de Buenos Aires, la Tercera Conferencia de Smalltalk de Argentina,&lt;br /&gt;denominada "Smalltalks 2009"&lt;br /&gt;&lt;br /&gt;Todas aquellas personas que estén relacionadas con Smalltalk, sean&lt;br /&gt;docentes, alumnos, investigadores, desarrolladores o empresarios, están&lt;br /&gt;invitados a participar como oyentes o expositores de manera gratuita.&lt;br /&gt;El sitio para inscribirse será anunciado en breve.&lt;br /&gt;&lt;br /&gt;El objetivo de la conferencia es reunir a la comunidad Smalltalk Argentina e Internacional&lt;br /&gt;para estrechar vínculos compartiendo trabajos,&lt;br /&gt;experiencias y vivencias relacionadas con esta tecnología o temas afines.&lt;br /&gt;&lt;br /&gt;Esta edición de la conferencia categorizará las presentaciones en "Industria y Desarrollo" e "Investigación y Educación", contará con un concurso de programación y nos visitará, nuevamente, gente reconocida de la comunidad Smalltalk internacional.&lt;br /&gt;&lt;br /&gt;En la "Categoría de Investigación/Educación" se expondrán aquellos trabajos de&lt;br /&gt;investigación y educación que se estén realizando o se hayan realizado con&lt;br /&gt;Smalltalk, en ámbitos de universidades y establecimientos públicos o&lt;br /&gt;privados.&lt;br /&gt;&lt;br /&gt;En la "Categoría de Industria y Desarrollo" se expondrán trabajos relacionados a la&lt;br /&gt;Creación de Software utilizando Smalltalk, por medio de empresas o personas, con fines comerciales o no.&lt;br /&gt;&lt;br /&gt;Algunos temas sugeridos para las presentaciones, de manera no excluyente son:&lt;br /&gt;* Herramientas de Desarrollo&lt;br /&gt;* Desarrollo con Prototipos&lt;br /&gt;* Model Driven Development&lt;br /&gt;* Prácticas Ágiles (XP, TDD, etc)&lt;br /&gt;* Desarrollos de Aplicaciones Web&lt;br /&gt;* Meta-Modeling / Meta-Programación &lt;br /&gt;* Nuevos Modelos o Frameworks implementados&lt;br /&gt;* Material Educativo&lt;br /&gt;* Sistemas Embebidos y Robótica&lt;br /&gt;* SOA y Web services&lt;br /&gt;* Reportes de Experiencias de Desarrollo o Investigación&lt;br /&gt;* Sistemas comerciales&lt;br /&gt;* Testing: Prácticas y automatización&lt;br /&gt;* Interoperabilidad con otras tecnologías&lt;br /&gt;* Best Practices de Diseño y Arquitectura&lt;br /&gt;&lt;br /&gt;Aquellos interesados en exponer, deben tener en cuenta los siguientes&lt;br /&gt;hitos y tareas:&lt;br /&gt;&lt;br /&gt;1) Deben presentar un Resumen de la presentación a más tardar para el &lt;br /&gt;Lunes 19 de Octubre de 2009. Dicho Resumen no debe superar una carilla&lt;br /&gt;y debe incluir mínimamente una descripción del trabajo a presentar sin&lt;br /&gt;omitir el objetivo del mismo y la categoría a la cuál pertenece la presentación.&lt;br /&gt;El mecanismo de presentación del Resumen será anunciado en breve.&lt;br /&gt;&lt;br /&gt;2) El Comité de Programa de la Conferencia definirá para el Lunes 26 de&lt;br /&gt;Octubre aquellos trabajos que serán elegidos para ser presentados durante&lt;br /&gt;la jornada a partir de los Resúmenes recibidos según lo especificado&lt;br /&gt;en el punto anterior. Se dará mayor importancia a aquellos trabajos con&lt;br /&gt;capacidad de mostrar ejemplos dinámicos y no únicamente presentaciones&lt;br /&gt;estáticas.&lt;br /&gt;&lt;br /&gt;3) Los trabajos y presentaciones realizadas serán publicadas en el sitio de la conferencia una vez finalizada la misma.&lt;br /&gt;&lt;br /&gt;4) La definición del Cronograma de la Conferencia se publicará a través&lt;br /&gt;de la página web el Miércoles 28 de Octubre.&lt;br /&gt;&lt;br /&gt;Respecto del concurso de programación, todos aquellos que deseen participar pueden interiorisarse del mismo en el grupo smalltalks-2009-coding-contest@googlegroups.com &lt;br /&gt;La intención del concurso es pasar un buen momento, disfrutar solucionando un problema en Smalltalk y ganar un premio como reconocimiento del trabajo realizado.&lt;br /&gt;Estamos trabajando fuertemente para que todos puedan participar del mismo e iremos presentando ejemplos y prototipos que puedan ser tomados de ejemplo para desarrollar mejores soluciones.&lt;br /&gt; &lt;br /&gt;Para información sobre cómo llegar a la FCEyN, pueden acceder al sitio del departamento de computación: http://dc.uba.ar &lt;br /&gt;Por favor, difundan esta invitación en aquellas listas y grupos  que consideren interesados.&lt;br /&gt;&lt;br /&gt;Los esperamos a todos!&lt;br /&gt;Comité Organizador de Smalltalks 2009&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-4478103526226693674?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/4478103526226693674/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=4478103526226693674' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4478103526226693674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4478103526226693674'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/08/smalltalks-2009-tercera-conferencia.html' title='Smalltalks 2009 - Tercera Conferencia Argentina de Smalltalk'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-3732726501806731973</id><published>2009-07-09T21:42:00.003-03:00</published><updated>2009-07-09T21:48:05.006-03:00</updated><title type='text'>Bing vs. Google</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MFPZ3JVsnfE/SlaPalx7XyI/AAAAAAAAGUY/_OyrME4L9nY/s1600-h/bingvsgoogle.jpg"&gt;&lt;/a&gt;&lt;br /&gt;Fijensé el resultado de hacer &lt;a href="http://bing-vs-google.com/?q=bing"&gt;http://bing-vs-google.com/?q=bing&lt;/a&gt; (o sea, buscar bing y comparar los resultados de google y bing).&lt;div&gt;No siempre el resultado será siempre el mismo, les dejo una imagen que muestra la diferencia...&lt;/div&gt;&lt;br /&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://2.bp.blogspot.com/_MFPZ3JVsnfE/SlaPalx7XyI/AAAAAAAAGUY/_OyrME4L9nY/s400/bingvsgoogle.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5356626493784678178" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-3732726501806731973?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/3732726501806731973/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=3732726501806731973' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3732726501806731973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3732726501806731973'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/07/bing-vs-google.html' title='Bing vs. Google'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_MFPZ3JVsnfE/SlaPalx7XyI/AAAAAAAAGUY/_OyrME4L9nY/s72-c/bingvsgoogle.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-6492687966316621213</id><published>2009-07-09T21:18:00.001-03:00</published><updated>2009-07-09T21:20:02.028-03:00</updated><title type='text'>Una conclusión interesante sobre la ley de Moore y un dicho de Alan Kay</title><content type='html'>No tiene desperdicio: &lt;a href="http://lists.canonical.org/pipermail/kragen-tol/2007-March/000850.html" target="_blank"&gt;http://lists.canonical.org/&lt;wbr&gt;pipermail/kragen-tol/2007-&lt;wbr&gt;March/000850.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-6492687966316621213?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/6492687966316621213/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=6492687966316621213' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6492687966316621213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6492687966316621213'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/07/una-conclusion-interesante-sobre-la-ley.html' title='Una conclusión interesante sobre la ley de Moore y un dicho de Alan Kay'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-6512828563229805704</id><published>2009-07-09T18:58:00.002-03:00</published><updated>2009-07-09T18:59:04.647-03:00</updated><title type='text'>¿Quizá debería ver VisualAge/Envy un poco?</title><content type='html'>Sino, no haría el comentario del final :-) &lt;a href="http://lambda-the-ultimate.org/node/3459"&gt;http://lambda-the-ultimate.org/node/3459&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-6512828563229805704?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/6512828563229805704/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=6512828563229805704' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6512828563229805704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6512828563229805704'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/07/quiza-deberia-ver-visualageenvy-un-poco.html' title='¿Quizá debería ver VisualAge/Envy un poco?'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-2018214964804988758</id><published>2009-07-09T18:37:00.002-03:00</published><updated>2009-07-09T18:38:42.977-03:00</updated><title type='text'>Algo que venimos enseñando hace más de 10 años</title><content type='html'>Los diagramas de diseño tienen como objetivo comunicar. Me alegro que Rebecca lo ponga bien claro es su blog: &lt;a href="http://www.wirfs-brock.com/2009/06/value-of-design-documentation.html"&gt;http://www.wirfs-brock.com/2009/06/value-of-design-documentation.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-2018214964804988758?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/2018214964804988758/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=2018214964804988758' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2018214964804988758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2018214964804988758'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/07/algo-que-venimos-ensenando-hace-mas-de.html' title='Algo que venimos enseñando hace más de 10 años'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1459394626213947816</id><published>2009-07-03T10:11:00.002-03:00</published><updated>2009-07-03T10:42:46.489-03:00</updated><title type='text'>Respuesta: ¿Cómo mejorar esta clase?</title><content type='html'>El otro día postee una pregunta sobre cómo mejorar la clase MouseOverHandler de Squeak/Pharo... no hubo ningún comentario lo que creo que significa que nadie se animó a hacerlo! (o claro, nadie leyó el post...). En fin, creo que nadie se animó a hacerlo porque realmente no es fácil y sólo ver el código desalienta a cualquiera, pero bueno, yo lo hice hace una para de semanas atrás así que les comento cómo.&lt;br /&gt;Primero, ¿cuál es el problema con esta implementación? El principal es que el método #processMouseOver: es muy difícil de entender. Es muy largo y complicado, así que hay que empezar por tratar de entender que hace y mejorarlo. Para ello vamos a utilizar el refactoring de extract method para reemplazar colaboraciones por mensajes que revelen su intención. Lo interesante es que el método está comentado justamente en las secciones que vamos a extraer, lo cual muestra como a veces en vez de comentar código simplemente hay que escribirlo con intention revealing. Veamos como queda.&lt;br /&gt;Reemplacemos este código:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;hand := anEvent hand.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    leftMorphs := mouseOverMorphs asIdentitySet.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    "Assume some coherence for the number of objects in over list"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    overMorphs := WriteStream on: (Array new: leftMorphs size).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    enteredMorphs := WriteStream on: #().&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Por:&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;self initializeProcessMouseOver.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Luego reemplacemos:&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;"Now go looking for eventual mouse overs"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    hand handleEvent: anEvent asMouseOver.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    "Get out early if there's no change"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    (leftMorphs isEmpty and: [enteredMorphs position = 0]) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        ifTrue: [^leftMorphs := enteredMorphs := overMorphs := nil].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    focus := hand mouseFocus.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Por:&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;self handleAsMouseOver: anEvent.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;También reemplacemos: (no se preocupen en leer todo el código, simplemente tomen un dimensión de qué estamos reemplazando y por quién)&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;"Send #mouseLeave as appropriate"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    evt := anEvent asMouseLeave.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    "Keep the order of the left morphs by recreating it from the mouseOverMorphs"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    leftMorphs size &gt; 1 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        ifTrue: [leftMorphs := mouseOverMorphs select: [:m | leftMorphs includes: m]].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    leftMorphs do: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            [:m | &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            (m == focus or: [m hasOwner: focus]) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                ifTrue: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                    [localEvt := evt transformedBy: (m transformedFrom: hand).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                    m handleEvent: localEvt]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                ifFalse: [overMorphs nextPut: m]].&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Por:&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;self handleAsMouseLeave: anEvent.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;También reemplacemos:&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;"Send #mouseEnter as appropriate"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    evt := anEvent asMouseEnter.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    enteredMorphs ifNil: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            ["inform: was called in handleEvent:"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            ^leftMorphs := enteredMorphs := overMorphs := nil].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    enteredMorphs := enteredMorphs contents.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    enteredMorphs reverseDo: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            [:m | &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            (m == focus or: [m hasOwner: focus]) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                ifTrue: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                    [localEvt := evt transformedBy: (m transformedFrom: hand).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                    m handleEvent: localEvt]].&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Por:&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;self handleAsMouseEnter: anEvent.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Y por último:&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;"And remember the over list"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    overMorphs ifNil: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            ["inform: was called in handleEvent:"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            ^leftMorphs := enteredMorphs := overMorphs := nil].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    mouseOverMorphs := overMorphs contents.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    leftMorphs := enteredMorphs := overMorphs := nil&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Por:&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;self rememberOverList&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Bueno, no se que les parece (o si quedó claro como lo escribí), pero simplemente hay que agarrar cada conjunto de colaboraciones que tiene un comentario sobre que hacen y extraerlas a otro método. En conclusión con algunos cambios más el método #processMouseOver: quedá así:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;processMouseOver: anEvent&lt;br /&gt;&lt;br /&gt;    self initializeProcessMouseOver.&lt;br /&gt;    self handleAsMouseOver: anEvent.&lt;br /&gt;    self hasLeftMorphsChanged ifTrue: [&lt;br /&gt;        self handleAsMouseLeave: anEvent.&lt;br /&gt;        self handleAsMouseEnter: anEvent.&lt;br /&gt;        self rememberOverList ].&lt;br /&gt;   &lt;br /&gt;    self initializeTrackedMorphs&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;¿Se entiende mejor qué hace no?. Fijensé como un cambio tan sencillo, simplemente usando extract method, mejora el diseño considerablemente. Por supuesto que hay que seguir utilizando esta técnica para cada uno de los nuevos métodos porque siguen siendo muy complejos y al hacerlo se puede ver que hay código repetido, de hecho el mismo refactoring browser al realizar la extracción lo sugiere. No voy a mostrar todo este proceso porque es similar al anterior y no quiero hacer el post muy pesado (más de lo que es!).&lt;br /&gt;Por último, también realicé otros cambios como por ejemplo no usar nil para inicializar las variables de instancia que utiliza para realizar el procesamiento, sino inicializarlas con colecciones vacías de tal manera que nunca se produzca un MNU.&lt;br /&gt;En conclusión, el código quedó así:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;Object subclass: #MouseOverHandler&lt;br /&gt;    instanceVariableNames: 'mouseOverMorphs enteredMorphs overMorphs leftMorphs'&lt;br /&gt;    classVariableNames: ''&lt;br /&gt;    poolDictionaries: ''&lt;br /&gt;    category: 'Morphic-Events'!&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;processMouseOver: anEvent&lt;br /&gt;&lt;br /&gt;    self initializeProcessMouseOver.&lt;br /&gt;    self handleAsMouseOver: anEvent.&lt;br /&gt;    self hasLeftMorphsChanged ifTrue: [&lt;br /&gt;        self handleAsMouseLeave: anEvent.&lt;br /&gt;        self handleAsMouseEnter: anEvent.&lt;br /&gt;        self rememberOverList ].&lt;br /&gt;   &lt;br /&gt;    self initializeTrackedMorphs&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;initializeProcessMouseOver&lt;br /&gt;&lt;br /&gt;    leftMorphs := mouseOverMorphs asIdentitySet.&lt;br /&gt;    overMorphs := WriteStream on: (Array new: leftMorphs size).&lt;br /&gt;    enteredMorphs := WriteStream on: #()! !&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;handleAsMouseEnter: anEvent&lt;br /&gt;&lt;br /&gt;    | asMouseEnterEvent |&lt;br /&gt;   &lt;br /&gt;    asMouseEnterEvent := anEvent asMouseEnter.&lt;br /&gt;    enteredMorphs := enteredMorphs contents.&lt;br /&gt;    enteredMorphs reverseDo: [ :anEnteredMorph |&lt;br /&gt;        self inform: asMouseEnterEvent to: anEnteredMorph originatedFrom: anEvent ifNotFocusedDo: [] ]&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;handleAsMouseLeave: anEvent&lt;br /&gt;&lt;br /&gt;    self keepLeftMorphsOrder.&lt;br /&gt;    self informMouseLeaveToLeftMorphsUsing: anEvent&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;handleAsMouseOver: anEvent&lt;br /&gt;&lt;br /&gt;    anEvent hand handleEvent: anEvent asMouseOver.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;noticeMouseOver: aMorph event: anEvent&lt;br /&gt;    "Remember that the mouse is currently over some morph"&lt;br /&gt;&lt;br /&gt;    leftMorphs remove: aMorph ifAbsent: [ enteredMorphs nextPut: aMorph ].&lt;br /&gt;    overMorphs nextPut: aMorph.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;initialize&lt;br /&gt;    mouseOverMorphs := #().&lt;br /&gt;   &lt;br /&gt;    self initializeTrackedMorphs&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;initializeTrackedMorphs&lt;br /&gt;&lt;br /&gt;    leftMorphs := OrderedCollection new.&lt;br /&gt;    overMorphs := WriteStream on: #().&lt;br /&gt;    enteredMorphs := WriteStream on: #().&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;hasLeftMorphsChanged&lt;br /&gt;&lt;br /&gt;    ^(leftMorphs isEmpty and: [ enteredMorphs position = 0 ]) not&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;inform: evt to: aLeftMorph originatedFrom: anEvent ifNotFocusedDo: aBlock&lt;br /&gt;&lt;br /&gt;    ^ (self is: anEvent withFocusOver: aLeftMorph)&lt;br /&gt;        ifTrue: [ self transform: evt from: anEvent andSendTo: aLeftMorph ]&lt;br /&gt;        ifFalse: aBlock&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;informMouseLeaveToLeftMorphsUsing: anEvent&lt;br /&gt;&lt;br /&gt;    | asMouseLeaveEvent |&lt;br /&gt;   &lt;br /&gt;    asMouseLeaveEvent := anEvent asMouseLeave.&lt;br /&gt;   &lt;br /&gt;    leftMorphs do: [ :aLeftMorph |&lt;br /&gt;        self inform: asMouseLeaveEvent to: aLeftMorph originatedFrom: anEvent ifNotFocusedDo: [ overMorphs nextPut: aLeftMorph ] ]&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;is: anEvent withFocusOver: aMorph&lt;br /&gt;&lt;br /&gt;    | focusedMorph |&lt;br /&gt;   &lt;br /&gt;    focusedMorph := anEvent hand mouseFocus.&lt;br /&gt;    ^ aMorph = focusedMorph or: [ aMorph hasOwner: focusedMorph ]&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;keepLeftMorphsOrder&lt;br /&gt;&lt;br /&gt;    leftMorphs size &gt; 1 ifTrue: [ leftMorphs := mouseOverMorphs intersection: leftMorphs ]&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;rememberOverList&lt;br /&gt;&lt;br /&gt;    mouseOverMorphs := overMorphs contents.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;transform: anEvent from: originalEvent andSendTo: aMorph&lt;br /&gt;&lt;br /&gt;    | transformedEvent |&lt;br /&gt;&lt;br /&gt;    transformedEvent := anEvent transformedBy: (aMorph transformedFrom: originalEvent hand).&lt;br /&gt;    ^ aMorph handleEvent: transformedEvent&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;¿Mucho más claro no?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-1459394626213947816?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1459394626213947816/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1459394626213947816' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1459394626213947816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1459394626213947816'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/07/respuesta-como-mejorar-esta-clase.html' title='Respuesta: ¿Cómo mejorar esta clase?'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1725412022237824395</id><published>2009-07-02T07:22:00.001-03:00</published><updated>2009-07-02T07:23:36.211-03:00</updated><title type='text'>Una revista editada por Kent Beck</title><content type='html'>Salió una revista on-line editada por Kent Beck. Está en: &lt;a href="http://pragprog.com/magazines"&gt;http://pragprog.com/magazines&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-1725412022237824395?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1725412022237824395/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1725412022237824395' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1725412022237824395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1725412022237824395'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/07/una-revista-editada-por-kent-beck.html' title='Una revista editada por Kent Beck'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-3240541078091719583</id><published>2009-07-01T10:55:00.002-03:00</published><updated>2009-07-01T11:05:07.525-03:00</updated><title type='text'>Quiz: ¿Cómo mejorar esta clase?</title><content type='html'>Que tal,&lt;br /&gt; les dejo un problema para pensar, no es muy largo ni difícil, con 10 minutos imagino que pueden encontrar la manera de resolverlo. El problema es el siguiente: hay que mejorar el código de la clase MouseOverHandler que se encuentra en Squeak o Pharo, en particular el método #processMouseOver: anEvent.&lt;br /&gt; El motivo por el cual seleccioné este problema se debe a que últimamente en la imagen de Pharo en condiciones aún no encontradas, el método #&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;noticeMouseOver: aMorph event: anEvent&lt;/span&gt;&lt;/span&gt; envía el mensaje #includes: a nil.&lt;br /&gt; Lo interesante del problema es:&lt;br /&gt;1) Entender como funcionan las instancias de esta clase&lt;br /&gt;2) Encontrar el motivo de por qué funciona incorrectamente el mensaje #&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;noticeMouseOver: aMorph event: anEvent&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;3) Pensar cómo se puede generar información que confirme lo encontrado en el punto 2&lt;br /&gt;4) El objetivo de este post, mejorar el diseño de esta clase.&lt;br /&gt; Acá está el código por si no tienen ganas de abrir un Squeak/Pharo.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;---------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;Object subclass: #MouseOverHandler&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    instanceVariableNames: 'mouseOverMorphs enteredMorphs overMorphs leftMorphs'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    classVariableNames: ''&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    poolDictionaries: ''&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    category: 'Morphic-Events'&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;---------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;initialize&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    super initialize.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    mouseOverMorphs := #().&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;---------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;processMouseOver: anEvent &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    "Re-establish the z-order for all morphs wrt the given event"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    | hand localEvt focus evt |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    hand := anEvent hand.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    leftMorphs := mouseOverMorphs asIdentitySet.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    "Assume some coherence for the number of objects in over list"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    overMorphs := WriteStream on: (Array new: leftMorphs size).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    enteredMorphs := WriteStream on: #().&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    "Now go looking for eventual mouse overs"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    hand handleEvent: anEvent asMouseOver.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    "Get out early if there's no change"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    (leftMorphs isEmpty and: [enteredMorphs position = 0]) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        ifTrue: [^leftMorphs := enteredMorphs := overMorphs := nil].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    focus := hand mouseFocus.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    "Send #mouseLeave as appropriate"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    evt := anEvent asMouseLeave.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    "Keep the order of the left morphs by recreating it from the mouseOverMorphs"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    leftMorphs size &gt; 1 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        ifTrue: [leftMorphs := mouseOverMorphs select: [:m | leftMorphs includes: m]].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    leftMorphs do: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            [:m | &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            (m == focus or: [m hasOwner: focus]) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                ifTrue: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                    [localEvt := evt transformedBy: (m transformedFrom: hand).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                    m handleEvent: localEvt]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                ifFalse: [overMorphs nextPut: m]].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    "Send #mouseEnter as appropriate"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    evt := anEvent asMouseEnter.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    enteredMorphs ifNil: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            ["inform: was called in handleEvent:"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            ^leftMorphs := enteredMorphs := overMorphs := nil].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    enteredMorphs := enteredMorphs contents.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    enteredMorphs reverseDo: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            [:m | &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            (m == focus or: [m hasOwner: focus]) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                ifTrue: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                    [localEvt := evt transformedBy: (m transformedFrom: hand).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                    m handleEvent: localEvt]].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    "And remember the over list"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    overMorphs ifNil: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            ["inform: was called in handleEvent:"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            ^leftMorphs := enteredMorphs := overMorphs := nil].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    mouseOverMorphs := overMorphs contents.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    leftMorphs := enteredMorphs := overMorphs := nil&lt;/span&gt;&lt;br /&gt;---------------------------&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;noticeMouseOver: aMorph event: anEvent&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    "Remember that the mouse is currently over some morph"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;     (leftMorphs includes: aMorph) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;         ifTrue:[leftMorphs remove: aMorph]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;         ifFalse:[enteredMorphs nextPut: aMorph].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;     overMorphs nextPut: aMorph.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-3240541078091719583?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/3240541078091719583/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=3240541078091719583' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3240541078091719583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3240541078091719583'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/07/quiz-como-mejorar-esta-clase.html' title='Quiz: ¿Cómo mejorar esta clase?'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-8946959396478546966</id><published>2009-07-01T10:53:00.002-03:00</published><updated>2009-07-01T10:55:25.862-03:00</updated><title type='text'>Alguien está necesitado de dinero...</title><content type='html'>Bueno, quién no? pero miren esto:&lt;br /&gt;&lt;a href="http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&amp;amp;item=180375524276"&gt;http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&amp;amp;item=180375524276&lt;/a&gt;&lt;br /&gt;Inicialmente me hace pensar en dos cosas:&lt;br /&gt;1) Ya nadie se gana la vida escribiendo libros (o por lo menos libros técnicos)&lt;br /&gt;2) Kent Beck no es muy bueno haciendo negocios :-)&lt;br /&gt;El resto de las posibilidad lo dejo par el ideario colectivo :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-8946959396478546966?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/8946959396478546966/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=8946959396478546966' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8946959396478546966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8946959396478546966'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/07/alguien-esta-necesitado-de-dinero.html' title='Alguien está necesitado de dinero...'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-6191033752652006594</id><published>2009-06-23T08:53:00.004-03:00</published><updated>2009-06-23T08:58:33.715-03:00</updated><title type='text'>El sitio está listo!</title><content type='html'>Quería comentarles que ya tenemos listo el sitio de Internet, la dirección es &lt;a href="http://www.10pines.com/"&gt;http://www.10pines.com/&lt;/a&gt;&lt;br /&gt;Aún está en inglés, pero pronto lo pasaremos al castellano.&lt;br /&gt;Espero que les guste! si encuentran algún error o tiene sugerencias, será bienvenido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-6191033752652006594?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/6191033752652006594/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=6191033752652006594' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6191033752652006594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6191033752652006594'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/06/el-sitio-esta-listo.html' title='El sitio está listo!'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-4471306040264703095</id><published>2009-05-31T14:40:00.001-03:00</published><updated>2009-05-31T14:42:04.396-03:00</updated><title type='text'>Charla en ESUG</title><content type='html'>Algunos me preguntaron de que voy a hablar en ESUG. Mi intención es hablar sobre un trabajo de tesis que están haciendo Nicolas Chillo y Gabriel Burnstein que trata de Mutation Testing.... veremos si es aceptado...&lt;div&gt;Gracias por los comentarios sobre el viaje!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-4471306040264703095?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/4471306040264703095/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=4471306040264703095' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4471306040264703095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4471306040264703095'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/05/charla-en-esug.html' title='Charla en ESUG'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-9057347105852195304</id><published>2009-05-22T15:55:00.001-03:00</published><updated>2009-05-22T15:57:12.071-03:00</updated><title type='text'>Voy a ESUG!!!</title><content type='html'>Si, nuevamente voy a ESUG!!! (www.esug.org)&lt;div&gt;ESUG es la conferencia de Smalltalk de Europa. Es una conferencia muy linda que tuve la oportunidad de asistir en 2005. Lo interesante es que este año vamos muchos argentinos y la mayoría daremos una charla...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-9057347105852195304?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/9057347105852195304/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=9057347105852195304' title='5 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/9057347105852195304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/9057347105852195304'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/05/voy-esug.html' title='Voy a ESUG!!!'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-7147184364476538195</id><published>2009-04-14T13:21:00.002-03:00</published><updated>2009-04-14T13:26:22.377-03:00</updated><title type='text'>Magritte 2</title><content type='html'>Algo que siempre digo y me olvidé de comentar en el post anterior es que "es muy fácil criticar pero difícil hacer". Mis comentarios del post anterior fueron todas crítticas, sin embargo Magritte también tiene cosas muy interesantes como el manejo de mementos para la edición de objetos, la posibilidad de configurar el framework (todo puede ser cambiado, como el container, las descripciones, los componentes), etc. &lt;div&gt;Una aclaración que me parece necesaria para no parecer siempre negativo.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-7147184364476538195?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/7147184364476538195/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=7147184364476538195' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7147184364476538195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7147184364476538195'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/04/magritte-2.html' title='Magritte 2'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-79801150649135953</id><published>2009-04-14T09:24:00.003-03:00</published><updated>2009-04-14T10:19:35.133-03:00</updated><title type='text'>Magritte</title><content type='html'>No voy a escribir sobre arte, no, este post no es sobre &lt;a href="http://en.wikipedia.org/wiki/René_Magritte"&gt;René Magritte&lt;/a&gt; sino sobre el framework creado por &lt;a href="http://www.lukas-renggli.ch/smalltalk/magritte"&gt;Lukas Renggli&lt;/a&gt; para ayudar en el desarrollo de aplicaciones utilizando metraprogramación.&lt;div&gt;Ayer estuve leyendo bastante sobre el mismo y jugando un poco con él. Es un framework que permite rápidamente obtener una representación visual de objetos del modelo, creando en ellos una serie de descripciones. Por ejemplo, si tenemos la clase Address, creando métodos que se llaman "descriptionXxx" donde Xxx generalmente tienen que ver con los nombres de las variables de instancia, se puede obtener un componente SeaSide o Morph para instancias de Address.&lt;/div&gt;&lt;div&gt;Veamos un ejemplo del tutorial que ofrecen:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;descriptionStreet&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;^ MAStringDescription new&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;autoAccessor: 'street';&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;label: 'Street';&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;priority: 10;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;yourself&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Esta sería la descripción para la variable de instancia 'street' de Address (o MAAdressModel como se llama en el tutorial... un nombre poco feliz desde mi punto de vista puesto que la palabra Model está de más). Veamos que significa cada cosa:&lt;/div&gt;&lt;div&gt;1) autoAccessor: Significa que se accederá a 'street' con los mensajes #street y #street:, si no existen los creará, pero no solo eso, creará también la var. de instancia si no existe.&lt;/div&gt;&lt;div&gt;2) label: String que se utilizará para identificar el entry field de Street&lt;/div&gt;&lt;div&gt;3) priority: Posición en la que debe aparecer el campo en el componente visual. Menos prioridad significa más arriba, más prioridad significa más abajo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Veamos ahora otra "descripción":&lt;/div&gt;&lt;div&gt;&lt;div&gt;descriptionPlz&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;^ MANumberDescription new&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;autoAccessor: 'plz';&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;label: 'PLZ';&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;priority: 20;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;min: 1000;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;max: 9999;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;yourself&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Este describe el código postal. Más observaciones:&lt;/div&gt;&lt;div&gt;4) Nótese que priority es 20, lo que significa que irá luego de street... no se si notaron que hay 10 números entre el priority de street y este, ¿por qué?, para poder poner componentes visuales entre street y código postal sin necesidad de modificar estos métodos.&lt;/div&gt;&lt;div&gt;5) min: y max: indican los valores numéricos máximos del código postal&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Por último, quería mostrar esta "descripción" también:&lt;/div&gt;&lt;div&gt;&lt;div&gt;descriptionCanton&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;^ MASingleOptionDescription new&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;options: #( 'Zurich' 'Bern' 'Luzern' 'Uri' 'Schwyz' 'Unterwalden' 'Glarus' 'Zug' 'Freiburg' 'Solothurn' 'Basel' 'Schaffhausen' 'Appenzell' 'St. Gallen' 'Graubunden' 'Aargau' 'Thurgau' 'Ticino' 'Vaud' 'Valais' 'Neuchatel' 'Geneve' 'Jura' );&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;reference: MAStringDescription new;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;autoAccessor: 'canton';&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;label: 'Canton';&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;priority: 40;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;beSorted;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;yourself&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Es la utilizada para elegir un canton (provincia). Observaciones:&lt;/div&gt;&lt;div&gt;6) Los distintos cantones están hardcodeados en la descripción&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bien, ahora voy a dar algunas opiniones sobre los puntos que estuvimos viendo:&lt;/div&gt;&lt;div&gt;1) Nunca usaría autoAccessor. No sirve cuando se está desarrollando un app en serio puesto que crearía una variable aún cuando el nombre de la misma está mal escrito, es muy peligroso dejar la creación de variables y métodos a herramientas en vez de hacerlo uno. Por otro lado, si se hace un rename de la variable este "descriptor" no se enteraría... ese es uno de los problemas de este tipo de frameworks, la falta de integración con las herramientas de desarrollo comúnes y también por no estar reificadas las variables en Smalltalk. Para solucionarlo utiliaría #selectorAccessor: o escribiría un test que se asegurará la consistencia de este descriptor.&lt;/div&gt;&lt;div&gt;2) Sobre label. Acá es donde me empieza a gustar menos la cosa. En una clase del modelo (Address) estoy poniendo información sobre que quiero que aparezca en la view, un acoplamiento poco deseado. Además este label podría cambiar de view en view. La solución que proponen es obtener una copia del descriptor y modificar el label para ese caso... hmm, más acoplamiento.&lt;/div&gt;&lt;div&gt;3) y 4) priority: Más acoplamiento. Entre el modelo y la view por estar este número en un método del modelo y entre los descriptores mismos por utilizar entre ellos un número mayor que el otro para indicar que va después. Para el primer caso, ¿qué le importa al modelo en que posición se va a mostrar el componente visual para alguna de sus variables de instancias?. Para el segundo caso, ¿no sería mejor tener un objeto que indique la secuencia en la que debe ir cada componente visual? una OrderedCollection de descriptores por ejemplo?. De esa manera el hecho de la posición no estaría acoplado al descriptor sino que sería responsabilidad de otro objeto. Por otro lado, ¿por qué dejar 10 número entre uno y otro? ¿no se pueden usar número reales? Si se puediesen poner números no enteros (cosa que no probé aún) no habría necesidad de dejar 10 números entre una descripción y otra puesto que todos sabemos que siempre hay números entre dos números reales. &lt;/div&gt;&lt;div&gt;5) Que las validaciones de los objetos no estén con los mismos no me parece una buena solución. Si el código postal de Suiza tiene que estar entre 1000 y 9999, debería existir una abstracción para dicho ente que además debería encargarse de realizar esta validación. Separar la validación del objeto en si mismo no representa correctamente el ente que se está modelando, lo cual trae problemas a posteriori, como por ejemplo cargar direcciones desde un archivo. En ese caso, ¿quién valida que el código postal sea un número entre 1000 y 9999?, ¿o para hacerlo también tengo que usar Magritte?. Digamos que uso Magritte, ¿qué pasa entonces cuando creo una dirección desde el workspace? no voy a usar Magritte para eso... &lt;/div&gt;&lt;div&gt;6) Por más que es un ejemplo y los cantones están hardcodeados por ello (imagino), supongamos que no, ¿cómo los obtendría?. Tendría que colaborar con el objeto encargado de mantener la lista de cantones válidos. Algunos propondría utilizar una clase, "Cantones" por ejemplo que tenga una class variable con las cantones válidos, una porquería desde mi punto de vista. Si vamos a hacer eso utilicemos una variable global, "Cantones" y listo, ¿para qué crear una clase?. Pero sea una u otra la solución, el acoplamiento que se crea es enorme! ahora esa descripción no va a funcionar con otra cosa que no sea esa lista de cantones! que además está referenciado desde un método de la clase Address! o sea que no puedo usar Address en otro contexto!... una muy mala solución y que surge de la necesidad de indicarle los cantones en la "descripción" en vez de indicarselos a la view directamente al momento de construirla.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En fin, mi conclusión por ahora es que Magritte, como todo este tipo de frameworks, sirve para hacer una app rápido y chiquita si no te importa mucho el diseño y cómo la vas a mantener. Ahora, si querés hacer una app en serio o no utilices Magritte o hay que tomar algunas decisiones como:&lt;/div&gt;&lt;div&gt;1) Que las descripciones no estén en el modelo&lt;/div&gt;&lt;div&gt;2) Que el orden de los componentes estén en otro objeto y sea configurable por view&lt;/div&gt;&lt;div&gt;3) Que la validaciones no estén en las descripciones&lt;/div&gt;&lt;div&gt;4) Que no exista acoplamiento entre la descripción y los elememtos que muestran las views&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Una última cosa que acabo de acordarme, me parece una decisión muy poco feliz la que tomaron de que todos los objetos sepan responder #description para devolver una colección de descriptores de Magritte. ¿por qué no lo llamaron #magritteDescription o algo así y de esa manera no impedían utilizar ese mensaje en el modelo para cosas que tengan que ver con el modelo?.... en fin.&lt;/div&gt;&lt;div&gt;Voy a mandar un mail a la lista de Magritte con estos comentario para ver que soluciones/respuesta obtengo. Los mantendré informados.&lt;/div&gt;&lt;/div&gt;&lt;/div&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;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-79801150649135953?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/79801150649135953/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=79801150649135953' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/79801150649135953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/79801150649135953'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/04/magritte.html' title='Magritte'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-7300606140504756058</id><published>2009-04-14T09:22:00.002-03:00</published><updated>2009-04-14T09:24:51.870-03:00</updated><title type='text'>Mapeo Objeto-Relacional</title><content type='html'>El mapeo de objetos a base de datos relacionales es un tema bastante complicado y estudiado en nuestra profesión, aunque siempre aparecen nuevos frameworks que supuestamente solucionan los problemas que se generan en este mapeo, pero que finalmente crean nuevos... en fin, vamos a tener que esperar mucho hasta que la gente se de cuenta que el problema es de fondo y no de forma... mientras tanto les paso un link que me recomendaron sobre este tema:&lt;div&gt;&lt;a href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx"&gt;http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx&lt;/a&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/1292532279691646783-7300606140504756058?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/7300606140504756058/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=7300606140504756058' title='4 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7300606140504756058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7300606140504756058'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/04/mapeo-objeto-relacional.html' title='Mapeo Objeto-Relacional'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-8734626923571902825</id><published>2009-04-03T10:32:00.003-03:00</published><updated>2009-04-03T11:20:01.860-03:00</updated><title type='text'>Nueva Etapa Laboral</title><content type='html'>Aquellos que tengan Facebook habrán visto que a principio de semana puse que estoy empezando una nueva etapa laboral... no comenté muchos detalles allí, así que quería utilizar este medio para aclarar un poco más de que se trata.&lt;div&gt;Con unos amigos estamos armando una empresa en la que ofrecemos servicios de desarrollo de aplicaciones complejas, capacitación y coaching de objetos, patrones, frameworks, tdd, metodologías ágiles y diagnósticos sobre código y diseños de aplicaciones existentes. &lt;/div&gt;&lt;div&gt;No creo que sea necesario explicar a que me refiero con aplicaciones complejas o capacitación. Si quizá un poco sobre a que me refiero con coaching. Cuando capacitamos, no nos interesa únicamente dar los cursos, sino hacer un seguimiento  con la gente una vez terminados. Lo que ofrecemos es realizar pair programming con los asistentes para que realmente apliquen lo que enseñamos. Esta es la única manera de agregar valor en la capacitación y que realmente la gente aprenda.&lt;/div&gt;&lt;div&gt;Seguramente también sea necesario explicar a que me refiero con "diagnóstico de código y diseño". Bueno, ustedes saben que hay muchas empresas que ofrecen consultoría para ayudar a mejorar los procesos de desarrollo, implementar un sistema de SCM, etc, pero pocas (sino ninguna) se mete a bailar con la más fea, donde realmente hay que moverse y demostrar experiencia y conocimiento; pocas se meten en el código y el diseño de un sistema existente y ofrecen un diagnóstico sobre cómo está hecho y cómo se lo puede mejorar. A esto es lo que apuntamos con este servicio, la idea es arremangarnos, ver el diseño y el código del sistema que les parezca importante y darles un diagnóstico del mismo. Este diagnóstico sería similar a lo que nos da un médico clínico cuando lo visitamos. Nos dice en qué andamos mal y qué deberíamos hacer para mejorar, etc; nosotros haremos lo mismo. Ver un sistema, analizar su diseño, cómo está codificado para luego generar un informe que indique su "grado de salud" (qué tan enfermo está, cuanto va a vivir, qué se puede hacer para alargar su vida, etc). Sinceramente no conozco empresa que ofrezca este servicio puesto que es muy difícil de realizar y hay que estar muy capacitado para obtener buenos resultados. Nosotros tenemos la capacidad y conocimiento para hacerlo y es un valor agregado muy importante que ofrecemos.&lt;/div&gt;&lt;div&gt;Bueno, basta de marketing por un rato.... Respecto del blog, voy a intentar postear más seguido ahora, aunque en realidad este cambio aún me está requiriendo más tiempo del que esperaba, imagino que cambirá en unas semanas. &lt;/div&gt;&lt;div&gt;Por otro lado no quiero dejar pasar la oportunidad de agradecer y mencionar lo feliz que fue y es para mi trabjar en Mercap, he aprendido muchísimo a nivel técnico y humano, hemos tenido grupos de personas muy lindos y hemos logrado cosas que no he visto en ninguna otra empresa. De hecho, voy a seguir trabajando algunas horas en Mercap puesto que es una empresa que realmente amo, por la gente, por lo que hacemos y por lo que hicimos. Por eso quería agradecer también por este medio a Alejandro (dueño de Mercap) por la oportunidad que me da de seguir formando parte de la empresa y apoyarme en este nuevo emprendimiento.&lt;/div&gt;&lt;div&gt;En fin, ya cerrando y volviendo al marketing :-), si alguien está interesado es saber un poco más qué ofrecemos, tiene interés en conocer precios o contratar algún servicio, no deje de avisarme!&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/1292532279691646783-8734626923571902825?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/8734626923571902825/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=8734626923571902825' title='5 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8734626923571902825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8734626923571902825'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/04/nueva-etapa-laboral.html' title='Nueva Etapa Laboral'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1675979030814056193</id><published>2009-03-19T17:20:00.002-03:00</published><updated>2009-03-19T17:21:13.555-03:00</updated><title type='text'>Ingeniero o Arquitecto</title><content type='html'>&lt;span class="Apple-style-span"  style=" ;font-family:'Times New Roman';"&gt;&lt;div style="margin-top: 8px; margin-right: 8px; margin-bottom: 8px; margin-left: 8px; font: normal normal normal small/normal arial; "&gt;&lt;div&gt;&lt;div&gt;Son muchas las comparaciones que se hacen entre el desarrollo de software y la arquitectura o la construcción de edificios/casas/etc., de hecho el término "Arquitecto de Software" proviene de dicha disciplina. En este post voy a tratar de explicar por qué me parece que está mal utilizado este término (como muchas otras analogías que se hacen con esa disciplina). &lt;/div&gt;&lt;div&gt;Este tema me vino a la cabeza luego de la clase de ayer en la UBA cuando conversábamos sobre qué significa que un modelo sea bueno. Recuerden que desde nuestro punto de vista, el software es un "modelo computable" de un dominio de problema de la realidad, por lo tanto debe cumplir con ciertas características para ser un buen software. Por un lado, debe cumplir con las mismas características con la que se juzga cualquier modelo, no solo los computables, esto básicamente significa que pueda representar correctamente lo que modela. Pero también existen características que debe cumplir por ser computable que tienen que ver con performance, uso de recursos, etc. &lt;/div&gt;&lt;div&gt;Es interesante ver que generalmente en las carreras de sistemas nos enseñan como lograr buenas características computables de los programas que realizamos como que sean performeantes, etc., pero rara vez existen materias en donde nos enseñen a crear un buen modelo. Justamente este tema es el que ataca nuestra materia.&lt;/div&gt;&lt;div&gt;¿Qué tiene que ver todo esto con los arquitectos?, bueno, el rol que "actualmente" vela porque un sistema tenga buenos atributos computables, es lo que llamamos "Arquitecto". Es él quien debe asegurar que el sistema sea performeante, que escale bien, etc. Es el que se encarga de los temas de infraestructura del sistema.&lt;/div&gt;&lt;div&gt;Analizando un poco el mundo de la construcción de edificios/casas/etc., se puede ver que el encargado de asegurar que estas construcciones "no se caigan", que las estructuras sean las correctas, etc., o sea que todo lo relacionado con la infraestructura sea correcto, no es el arquitecto si no el ingeniero civil. De hecho, los planos de estructura, vigas, etc. deben estar hechos por un ingeniero civil y no por un arquitecto! El arquitecto generalmente se ocupa de hacer que el edificio/casa/etc. sea funcional, "lindo", aproveche bien los espacios, etc., todas características que no tienen nada que ver con la infraestructura en si... (Los arquitectos son también quienes generalmente llevan el proyecto adelante, pero ese es otro tema).&lt;/div&gt;&lt;div&gt;Por lo tanto, si lo pensamos detenidamente y no me equivoque en las responsabilidades del arquitecto y el ingeniero civil, utilizar la palabra Arquitecto dentro de nuestra profesión para indicar el rol de la persona que se encarga de definir la infraestructura del sistema parece ser equivocado, puesto que de donde proviene, esa palabra no es utilizada para dicho rol. El nombre utilizado para nombrar a la persona que cumple ese rol es Ingeniero Civil, por lo tanto sería mejor llamar al rol similar en el desarrollo de software  "Ingeniero", pero claro, dicho término tiene otra connotación en nuestra disciplina y está más relacionado con la persona que se encarga de construir un sistema, que el sea usable y por que no, llevar adelante un proyecto... ups! pero eso es lo que hace un arquitecto en el ámbito la construcción!&lt;/div&gt;&lt;div&gt;¿Me estoy perdiendo algo o realmente estas palabras están mal usadas en nuestra profesión? ¿No deberíamos llamar ingeniero al arquitecto de software y viceversa? ¿qué les parece?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-1675979030814056193?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1675979030814056193/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1675979030814056193' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1675979030814056193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1675979030814056193'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/03/ingeniero-o-arquitecto.html' title='Ingeniero o Arquitecto'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-5442311636872817435</id><published>2009-03-12T17:01:00.001-02:00</published><updated>2009-03-12T17:01:33.348-02:00</updated><title type='text'>Jornadas Agiles</title><content type='html'>&lt;div&gt;El fin de semana pasado se realizaron unas Jornadas Agiles utilizando una organización muy interesante denominada Open Space.&lt;/div&gt;&lt;div&gt;La idea de esta técnica es que los participantes mismos decidan como será la jornada, decidan los temas y la agenda de cómo serán tratados. Inicialmente parece medio loco no?, algo que va en contra de la idea de tener todo organizado de entrada y bien definido, una característica que buscamos quizá por una cuestión de enseñanza y no por vivencias propias.&lt;/div&gt;&lt;div&gt;Les comento que la organización terminó siendo buenísima. La gente propuso los temas, la agenda se armó de manera colaborativa y no llevó más de 1 hora y media hacerlo con 100 persona y con 25 temas en total (creo). Pero lo más importante aún, desde mi punto de vista, es que no hubo exposiciones (salvo algunas como la mía que intenté hacerla más colaborativa y no lo logré) sino reuniones donde todos opinaron y colaboraron, lo cual generó muchas ganas de participar y un ambiente muy motivador... esta motivación me hace acordar a cuando se realiza pair-programming o sesiones de diseño grupales.&lt;/div&gt;&lt;div&gt;En fin, se utilizó una técnica que tiene mucho que ver con el espíritu ágil y que tenemos ganas de utilizarla por lo menos para un día en el congreso de Smalltalks de este año... así que vayan pensando temas!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-5442311636872817435?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/5442311636872817435/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=5442311636872817435' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/5442311636872817435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/5442311636872817435'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/03/jornadas-agiles.html' title='Jornadas Agiles'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-175389536090138828</id><published>2009-03-12T15:30:00.001-02:00</published><updated>2009-03-12T15:43:25.448-02:00</updated><title type='text'>Sesiones de Diseño II - TDD en Vivo</title><content type='html'>&lt;div&gt;&lt;div&gt;Ya vamos por la tercer sesión de diseño y realmente ha sido muy interesante. (Un amigo, JP, suguirió que debería llamar al post "TDD en Vivo", por eso lo adjunté al nombre).&lt;/div&gt;&lt;div&gt;Es muy interesante ver como cada grupo fue tomando distintos caminos y concentrándose en distintos problemas. Sin embargo hubo una característica común que permitió avanzar rápidamente en todos los casos y que soluciona el error principal que se cometió en la primer sesión: se empezaron a hacer test más sencillos y cortos. Fue muy interesante ver cómo al hacer tests más cortos se lograron mejores resultados y la gente se motivó mucho más. Aunque el avance esencial haya sido poco, el hecho de haber creado muchos tests y que den verde indudablemente afectó la moral del equipo. Es algo que Kent Beck ya había comentado cuando propuso esta técnica y que nuevamente estamos confirmando.&lt;/div&gt;&lt;div&gt;Por otro lado es muy interesante ver que los diseños en general no varían mucho, hay diferencias de nombres pero el problema está siendo resuelto de manera similar en la mayoría de los casos por los distintos grupos. También fue muy interesante ver con un grupo, como se entendió mejor y hasta se simplificó partes de código muy complejas simplemente factorizandolas con un extract method. Nuevamente hacer extract method y estar obligado nombrar (darle un significado) a un conjunto de colaboraciones  difíciles de entender o poco declarativas, ha demostrado ser una técnica muy valiosa.&lt;/div&gt;&lt;div&gt;Los mantendré informados!&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/1292532279691646783-175389536090138828?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/175389536090138828/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=175389536090138828' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/175389536090138828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/175389536090138828'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/03/sesiones-de-diseno-ii-tdd-en-vivo.html' title='Sesiones de Diseño II - TDD en Vivo'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-4700843248837619540</id><published>2009-03-12T15:27:00.002-02:00</published><updated>2009-03-12T15:30:23.364-02:00</updated><title type='text'>The real crisis? We stopped being wise (Barry Schwartz)</title><content type='html'>&lt;div&gt;Hace unas semanas hubo una charla muy interesante de Barry Schwartz donde comenta lo importante de ser "inteligentes" por más de que existan "métodos" o "procesos" que nos digan cómo tenemos que trabajar o actuar. Un charla imperdible:  &lt;a href="http://www.ted.com/talks/barry_schwartz_on_our_loss_of_wisdom.html"&gt;http://www.ted.com/talks/barry_schwartz_on_our_loss_of_wisdom.html&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-4700843248837619540?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/4700843248837619540/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=4700843248837619540' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4700843248837619540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4700843248837619540'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/03/real-crisis-we-stopped-being-wise-barry.html' title='The real crisis? We stopped being wise (Barry Schwartz)'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-2795047513242024848</id><published>2009-03-04T12:03:00.000-02:00</published><updated>2009-03-04T12:04:01.246-02:00</updated><title type='text'>Lunes 16/03, 17:00 hrs: Defensa Tesis de Satori: un Ambiente de Aprendizaje de Objetos</title><content type='html'>&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial; font-size: 13px; "&gt;&lt;div&gt;&lt;span style="border-collapse: collapse; "&gt;Invitamos a todos a la &lt;span class="il" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(94, 160, 227); background-position: initial initial; "&gt;defensa&lt;/span&gt; de la siguiente &lt;span class="il" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(94, 160, 227); background-position: initial initial; "&gt;tesis&lt;/span&gt; de licenciatura, que&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse; "&gt;se llevará a cabo el Lunes 16 de Marzo a las 17:00 hrs, FCEyN, aula a&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse; "&gt;confirmar:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse; "&gt;Título: "Satori: un Ambiente de Aprendizaje de Objetos"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse; "&gt;Alumnos: Burella, Juan y Olivero, Fernando&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse; "&gt;Director: Hernán Wilkinson&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse; "&gt;Jurados: Máximo Prieto, Gabriela Arévalo&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse; "&gt;------------------------------&lt;wbr&gt;------------------------------&lt;wbr&gt;--------&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse; "&gt;Resumen&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse; "&gt;&lt;div&gt;El paradigma orientado a objetos es actualmente uno de los paradigmas de desarrollo más utilizados en la industria y en la educación, hecho que determina la importancia de su enseñanza. Se puede afirmar que a pesar de haber transcurrido varias décadas desde su aparición, su enseñanza aún genera desafíos pedagógicos, los cuales se ven influenciados por condiciones externas que dificultan la generación de los resultados esperados. Estos inconvenientes no son inherentes al paradigma sino que, en la mayoría de los casos, son manifestaciones de las carencias que existen en las técnicas y herramientas utilizadas para enseñarlo. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En este trabajo se han analizado varios ambientes, entornos y herramientas utilizados actualmente para su enseñanza, documentando los beneficios y déficits que poseen para cumplir con los objetivos que, según nuestro punto de vista, deben cumplir para tener éxito en la transmisión de este paradigma. Debido a los déficits encontrados, es que vimos la necesidad de crear un nuevo ambiente de aprendizaje, lo cual nos permitió simultáneamente detectar una serie de requerimientos que entendemos estos ambientes deben satisfacer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Satori es por lo tanto el resultado de este trabajo de investigación y desarrollo, al cual lo podemos considerar un ambiente de objetos "puro". Éste, reifica cada uno de los conceptos básicos del paradigma e intenta reflejarlos de la forma más simple y directa posible. Incorpora, desde su concepción, características que pretenden promover la exploración y manipulación como metodología de adquisición de conocimiento y su modalidad de uso expresa la metáfora más importante del paradigma: objetos que colaboran entre sí enviándose mensajes. De esta manera los usuarios del ambiente pueden llevarse un panorama global de qué es el Paradigma Orientado a Objetos, reconociendo a los objetos y los mensajes como las entidades fundamentales.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El ambiente de aprendizaje de objetos Satori, ha sido además desarrollado en un sistema tridimensional &lt;wbr&gt;colaborativo denominado Croquet. Esto permitió la representación en tres dimensiones de los elementos básicos del paradigma, ofreciendo por lo tanto herramientas de inspección y manipulación naturales, principios básicos del modelo pedagógico constructivista. Ofrece también todas las herramientas necesarias para la colaboración virtual entre personas, facilitando y permitiendo compartir el conocimiento adquirido durante el aprendizaje.&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-2795047513242024848?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/2795047513242024848/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=2795047513242024848' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2795047513242024848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2795047513242024848'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/03/lunes-1603-1700-hrs-defensa-tesis-de.html' title='Lunes 16/03, 17:00 hrs: Defensa Tesis de Satori: un Ambiente de Aprendizaje de Objetos'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-4208534469487498761</id><published>2009-02-27T16:54:00.001-02:00</published><updated>2009-03-02T14:22:07.732-02:00</updated><title type='text'>Sesiones de Diseño en Mercap</title><content type='html'>&lt;div&gt;Esta semana retomamos en Mercap algo que llamamos "sesiones de diseño". La idea es juntarnos en grupos de 4 o 5 personas y resolver de manera completa un problema utilizando TDD, en vivo, con una máquina y proyector.&lt;/div&gt;&lt;div&gt;El motivo de hacer "coding" en vivo usando TDD en vez de solo diagramas en un pizarrón tiene que ver con el resultado que se obtiene en ambos casos. Hacer diagramas en un pizarrón está bien para hacer algo rápido y hasta a veces incompleto, pero como ya sabemos, cuando hay que programar la solución, hay que tener en cuenta todos los detalles, hay que formalizar lo que pensamos y es en estos casos donde se aprende más. Esto me hace acordar la frase "el diablo está en los detalles..." bueno, acá no es el diablo pero sí hay temas muy interesantes que surgen al hacerlo&lt;/div&gt;&lt;div&gt;Por cuestiones de responsabilidades no hacemos que estas reuniones duren más de una hora y media y tratamos de que los problemas no tengan que ver directamente con el negocio en el cual trabajamos para despejar un poco la mente de los problemas del día a día.&lt;/div&gt;&lt;div&gt;La verdad que es muy interesante hacerlo y muy enriquecedor. Desde el punto de vista pedagógico es interesante ver la mecánica de cada grupo, las ideas distintas y similares, etc. También vamos a comparar los resultados de cada grupo para aprender de las diferencias.&lt;/div&gt;&lt;div&gt;Hasta ahora la conclusión más interesante que saqué salió de un error que cometieron todos los grupos y fue que el primer test que hicieron fue muy complejo, no siguió el espíritu de TDD, de hecho llevó casi una hora escribirlo y en dos grupos no logramos hacerlo funcionar en el tiempo de la sesión. Pero también es verdad a que se debió por el enunciado del problema, en donde el primer caso planteado era complejo. &lt;/div&gt;&lt;div&gt;Otra diferencia interesante fue como un grupo generalizó mucho más de entrada que el resto y fue justamente este grupo el que menos logró hacer finalmente, como era de esperarse.&lt;/div&gt;&lt;div&gt;Es bueno recordar que TDD nos pide hacer iteraciones chiquitas, tratar de tener un "verde" lo más rápido posible, y esto tiene que ver más que nada por una cuestión psicológica... ver que avanzamos nos mantiene contentos e inspirados.&lt;/div&gt;&lt;div&gt;La semana que viene veremos como sigue la cosa. Voy a tratar de seguir posteando las conclusiones que me resulten interesantes.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-4208534469487498761?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/4208534469487498761/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=4208534469487498761' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4208534469487498761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4208534469487498761'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/02/sesiones-de-diseno-en-mercap.html' title='Sesiones de Diseño en Mercap'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-7211961703235167904</id><published>2009-02-25T18:16:00.003-02:00</published><updated>2009-02-25T18:23:40.703-02:00</updated><title type='text'>Mock objects considered harmful (sometimes) [1]</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; "&gt;&lt;div style="margin-top: 8px; margin-right: 8px; margin-bottom: 8px; margin-left: 8px; font: normal normal normal small/normal arial; "&gt;&lt;div&gt;&lt;div&gt;Estuve leyendo un poco más sobre BDD y caí en estos artículos que explican como hacer BDD con RSpec en Ruby:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://www.oreillynet.com/pub/a/ruby/2007/08/09/behavior-driven-development-using-ruby-part-1.html&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://www.oreillynet.com/pub/a/ruby/2007/08/30/behavior-driven-development-using-ruby-part-2.html&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;El segundo es más interesante que el primero. Si tienen un tiempo léanlo antes de seguir, por lo menos la parte final a partir de la cual crea la clase Game para representar el juego (Sección "Indroducing Mock Objects vis the Game Class"). Por favor, analicen críticamente el diseño que propone y los test que hace antes de seguir (por supuesto que pueden seguir leyendo si quieren, pero seguramente van a entender mejor lo que digo si lo leen).&lt;div&gt;Bueno, si lo leyeron y analizaron, deberían tener algunas críticas, ¿no?. Yo tengo un par que me parecen muy importantes, es más una hasta me hizo (y hace) dudar sobre la capacidad y experiencia de la persona que escribió pero voy a tratar de no ser muy duro puesto que es muy fácil criticar y muy difícil hacer. (Si llegaron hasta acá y se están preguntando que tiene que ver todo esto con el título, no desesperen, ya llega).&lt;/div&gt;&lt;div&gt;La primer critica que tengo es el acoplamiento que tienen los objetos instancias de Game[2] con la UI. Ver este acoplamiento me hace creer que la persona que escribió el artículo no conoce MCV (Model View Controller), el primer framework para desarrollar aplicaciones visuales (me atrevería a decir el primer framework) y del que se han derivado muchos patrones (si leyeron el libro de Design Patterns saben a que me refiero). &lt;/div&gt;&lt;div&gt;Una de las reglas de diseño que  MVC "impone" es que el modelo nunca debe conocer la UI. La UI es un consumidor del modelo y el modelo únicamente provee comportamiento que luego las ventanas, views, etc. usarán para mostrarlo. En la solución planteada por G.Brown, objetos instancias de Game (que son objetos del modelo) conocen una UI, de la cual obtiene información como quienes son los jugadores o de cuantos puntos es el tablero. Este acoplamiento desde mi punto de vista es innecesario y puede ser resuelto fácilmente pasándole esa información a Game cada vez que se crea una instancia. O sea, la UI una vez que tiene toda la info y el usuario presionan el botón "Jugar" (o como se llame), crearía una instancia de Game indicándole quienes son los jugadores y cuantos puntos tiene el tablero, algo así:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;playPushed&lt;/div&gt;&lt;div&gt;   ....&lt;/div&gt;&lt;div&gt;   game := Game playedBy: (Array with: 'Juan' with: 'Pepe') withSizeOf: 10.&lt;/div&gt;&lt;div&gt;   ....&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;De esta manera no existiría ningún acoplamiento entre Game y la UI, de hecho cualquier objeto podría crear un Game, como por ejemplo un test. Lo bueno de esta solución es que tampoco es necesario usar un mock para simular la UI (por no estar esta acoplada con Game), permite que nos concentrarnos en el modelo y que no tengamos que "adelantarnos" y "suponer" cual será el protocolo de la UI. So far, la primer crítica. Primera conclusión, seguir los principios de MVC! Segunda conclusión: El mock de UI no fue necesario&lt;/div&gt;&lt;div&gt;Paso a la segunda crítica: En el ejemplo del paso 15, se puede ver que se redefine el mensaje de construcción de instancia de Grid para devolver un mock que la simule. Según lo que comenta G. Brown, hacerlo evita que se tenga que usar Grid o crear instancias de esta clase "innecesariamente". No quiero sonar rudo, pero me parece un pésimo ejemplo y una muy mala conclusión. En primer lugar porque está rompiendo el encapsulamiento de Game al redefinir el comportamiento del mensaje de construcción de instancias de Grid, y lo está rompiendo porque sabe que Game "usa" Grid para representar el tablero. ¿Qué pasaría si Game decide utilizar otro objeto para representar el tablero? El test dejaría de funcionar. Claramente el hecho de que Game colabore con Grid es una decisión de Game que a nadie debería importarle y menos a un test!. Haberlo hecho hizo que el test se convirtiera en uno de "caja blanca", con todas las desventajas que sabemos que eso tiene. &lt;/div&gt;&lt;div&gt;Lo mismo sucede con el mock que llama box_set y que utiliza para realizar movimientos por medio del mensaje #stub_move. Lo que está haciendo ahí en definitiva es simular lo que debería suceder en los objetos del modelo del juego, ¿pero para qué? ¿no se supone que estamos testeando el modelo? Además, si el mismo ya está hecho, ¿para qué lo simulamos? (además de romper nuevamente el encapsulamiento...). Devuelta, criticar es fácil, por lo tanto para no ser uno más del montón hay que ofrecer una solución, y para mi la solución acá es simple: ¡utilizar Game sin ningún mock! ¿Cuál es el problema de decirle a una instancia de Game que se unieron dos puntos tantas veces como sea necesario para crear el estado del juego sobre el cual se quiere testear (o empezar a testear) su comportamiento?&lt;/div&gt;&lt;div&gt;Bien, ahora si voy al título del post. Yo me pregunto, ¿G. Brown realmente cree que hacer esto está bueno o simplemente lo hace para utilizar (y mostrar como utilizar) mocks? Si el motivo fuese mostrar como utilizar los mocks, no me parece un buen ejemplo y hasta diría que es destructivo porque como ya sabemos, los seres humanos aprendemos de ejemplos y no quiero ni pensar todos los pobres programadores que están haciendo tests utilizando este ejemplo como guía. Si por el contrario lo hace así porque cree que es un buen diseño, mi pregunta es: ¿por qué cree que es un buen diseño? Una posible explicación es, como puse más arriba, que no conozca de MVC o de encapsulamiento, lo cual sería una lástima por todos los que lo leen; pero otra posible explicación, y es la que me motivó a poner el título del post y que veo muy a menudo últimamente, tiene que ver con la famosa frase que dice: "cuando lo único que conoces es un martillo, todos los problemas se parecen a un clavo". En este caso el martillo son los mock objects y que todo se parezca a un clavo son las soluciones que ofrece en su diseño usándolos. Lamentablemente en nuestra profesión es muy común ver como cuando aparece algo nuevo (o que parece nuevo) se lo empieza utilizar sin realizar el más mínimo análisis crítico de si se lo está usando correctamente; es nuevo, es cool, ¡usémoslo!&lt;/div&gt;&lt;div&gt;Eso es lo que veo muchas veces con los mocks, se los sobre-utiliza generando ejemplos perjudiciales y problemas de mantenimiento en los tests. En el ejemplo del mock para Grid: ¿qué pasaría con el test si se decide modificar el nombre del mensaje de creación de instancia de Grid? Claramente dejaría de funcionar y simplemente por el hecho de haber roto el encapsulamiento.&lt;/div&gt;&lt;div&gt;¿Cuándo utilizar un mock object entonces? Por lo menos para mi en este post me quedó claro que existen dos casos donde no hay que usarlos:&lt;/div&gt;&lt;div&gt;1) Para resolver problemas intrínsecos de diseño (como el acoplamiento de Game y UI)&lt;/div&gt;&lt;div&gt;2) Cuando se rompe el encapsulamiento (como el caso de Game y Grid)&lt;/div&gt;&lt;div&gt;En los tests, según mi experiencia, hay que usar mock objects para representar objetos que están por "afuera" del objeto que se está testeando y que este debe colaborar con para poder llevar adelante una responsabilidad. Pero mi consejo es, antes de usar un mock asegúrense que no pueden usar un objeto "de verdad"...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[1] Me imagino que todos deben conocer el famoso paper de Dijstra, "Goto considered harmful" que para algunos marcó el hito del inicio de la programación estructurada. De la misma manera que ya el "... driven development" está siendo sobre utilizado, me tomé el atrevimiento de sobre-utilizar el "... considered harmful" para llamar la atención. Espero por lo menos haber sido fiel al espíritu del artículo de Dijstra...&lt;/div&gt;&lt;div&gt;[2] Dicho sea de paso, Game no me parece un buen nombre para esta clase. Debería indicar por lo menos qué juego es.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-7211961703235167904?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/7211961703235167904/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=7211961703235167904' title='4 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7211961703235167904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7211961703235167904'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/02/mock-objects-considered-harmful.html' title='Mock objects considered harmful (sometimes) [1]'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-7278051274818840145</id><published>2009-02-20T08:48:00.001-02:00</published><updated>2009-02-20T09:26:22.069-02:00</updated><title type='text'>Qi4j and state modeling</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; "&gt;&lt;div style="margin-top: 8px; margin-right: 8px; margin-bottom: 8px; margin-left: 8px; font: normal normal normal small/normal arial; "&gt;&lt;div&gt;Un amigo me pasó este link sobre algo que están haciendo en Java: &lt;a href="http://www.jroller.com/rickard/entry/qi4j_and_state_modeling"&gt;http://www.jroller.com/rickard/entry/qi4j_and_state_modeling&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Es interesante, pero es algo que nuevamente refleja las complicaciones que tienen en Java para poder hacer cosas sencillas. &lt;/div&gt;&lt;div&gt;Primero: el problema que tienen por usar POJOs (Plain Java Objects, lo que comúnmente hacemos en Smalltalk) puesto que lo escrito es muy distinto a lo que se "habla" en el dominio. Me alegro de escuchar ese argumento!, quiere decir que la gente está empezando a apreciar lo que venimos diciendo por años y es la importancia de hablar "el mismo idioma" con el experto del dominio, el problema es que no se dan cuenta que el "problema" está en la sintaxis y diseño de Java y que hay otros lenguajes, como Smalltalk, donde eso no sucede. O sea, el problema no está en usar Plain Objects, el problema esta en usar Plain Objects con la sintaxis de Java. Justamente debido a la sintaxis de Smalltalk es que a nadie se le ocurriría hacer algo como lo que está haciendo esta gente. &lt;/div&gt;&lt;div&gt;Segundo: Habla de que quieren tener un lenguaje similar al del dominio del problema, pero sin embargo usar un keyword que seguro nadie del dominio entiende como @UseDefault. ¿Qué significa eso para un experto del dominio?, seguro nada&lt;/div&gt;&lt;div&gt;Tercero: Me vuelven loco los ejemplo pelotudos de uso de interface como este en donde extrae la propiedades de ser "nombrable" y crea la interface "Nameable". Y perdón por la palabra pelotudo, pero la verdad este tipo de ejemplos lo único que hacen es complicarle la vida al que aún está aprendiendo. Uno de los motivos es porque esto sucede al final de un desarrollo, no mientras se está desarrollado y entendiendo el dominio. De este ejemplo se puede sacar la conclusión de que cualquier cosa que tenga sentido se puede poner en una interface por que si, sin analizar que hacerlo puede agregar complejidad al diseño! ¿qué otra cosa que no sea un ser humano puede tener nombre y apellido? Nada! Entonce, ¿para que factorizarlo así?. Por otro lado, el motivo por el cual dice que es bueno hacerlo es porque ahora podrán preguntar si "x instanceOf Nameable"... parece que de polimorfismo poco esta persona. Justamente preguntar por el tipo de un objeto es el claro ejemplo de que aún están pensado en "estructurado" y no en objetos. No más palabras sobre esto porque me está subiendo la temperatura&lt;/div&gt;&lt;div&gt;Tercero: Dice que cuando modelan le gusta hablar de propiedades, relaciones, etc., pero en ningún momento veo que hable de comportamiento! lo más importante! Si solo le interesa propiedades y relaciones, ¿por qué no hace un DER?. Nuevamente, un ejemplo de que no lograron entender el paradigma de objetos y están usando técnicas de otros paradigmas. &lt;/div&gt;&lt;div&gt;Cuarto: No entiendo por qué separan Entity de Value. Es algo que ya lo vi varias veces y el motivo es que los Values son inmutables, las entities no. Nunca escuche esta separación en filosofía ni en epistemología ni en nada similar, solo en nuestra profesión y por lo tanto me parece que es un problema del dominio computable... si es así, ¿por qué confundirlo a experto del dominio con esto?.&lt;/div&gt;&lt;div&gt;Quinto: El ejemplo del método listName() en la sección Privitanzing State me mató! jaja. Más me mató la frase siguiente: "Heat huh?". ¿Neat?, yo diría "a mess man!" a mess que rompe el encapsulamiento y que para perdir un nombre tengo que envier el mensaje "name()" y luego "get()"! o sea, primero tengo algo que no es lo que quiero (seguramente será un Value o Entity) y luego le pido su "valor" que es lo que realmente quiero... ¿no debería ser al revés en todo caso para que sea más simple?... en fin.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Algo que me gusto, es que como vine escribiendo últimamente, evitan usar nil (o null en java). Parece que esta idea está empezando a tomar forma simultáneamente en otras comunidades lo cual es bueno. Otra cosa interesante es que reifican las relaciones (algo esperable también por la orientación al paradigma relacional que tienen), algo que también veo como importante pero que lamentablemente nunca tuve la oportunidad de probarlo seriamente.&lt;/div&gt;&lt;div&gt;Conclusión, que lástima ver el tiempo que se pierde en tratar de resolver problemas no esenciales (reinventar la rueda pinchada como dice Alan Kay) creados a partir de decisiones de diseño incorrectas (en este caso decisiones del diseño del lenguaje Java).&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-7278051274818840145?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/7278051274818840145/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=7278051274818840145' title='4 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7278051274818840145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7278051274818840145'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/02/qi4j-and-state-modeling.html' title='Qi4j and state modeling'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-4566649945270953970</id><published>2009-02-18T18:55:00.000-02:00</published><updated>2009-02-18T18:56:04.026-02:00</updated><title type='text'>Tip 3: Objects must be valid since its creation time</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; "&gt;&lt;div style="margin-top: 8px; margin-right: 8px; margin-bottom: 8px; margin-left: 8px; font: normal normal normal small/normal arial; "&gt;Este tip de diseño del que hablé en mi presentación de Smalltalks 2008 es muy importante de mi punto de vista. La idea que trata de transmitir este tip es que cuando se crea un objeto, el mismo debe ser válido. Hay motivos teóricos y prácticos para demostrar por qué es un tip importante. Voy a empezar por el teórico.&lt;div&gt;Si están de acuerdo con la visión de que un objeto es una representación de un ente de la realidad, es muy importante preguntarse a partir de qué momento ese objeto representa el ente en cuestión. Y la respuesta sería (rápidamente) ¡cuanto antes mejor!, sino mientras tanto tendremos un objeto que no representa nada, un objeto que no puede cumplir con sus responsabilidad, un objeto que puede traer problemas. Este tip se relaciona bastante con el anterior en el cual comentaba la importancia de identificar claramente cuál es la identidad del ente representada en el objeto puesto que el objeto puede representar el ente una vez que la identidad del mismo es modelada por el objeto. Esto ya parece un trabalenguas. Voy a dar un ejemplo para tratar de transmitir la idea más claramente por lo que ahora nos iremos metiendo en los motivos prácticos. &lt;/div&gt;&lt;div&gt;Supongamos que tenemos que modelar una tasa de interés. En cualquier libro financiero verán que una tasa de interés es representada por un porcentaje durante cierto tiempo. Es común por lo tanto encontrarse con tasas de interés del 10% anual, o del 5% mensual. Una tasa de interés del 10% anual significa que si invertimos nuestro capital por un año, al finalizar el año recibiremos un 10% de nuestro capital como "premio" por haber hecho la inversión (estoy suponiendo que no hay pago intermedios, etc). La tasa de interés es presentada algebraicamente como la división del porcentaje por el tiempo. Esto se puede ver claramente cuando escribimos la fórmula de interés:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;interés = capitalInvertido * tasaDeInterés * tiempoDeInversión  donde tasaDeInterés = porcentaje / tiempo &lt;/div&gt;&lt;div&gt;por lo tanto:&lt;/div&gt;&lt;div&gt;&lt;div&gt;interés = capitalInvertido * porcentaje / tiempo * tiempoDeInversión  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Por lo tanto si capitalInvertido es 100 $, la tasa es 10% anual e invertimos por 2 años, tendríamos:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;interés = 100 $ * 0.1 / 1 año * 2 años --&gt; años con años se simplifican y tenemos = 100 $ * 0.1 * 2 = 20 $&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Volviendo a nuestro modelo, podemos usar la clase "InterestRate" para modelar tasas de interés, la cual sabrá responder mensajes de creación de instancia como #of: aPercentage every: aTimeMeasure, o mejor aún #yearlyOf: aPercentage. Veamos un ejemplo en código:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;InterestRate of: 10 % every: 1 year --&gt; Devuelve una tasa de interés del 10% anual&lt;/div&gt;&lt;div&gt;InterestRate yearlyOf: 10% --&gt; Hace lo mismo que la colaboración anterior&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora bien, este tip dice que el objeto que los objetos deben ser válidos desde el momento que se crean, esto significa para este ejemplo que cuando se crea una tasa de interés la misma debe ser válida. ¿Qué tasa de interés no sería válida? (una pregunta medio retorcida puesto que en realidad si no es válida no existe como tasa de interés, pero creo que se entiende no?). Claramente una tasa de interés no válida es aquella cuyo lapso de tiempo sea 0 (0 años, 0 meses, 0 días, etc. ¿recuerdan mi comentario sobre la igualdad del 0 con las medidas?) o cuyo porcentaje o tiempo sea negativo. El primer caso se puede deducir fácilmente puesto que de lo contrario el valor representado por una tasa de interés (que es la división del porcentaje por el lapso de tiempo como vimos más arriba) no se podría calcular por estar dividiendo por 0. El segundo tiene que ver más que nada con reglas de negocio, no existen tasas de interés negativas o con tiempos de inversión negativo! no tiene sentido. &lt;/div&gt;&lt;div&gt;Esto significa que en el mensaje de construcción de instancia de "InterestRate" tenemos que asegurar estas tres pre-condiciones. La manera en que nosotros lo implementamos es la siguiente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;InteresRate class&gt;&gt;of: aPercentage every: aTimeMeasure&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;self assertPercentageIsPositive: aPercentage.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;self assertTermNotZeroOrNegative: aTimeMeasure.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;^self new initializeOf: aPercentage every: aTimeMeasurement&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;Se puede ver claramente que lo primero que se hace es validar que las pre-condiciones de existencia (y fíjense que ya no dije validez) de una tasa de interés se cumplan. Si la validación no es exitósa se generará una excepción, que en nuestro caso será una subclase de InstanceCreationException, indicando que pre-condición no se cumplió.&lt;/div&gt;&lt;div&gt;Fíjense que por haber hecho esto al momento de crear una tasa de interés, es imposible tener tasas de interés inválidas. El concepto de tener objetos inválidos desaparece y de repente solo tengo o no tengo dichos objetos, lo cual podríamos decir que se condice con la realidad puesto que en la misma no existen tasas de interés inválidas, nunca un banco daría una tasa de interés con tiempo 0 o negativo, es impensable. Uno podría decir que -10% anual es una tasa de interés, lo podría escribir en un pizarrón o aún en este blog, pero llamarla tasa de interés es un abuso y hacerlo es simplemente una ilusión que podemos tener puesto que realmente no es una tasa de interés y un experto del dominio nos lo diría de entrada.&lt;/div&gt;&lt;div&gt;El problema de tener objetos válidos o inválidos tiene que ver más que nada con un problema computacional debido a que alguien (persona o computadora) en algún momento debe ingresar los "datos" para crear la tasa de interés. Esto implica que existe un tiempo en el cual se ingresan "datos" y que por lo tanto deben estar en "algún lado" en nuestro modelo durante ese tiempo y también implica que esos datos pueden estar incompletos. Pero entonces ese problema no corresponde ser resuelto por el objeto del modelo, en este caso "InteresRate", sino por aquel que se encarga del ingreso de datos. &lt;/div&gt;&lt;div&gt;Al haber hecho que una tasa de interés no se pueda crear si no es válida, ya no solo podemos asegurar que el usuario nunca creará tasas inválidas sino también que ningún programador lo hará!, si lo hace enseguida nuestro modelo le indicará que se equivocó, lo cual es buenísimo y tiene que ver con otro tip que veremos más adelante que se llama "Fail fast". Otra ventaja es que tenemos las famosas validaciones de negocio, o mal llamadas reglas de negocio en un solo lugar y no dispersas por cualquier lado (la UI, una interfaz batch, etc). Siempre que se cree una tasa de interés, venga de donde venga, la UI, un programador, otra computadora, etc, se realizará este chequeo que nos asegura que nuestros objetos siempre serán.... válidos (pensé en terminar la frase en serán, puesto que si no lo son, no existen que es lo mismo según mi punto de vista a que no son válidos; es como pensar que la palabra "válido" desaparece de mi idioma, deja de tener sentido).&lt;/div&gt;&lt;div&gt;Ustedes podrán preguntar cómo representamos entonces aquellos casos para los cuales la información ingresada es incompleta o no correcta, bueno, por medio de un objeto para tal fin! Por ejemplo, si aplicamos el mismo concepto para un "Deal" podríamos tener una intención de deal (DealIntention) para representar aquel que aún no se sabe si es válido. Esto puede parecer como que generará una explosión de clases pero la realidad no es así. En nuestro caso en lo que respecta a la UI, son los mismos widget o controllers los que se encargan de contener esa información inválida (Este blog ya es muy largo, pero cuando pueda voy a comentar como funciona la UI que hicimos para XTrade porque me parece muy interesante)&lt;/div&gt;&lt;div&gt;Esta característica de tener objetos solo válidos se potencia aún más cuando dichos objetos son inmutables, como el caso de la tasa de interés, o fechas, o medidas, etc. puesto que no habrá manera de que dicho objeto pase a ser inválido con el transcurso del tiempo. Si el objeto es mutable, podemos aplicar lo que mencione y detallaré más adelante como sincronización por copias. &lt;/div&gt;&lt;div&gt;Analizando aún más este tip, veremos que para objetos inmutables estas pre-condiciones se fusionan con el concepto de invariante. Hemos logrado poner en un solo lugar las pre-condiciones de varios métodos y la invariante de un objeto, lo cual me parece muy interesante por haber simplificado esta representación.&lt;/div&gt;&lt;div&gt;Algunos detalles de implementación adcionales:&lt;/div&gt;&lt;div&gt;1) Todos los mensajes de creación de instancia deben en definitiva terminar cayendo en la evaluación de un único método de creación de instancia que es además es que realiza todas las aserciones. Para nuestro ejemplo, #yearlyOf: debería estar implementado así:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;InterestRate class&gt;&gt;yearlyOf: aPercentage&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;   ^self of: aPercentage every: 1 year&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2) Debería haber un solo mensaje de inicialización que es enviado desde un único método de creación de instancias que es el que realiza las aserciones. Esto implica que el mensaje #new enviado a self se realiza en un solo lugar.&lt;/div&gt;&lt;div&gt;3) Se puede reificar aún mejor el concepto de pre-condiciones para luego hacer meta-programación con las mismas y por lo tanto generar documentación automática (para interfaces por ejemplo) o test automáticos como presentó Meyer la semana pasada&lt;/div&gt;&lt;div&gt;Bueno, suficiente por ahora, no tengo ni tiempo de releer lo que escribí así que espero que se pueda leer bien! &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-4566649945270953970?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/4566649945270953970/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=4566649945270953970' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4566649945270953970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4566649945270953970'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/02/tip-3-objects-must-be-valid-since-its.html' title='Tip 3: Objects must be valid since its creation time'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-6860660120225538745</id><published>2009-02-18T16:56:00.002-02:00</published><updated>2009-02-18T17:02:45.716-02:00</updated><title type='text'>Behavior Driven Development</title><content type='html'>Estuve leyendo sobre una "nueva técnica" (si, otra más!) para desarrollar software. Es una técnica y no una metodología por lo tanto no es algo pesado ni complicado. En realidad es una técnica que según el autor trata de resolver algunos problemas que se encontró mientras enseñaba y usaba TDD. &lt;div&gt;El artículo donde describe la técnica como introducción es interesante. La técnica se llama Behavior Driven Development y se puede leer una introducción &lt;a href="http://dannorth.net/introducing-bdd"&gt;acá&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;No la he probado aún pero hay varias cosas que comenta que comparto y que veo que tan equivocados no estábamos cuando empezamos allá por el 2000 o 2001 a utilizar TDD como técnica de desarrollo para luego darnos cuenta que era más que una técnica de testing. Parece ser que ya varios se dieron cuenta de esto y el cambio propuesto por Dan North y hasta las palabras que usa, como "Behavior" me recuerda mucho a lo que siempre estuvimos enseñando.&lt;/div&gt;&lt;div&gt;Espero que disfruten del artículo y si alguien tiene alguna experiencia usándolo por favor comente que le parece. Según tengo entendido está teniendo bastante actividad en la comunidad de Ruby.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-6860660120225538745?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/6860660120225538745/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=6860660120225538745' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6860660120225538745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6860660120225538745'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/02/behavior-driven-development.html' title='Behavior Driven Development'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1618029030110680192</id><published>2009-02-16T11:05:00.002-02:00</published><updated>2009-02-16T15:11:59.031-02:00</updated><title type='text'>Bertrand Meyer en Argentina</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; "&gt;&lt;div style="margin-top: 8px; margin-right: 8px; margin-bottom: 8px; margin-left: 8px; font: normal normal normal small/normal arial; "&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: 16px; "&gt;&lt;div style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; width: auto; font: normal normal normal 100%/normal Georgia, serif; text-align: left; "&gt;La semana pasada tuvimos el honor de que nos visitara Bertran Meyer. Dio dos charlas en Buenos Aires, una en la UTN, organizado por los Seminarios Athena y otra en la FCEyN de la UBA organizada por Marcelo Frías. &lt;div&gt;La primera (dada en la UTN) se trató sobre su punto de vista sobre como enseñar el curso de introducción a programación en estos días. En la misma comentó por qué los métodos más usados no eran de su agrado (programming in the small, teach API, just formal programming, teach a language, just functional programming) y cuales utiliza él. Uno de los temas que recuerdo como interesante era el hecho de hacer que los alumnos empiecen a programar con un framework ya creado para que aprendan a usar primero para luego aprendan a hacer. Me hizo recordar a lo que hacemos nosotros cuando les damos Smalltalk en POO, primero lo empiezan a usar y luego lo tienen que ver en más detalle y hasta modificar en DAO. De los 26 temas que comentaba como importantes para enseñar solo hay 16, que para aquellas personas que conocemos la bibliografía de Meyer no son nada novedosas, ej. Design by Contract, OO, etc. Me parece que lamentablemente el tema no fue el más apropiado para la audiencia porque la mayoría eran estudiantes y no profesores!, además mostró un ejemplo que usan en la primer clase de la materia donde crean la clase Turist que subclasificaba Preview (el framework que usan es para mostrar ciudades y rutas), en la cual el objeto París sabe responder show, Louvre sabe responder highlight, etc. responsabilidades que no le daría a esos objetos, o nombres de objetos que no usaría en todo caso.&lt;/div&gt;&lt;div&gt;La charla en la UBA se trato sobre testing automatizado. Básicamente lo que hacen es generar objetos random con una heurística determinada para algunos tipos de objetos y luego enviar mensajes a dichos objetos (siempre y cuando los mismos cumplan las pre-condiciones) y ver si hay post-condiciones o invariantes que no se cumplan. Si fuese así, se detectó un error. Mostró una estadística en la cual el testing manual encontró 14 errores y el automático 9. Había errores automáticos no encontrados manualmente y viceversa por supuesto. Le pregunté sobre la cobertura que ofrecía esa herramienta y se armó un gran revuelo puesto que dijo que la cobertura no indicaba nada, cosa que concuerdo a medias. Si hay un 20% no cubierto, uno sabe que debe testear ahí. Si tengo un 100% de cobertura por supuesto que no asegura que haya errores puesto depende de con que conjunto de "datos" se hizo la cobertura. En conclusión, no sacaron estadísticas de cobertura. Le pregunté si habían medido el tiempo que llevó encontrar lo errores manuales y los automáticos, dijo que no. Le pregunté si había pensado en utilizar mutation testing para modificar métodos y validar contratos y viceversa, modificar contratos y ver validar código y respondió que no "entendía mutation testing". Esta charla fue más interesante desde mi punto de vista que la anterior. Lástima que a veces hablaba mucho sobre ciertos temas en los que se perdía el núcleo de lo que quería decir.&lt;/div&gt;&lt;div&gt;Por supuesto, no dejó de publicitar su libro que está por salir "Touch of class ..." y Eiffel.&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-1618029030110680192?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1618029030110680192/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1618029030110680192' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1618029030110680192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1618029030110680192'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/02/bertrand-meyer-en-argentina.html' title='Bertrand Meyer en Argentina'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-6167990018269671712</id><published>2009-02-13T13:05:00.000-02:00</published><updated>2009-02-13T13:14:41.299-02:00</updated><title type='text'>Igualdad de Objetos II</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; "&gt;&lt;div style="margin-top: 8px; margin-right: 8px; margin-bottom: 8px; margin-left: 8px; font: normal normal normal small/normal arial; "&gt;Algo que me olvidé de comentar en el post sobre Igualdad de Objetos, es que como el mensaje #= debe devolver true si los dos objetos representan el mismo ente su implementación siempre será verificar si aquellos colaboradores internos que representan la identidad del ente en el objetos receptor del mensaje es igual a los colaboradores internos que representan la identidad en el objeto pasado como parámetro. En pocas palabra, asegurar que ambos "identifican" al mismo ente.&lt;div&gt;En el caso de Date, esto será verificar que el año, mes y día sean iguales (si esa es la representación que se decidió usar para Date).&lt;/div&gt;&lt;div&gt;Una consecuencia interesante en identificar que colaboradores internos representan la identidad del ente es que esto se podría hacer automáticamente lo mismo que una implementación default del mensajes hash, como también asegurar que dichos colaboradores no pueden cambiar.&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-6167990018269671712?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/6167990018269671712/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=6167990018269671712' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6167990018269671712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6167990018269671712'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/02/igualdad-de-objetos-ii.html' title='Igualdad de Objetos II'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-5769848072020769214</id><published>2009-02-13T10:22:00.003-02:00</published><updated>2009-02-13T12:12:50.376-02:00</updated><title type='text'>nil (pongo algo más para que no parezca un error :-)</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'Times New Roman';"&gt;&lt;div style="margin-top: 8px; margin-right: 8px; margin-bottom: 8px; margin-left: 8px; font: normal normal normal small/normal arial; "&gt;&lt;span class="Apple-style-span"   style="  ;font-family:'Times New Roman';font-size:16px;"&gt;&lt;div style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; width: auto; font: normal normal normal 100%/normal Georgia, serif; text-align: left; "&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: 'Times New Roman'; font-size: 16px; "&gt;&lt;div&gt;&lt;div&gt;Cuando escribí el título de este post era solo "nil", pero imaginé que alguien podría pensar que sucedió algún error y que por eso aparece solo "nil" en el título. ¿No les pasó eso miles de veces en los distintos sistemas que hicieron? Yo lo vi mucho, por eso modifiqué el título para no crear esa confusión :-) (por supuesto eso implicaría que Blogger está escrito en Smalltalk, cosa que sabemos que no, pero en fin, me pareció una caso curioso)&lt;/div&gt;&lt;div&gt;Ahora si, lo importante del blog. En las charlas que dio Meyer, comentó que en Eiffel pueden ahora asegurar que nunca se envía un mensaje inválido a nil de manera estática,  que él representó como que "x.f con x en null es detectado estáticamente" (1). Lo que me pareció curioso de ese comentario es que aún existan personas que estén pensando en ese problema cuando la solución es bien sencilla! y es simplemente no usar nil! pero claro, todos lo siguen haciendo por una cuestión histórica y porque la mayoría de los ejemplos que vemos cuando estamos aprendiendo lo hacen. &lt;/div&gt;&lt;div&gt;Cuando le comenté a Bertrand que nosotros no tenemos el problema del nil (o null para él) puesto que no usamos nil para nada porque tenemos es una regla de programación que nos pide crear todos los objetos correctamente de entrada y representar la ausencia de algún objeto con un null object, me parece que lo sorprendió un poco. Inmediatamente me preguntó "cómo representábamos el fin de una lista encadenada por ejemplo", a lo que respondí que simplemente reificaríamos(2) el concepto de fin de lista y utilizaríamos un objeto especial para tal fin, pero no nil. Mi sensación es que se quedó pensando, por lo menos ahí terminó esta parte de la conversación.&lt;/div&gt;&lt;div&gt;Más allá de esta anécdota reciente con Meyer, les quería transmitir nuestra experiencia respecto de este tema y de que se puede vivir sin el objeto nil y conviene hacerlo por ser la fuente de innumerables dolores de cabeza. No se dan una idea cómo se simplifica la codificación creando objetos correctos de entrada, sincronizando con copias, evitando usar nil... Piensenlo por un minuto y traten de imaginar cuantos errores desaparecerían, cuantos "doesNotUnderstand" o "null pointer exception" dejarían de aparecer si nil o null no existieran... seguramente sientan que son muchos.&lt;/div&gt;&lt;div&gt;Les comento otro detalle anecdótico que me parece al mismo tiempo importante y en sintonía con este consejo. Hoy cuando leía unos blogs me encontré con esta charla que dará Hoare en QCon: "Null References: The Billion Dollar Mistake". Según lo que interpreté de su abstract y título, hablará justamente de que la existencia de null references fue un error gravísimo, y que sólo lo creó en ALGOL W por ser un feature fácil de implementar.... otro feature fácil de implementar que trae dolores de cabeza, y del cual coincido plenamente con Hoare, es realmente un "Billion Dollar Mistake".&lt;/div&gt;&lt;div&gt;(1) Después cuando nos comentó como lo hacían durante la cena, mucho no le entendí pero me pareció muy complejo.&lt;/div&gt;&lt;div&gt;(2) Digo reificaríamos y no reificamos porque nunca tuvimos que crear una lista encadenada en Smalltalk :-)&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-5769848072020769214?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/5769848072020769214/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=5769848072020769214' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/5769848072020769214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/5769848072020769214'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/02/nil-pongo-algo-mas-para-que-no-parezca.html' title='nil (pongo algo más para que no parezca un error :-)'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-6339050449623448088</id><published>2009-02-10T18:24:00.002-02:00</published><updated>2009-02-13T13:04:50.190-02:00</updated><title type='text'>Igualdad de Objetos</title><content type='html'>&lt;span class="Apple-style-span"   style="border-collapse: collapse;  font-family:arial;font-size:13px;"&gt;&lt;span class="Apple-style-span"   style="border-collapse: separate;   font-family:'Times New Roman';font-size:16px;"&gt;&lt;div style="margin-top: 8px; margin-right: 8px; margin-bottom: 8px; margin-left: 8px; font: normal normal normal small/normal arial; "&gt;En el post anterior hable sobre el hecho de identificar correctamente la identidad de un objeto y sobre el verdadero significado del mensaje #==, que en definitiva verifica si dos objetos son idénticos, puesto que dos objetos pueden no ser idénticos pero estar representando el mismo ente.&lt;div&gt;Como bien comenta Gabriel (Gaboto) en un comentario, puede suceder que existan dos objetos representando el mismo ente (su ejemplo me confundió un poco) y debemos tener alguna manera de identificar dicha situación. Un ejemplo claro se da en Smalltalk con la clase Date, donde dos instancias distintas (o sea no idénticas) pueden representar el mismo día (por ejemplo hoy). &lt;/div&gt;&lt;div&gt;El mensaje que utilizamos para saber si dos objetos están representando el mismo ente es el mensaje #=, más conocido como "igual". Su semántica es devolver verdadero si dos objetos representa el mismo ente, lo que en lenguaje vulgar o natural decimos "si son iguales"... claro está, acá empieza la confusión. Son iguales por estar representando al mismo ente (por ejemplo el día de hoy, que es idéntico a si mismo) pero no son el mismo objeto necesariamente y por no lo tanto no idénticos entre sí.&lt;/div&gt;&lt;div&gt;Por lo tanto el mensaje #= toma una nueva dimensión y para mí es más claro decir que este mensaje "devuelve true si dos objetos representan el mismo ente", puesto que definir qué significa "si son iguales" es bastante problemático como veremos más adelante. Sería menos confuso usar otro mensaje para esta semántica, por ejemplo #representsSameEntityAs:, pero bueno, ya estamos muy acostumbrado al otro.&lt;/div&gt;&lt;div&gt;El motivo por el cual dos objetos pueden representar el mismo ente se debe únicamente a problemas computacionales. En el caso de la clase Date esto se podría solucionar teniendo una cache de fechas creadas y siempre devolver el mismo objeto para la misma fecha, una implementación similar a la de Symbol, sin embargo hacer esto puede no tener sentido por poder ocupar más memoria o ser más lento que la implementación actual al tener que buscar el objeto en esa cache. En definitiva, si existe un solo objeto para representar un ente o si existen varios es una decisión implementativa y es por ello que siempre hay que utilizar el mensaje #= para saber si dos objetos representan el mismo ente (si son iguales) y sólo utilizar el mensaje #== para dominios computaciones, donde realmente nos interese saber si estamos hablando del "mismo objeto", del objeto que ocupa la misma zona de memoria.&lt;/div&gt;&lt;div&gt;Ahora bien, si se decide que puede haber más de un objeto para representar el mismo ente como el caso de Date, hay que asegurar que esos objetos sean inmutables porque sino estaremos en graves problemas puesto que podrían existir representaciones desincronizadas del mismo ente (creo que a esto apuntaba Gaby con su ejemplo). Imagínense dos objetos representando la misma cuenta corriente donde el saldo en uno es distinto al saldo en otro y donde claramente solo uno de ellos representa bien el ente en ese momento por tener el mismo saldo de la cuenta (por supuesto que también podría suceder que ninguno represente el ente por tener los dos el saldo incorrecto...). En definitiva, un grave problema.&lt;/div&gt;&lt;div&gt;Si no es factible que dicho objeto sea inmutable, hay que asegurar que exista una única instancia "master" para representar el ente y el resto sean solo "representaciones temporales" que tendrán un propósito determinado y esporádico. Un ejemplo de este caso es lo que en mi presentación de Smalltalks mostré como "sincronización" de objetos que comentaré en más detalle más adelante, pero que básicamente consiste en sincronizar la copia "master" con la "termporal" de una vez, con el envío de un solo mensaje. Por supuesto que acá nos metemos con problemas transaccionales, pero por ahora también los esquivaré.&lt;/div&gt;&lt;div&gt;Otro tema interesante que se desprende de este es definir exactamente que significa "que sean iguales". Por ejemplo, 0.5 y 1/2 ¿son iguales?. Ambos representan la misma cantidad, la mitad de algo, por lo tanto desde el punto de vista numérico nos interesa que sean iguales, pero también son distintos. Por ejemplo, desde el punto de vista implementativo uno será representado como un número de punto flotante y el otro como fracción. Mismos ejemplos se pueden dar para medidas equivalentes representadas por distintas unidades. Más interesante aún es pensar si 0 es igual a 0 metro, 0 litro, 0 pesos, etc. No voy a ahondar mucho en este tema ahora, pero la verdad es que sí, todos estos objetos representan lo mismo, o sea nada en cantidad y por lo tanto "son iguales". A muchos esta afirmación les parecerá muy loca pero la explicación matemática es clara. Una medida es la representación de la multiplicación de un número por una unidad, por lo tanto 0 metro es lo mismo a decir 0*metro, que algebraicamente es 0 de la misma manera que es 0 la expresión algebraica 0*A. Algunos denominan esta situación como "el cero polimórfico". Ahora bien, todas estas medidas están midiendo cosas distintas y sería interesante poder determinar esa situación, ¿cómo lo hacemos si devuelven true cuando se les envía el mensaje #=? (lo mismo para 1 metro y 1000 milimetros o 100 centímetros, etc). En Mercap estuvimos discutiendo mucho sobre esta situación, discusión en la que también participó Máximo Prieto y que fueron muy interesantes y acalorados (por qué ocultarlo). Llegamos a la conclusión que como en matemática, debería existir la posibilidad de definir distintas categorías de equivalencias, de la cual la igualdad es simplemente una de ellas. Si esto tiene sentido entonces el mensaje #= sería una implementación de una categoría de equivalencia determinada y podrían existir distintos mensajes para implementar las otras... suena interesante no? ¿Cómo se definiría una categoría o cuál sería su significado? Dependerá de lo que queramos representar, es una decisión totalmente arbitraria... aunque quizá suene mejor consensuada, consensuada con una comunidad o grupo...&lt;/div&gt;&lt;div&gt;En fin, si les interesa este tema avisen, da mucho para discutir y charlar.&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-6339050449623448088?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/6339050449623448088/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=6339050449623448088' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6339050449623448088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6339050449623448088'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/02/igualdad-de-objetos.html' title='Igualdad de Objetos'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1073026161201832262</id><published>2009-01-16T12:15:00.002-02:00</published><updated>2009-01-16T12:55:49.941-02:00</updated><title type='text'>Tip 2: Clearly identify what represents the identity of an object</title><content type='html'>En el primer Tip (si ya se, lo escribí hace mucho...) comenté sobre lo interesante que es tener como objetivo lograr un isomorfismo entre los objetos de mi modelo y los entes del dominio del problema.&lt;div&gt;Además, como ya puse en otros posts, no hay que perder de vista que los objetos representarán la esencia de dichos entes mediante su comportamiento, no estructura, relaciones, etc.&lt;/div&gt;&lt;div&gt;Sin embargo hay otro punto del que siempre hablamos y es la identidad. La identidad es la que permite identificar únivocamente un ente. Todo ente posee una identidad y por lo tanto el objeto que lo representa en nuestro modelo también debe tener una. Sin embargo hay una gran confusión entre lo que es identidad, lo que algunos llaman "estado de un objeto" y lo que es la identidad del objeto. Voy a empezar por este último.&lt;/div&gt;&lt;div&gt;Un objeto, por ser a la vez un ente de la realidad (además de estar representado otro) también posee una identidad. Esa identidad en un ambiente de objetos está generalmente implementada por medio de la posición de memoria que ocupa el objeto. Es lo que hace que ese objeto sea único, no puede haber otro objeto en la misma zona de memoria que otro. &lt;/div&gt;&lt;div&gt;En Smalltalk, se puede saber si dos objetos ocupan la misma zona de memoria usando el mensaje #== Este mensaje tiene por propósito verificar si dos "objetos" son identicos, o sea, si ocupan la misma zona de memoria pero no puede decir nada sobre la identidad del ente que representan dicho objetos. En rigor de verdad, si dos objetos son idénticos significa que están representando al mismo ente y por lo tanto representan la misma identidad del ente, pero si dos objetos no son identicos no se puede asegurar que estén representando a entes no idénticos. Es acá donde se ve claramente la diferencia entre identidad de objeto e identidad de ente. Un ejemplo lo va a aclarar.&lt;/div&gt;&lt;div&gt;En Smalltalk existe la clase Date, pero si evalúo dos veces la siguiente colaboración "Date today" obtengo dos objetos que no son idénticos pero que sí representan al mismo ente, el día de hoy. Por lo tanto no hay que confundir identidad de objeto que viene dado por el ambiente de objetos de identidad del ente que la tenemos que definir nosotros en nuestro modelo.&lt;/div&gt;&lt;div&gt;¿Cómo representamos la identidad del ente? Dependerá del ente que estemos modelando o la implementación que utilicemos. Por ejemplo, los SmallInteger en Smalltlk nos dan la sensación de ser únicos (o sea, de que hay uno y solo un objeto por cada uno de ellos). A nivel implementativo sabemos que no es así, pero es un claro ejemplo donde la identidad del ente esta asociada a la identidad del objeto. Otro ejemplo son los objetos instancia de Symbol, no puede haber más de un objeto para el mismo símbolo que representan de la realidad. Como vismo, no sucede así con las fechas y con otros objetos como aquellos instancias de Time, Point, etc.&lt;/div&gt;&lt;div&gt;¿Qué es lo que representa entonces la identidad de los entes para estos objetos? Siempre es un conjunto de colaboradores internos (variables de instancia) que cumplen ese propósito. En el caso de Date, dependiendo de la implementación serán el número de día, mes y año. En el caso de Point serán esos objetos que representan la coordenada x e y. &lt;/div&gt;&lt;div&gt;Una característica interesante que tenemos que cumplir con estos colaboradores que representan la identidad de los objetos es que no pueden cambiar, puesto que si lo hacen el mismo objeto estaría en un instante de tiempo representando un ente y luego otro, sería un objeto con "problema de personalidad" no les parece?. Es por ello que es fundamental entender bien qué colaboradores internos representan la identidad de un objeto puesto que ellos no pueden cambiar. Hay otras implicancias interesantes de este hecho, la primera es que el mensaje #= del objeto devolverá true si los colaboradores internos que representan la identidad del ente son iguales. Esto significa que si queremos saber si dos objetos representan el mismo ente, debemos usar el mensaje #=, es este mensaje el que nos dirá si dos objetos representan a un ente idéntico o en otras palabras, a exactamente el mismo ente. Moraleja, no confundir identidad de objeto de identidad de ente y por lo tanto nunca, pero nunca usar el mensaje #== en un modelo a menos que ese modelo esté tratando con un dominio de problema computacional y donde realmente se tenga por intención saber si se está tratando a exactamente "el mismo objeto" sin importar si además si representan exactamente el mismo ente.&lt;/div&gt;&lt;div&gt;Esto que estoy comentando les debería disparar una nueva explicación de porque el hash debe estar relacionado con el #= y por qué cuando un objeto cambia los colaboradores que representan la identidad cambia su hash que termina produciendo un descalabro importante en aquellos objetos que dependen de la invariabilidad de esta característica.&lt;/div&gt;&lt;div&gt;También esto tiene que empezar a dispararnos la idea de que hay colaboradores internos que representan la identidad del ente que modela el objeto y otros que no. ¿qué características pueden tener estos otros? ¿pueden cambiar? ¿que representan?. Son muchas preguntas, no tengo una respuesta 100% segura, pero en la mayoría de los casos me parece que dichos colaboradores existirán por motivos implementativos como por ejemplo tener un cache, poder acceder más rápido a un objeto, etc. y no a cuestiones esenciales del dominio de problema en si, pero no lo puedo asegurar.&lt;/div&gt;&lt;div&gt;Otra pregunta interesante para hacerse es, ¿debería el lenguaje ofrecerme herramienta particulares para hacer uso de esta diferencia? Por ejemplo, que defina una clase de esta manera:&lt;/div&gt;&lt;div&gt;Object subclass: #Point&lt;/div&gt;&lt;div&gt;   identityDefinedBy: 'x y'&lt;/div&gt;&lt;div&gt;   instanceVariableNames: ''&lt;/div&gt;&lt;div&gt;   ... etc.&lt;/div&gt;&lt;div&gt;Al hacerlo, automáticamente el ambiente podría asegurar que la identidad no puede cambiar, y algo más interesante aún que la misma se defina en el momento de crear el objeto, algo que veremos en el próximo tip.... mientras tanto tiro la idea, yo aún no tengo un posición tomada.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-1073026161201832262?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1073026161201832262/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1073026161201832262' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1073026161201832262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1073026161201832262'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/01/tip-2-clearly-identify-what-represents.html' title='Tip 2: Clearly identify what represents the identity of an object'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-7834918652192666617</id><published>2009-01-16T11:40:00.005-02:00</published><updated>2009-02-09T18:54:42.306-02:00</updated><title type='text'>Desarrollo ágil y vacaciones</title><content type='html'>Este fin de año terminé destruido, me dí cuenta que durante el 2008 hice muchas cosas e indudablemente sentí el impacto. Por suerte mañana empiezo mis vacaciones y esta vez me voy a tomar 3 semanas seguidas, siento que realmente las necesito. Espero poder desconectarme lo suficiente para volver con ganas para este año, aunque voy a limitar un poco lo que hago porque no quiero terminar otra vez así. Uno de los temas que creo que voy a limitar es la cantidad de tesis que estoy dirigiendo, aunque no lleve mucho tiempo hacerlo el problema es tener que estar pensando en todas ellas simultáneamente más todo el resto de cosas que tengo que hacer... &lt;div&gt;Pero como en ciertas cosas no puedo con mi genio y me enteré de este &lt;a href="http://agileopenbsas2009.wetpaint.com/page/Inscripci%C3%B3n"&gt;seminario ágil&lt;/a&gt;, por ahí presente algo relacionado a la importancia que tiene para mi trabajar en un lenguaje dinámico si realmente se quiere se "ágil". Todo esto me vino a la mente después de haber visto ayer en Mercap Cinema (una vez por semana nos juntamos en el almuerzo a ver videos técnicos) la entrevista en la que estuvieron Dan Ingall y Allen Wirfs-Brook, en donde Dan hace hincapié y repite miles de veces la idea de "self sustainable&lt;span class="Apple-style-span"  style=" -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;font-family:-webkit-monospace;"&gt; &lt;/span&gt;system" o "meta circular system" y Allen hace una comparación entre Internet y la imagen de Smalltalk basada en la idea que no hay que bajar internet para cambiar una página de la misma manera que no hay que bajar la imagen de Smalltalk para cambiar un método. &lt;/div&gt;&lt;div&gt;En fin, todo esto me hizo pensar lo poco que se entiende aún este espíritu dinámico que posee Smalltalk y que no tiene nada que ver con ser "dinámicamente tipado", sino con el hecho de tener un imagen y poder modificar un sistema mientras corre, donde ese sistema puede ser hasta sí mismo! (que es lo que hace incapíe Dan). Creo que la gente está empezando a ver la importancia de los lenguajes dinámicamente tipados y por lo tanto estaría bueno mostrarles un poco más allá y ver que opinan. &lt;/div&gt;&lt;div&gt;En XTrade, donde utilizamos GemStone como server de objetos, es muy común que hagamos cambios sin bajar el sistema, simplemente modificando por medio de un script de topaz (un cliente de texto de GemStone) lo necesario para arreglar un error. Lamentablemente no tuvimos tiempo aún de implementar la modificación del cliente del sistema, que está escrito en VisualAge,  sin tener que cambiarlo completamente, o sea, bajando el cliente y volviéndolo a subir reemplazando toda la imagen, pero sabemos cómo podríamos hacerlo. En una aplicación Web esta característica es aún más interesante.&lt;/div&gt;&lt;div&gt;En fin, ¿qué les parece? ¿sería interesante una charla así en ese contexto? El título que pensé sería algo así: "No se puede ser ágil sin ser dinámico o que nos falta para ser técnicamente ágiles"&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-7834918652192666617?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/7834918652192666617/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=7834918652192666617' title='4 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7834918652192666617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7834918652192666617'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2009/01/desarrollo-gil-y-vacaciones.html' title='Desarrollo ágil y vacaciones'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-6730816602305093160</id><published>2008-12-11T12:25:00.000-02:00</published><updated>2008-12-11T12:27:13.625-02:00</updated><title type='text'>Viernes 19/12 , 16:30 hrs: Defensa Tesis de Reingeniería de Jerarquías Polimórficas Utilizando Traits</title><content type='html'>&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial; font-size: 13px; "&gt;&lt;div&gt;Nuevamente estoy con poco tiempo para postear... tengo pendiente seguir con los tips que presente en Smalltalks 2008, pero por ahora copio esta invitación a la defensa de tesis de Claudio y Nicolás que además dieron una presentación muy buena en Smalltalks 2008 sobre este tema...&lt;/div&gt;&lt;div&gt;----------------&lt;/div&gt;Invitamos a todos a la defensa de la siguiente tesis de licenciatura, que&lt;br /&gt;se llevará a cabo el Viernes 19 de Diciembre a las 16:30 hrs, aula a&lt;br /&gt;confirmar:&lt;br /&gt;&lt;br /&gt;Título: "Reingeniería de Jerarquías Polimórficas Utilizando Traits"&lt;br /&gt;&lt;br /&gt;Alumnos: Acciaresi, Claudio y Buttarelli, Nicolás Martín&lt;br /&gt;Director: Hernán Wilkinson&lt;br /&gt;Jurados: Máximo Prieto, Gabriela Arévalo&lt;br /&gt;------------------------------&lt;wbr&gt;------------------------------&lt;wbr&gt;--------&lt;br /&gt;Resumen&lt;br /&gt;Los Traits son una nueva herramienta de modelado que permite al&lt;br /&gt;programador compartir comportamiento entre objetos sin utilizar la&lt;br /&gt;subclasificación. Este nuevo concepto fue llevado a Smalltalk en el año&lt;br /&gt;2003 y desde entonces a la actualidad se realizaron varios trabajos&lt;br /&gt;utilizando Traits. Sin embargo, la mayoría de estos aborda el tema desde&lt;br /&gt;un punto de vista más bien práctico realizando refactorizaciones de&lt;br /&gt;jerarquías ya implementadas. Este trabajo en cambio, estudia a los Traits&lt;br /&gt;en un marco teórico donde se considera que programar no es otra cosa que&lt;br /&gt;representar conocimiento.&lt;br /&gt;Para cumplir con este objetivo se reimplementó la jerarquía de Collection&lt;br /&gt;utilizando Traits.  Una vez generado el nuevo modelo se realizó un&lt;br /&gt;análisis del mismo en comparación con la jerarquía implementada en el&lt;br /&gt;ambiente de desarrollo elegido: Squeak. Dicho análisis se basó en la&lt;br /&gt;definición e implementación de métricas de calidad y de performance&lt;br /&gt;tomadas sobre ambos modelos.&lt;br /&gt;Durante el desarrollo se encontraron un conjunto de ventajas y desventajas&lt;br /&gt;en el uso de esta nueva herramienta, pero además, se redefinieron los&lt;br /&gt;Traits como la reificación de características comunes entre objetos. De&lt;br /&gt;esta manera, se separa el concepto de Traits con el de eliminar código&lt;br /&gt;duplicado, y se analiza si el hecho de reificar características comunes&lt;br /&gt;entre los objetos del dominio nos ayuda a crear mejores modelos&lt;br /&gt;computacionales de la realidad.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-6730816602305093160?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/6730816602305093160/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=6730816602305093160' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6730816602305093160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6730816602305093160'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/12/viernes-1912-1630-hrs-defensa-tesis-de.html' title='Viernes 19/12 , 16:30 hrs: Defensa Tesis de Reingeniería de Jerarquías Polimórficas Utilizando Traits'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-6437065740132061780</id><published>2008-11-26T10:37:00.003-02:00</published><updated>2008-11-26T10:37:52.874-02:00</updated><title type='text'>Mas fotos sobre Smalltalks 2008</title><content type='html'>Les paso un link a fotos de James Foster sobre el congreso, la cena y la salida al delta: &lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial; font-size: 13px; "&gt; &lt;a href="http://picasaweb.google.com/WeybridgeWay" target="_blank" style="color: rgb(0, 0, 204); "&gt;http://picasaweb.google.&lt;wbr&gt;com/WeybridgeWay&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-6437065740132061780?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/6437065740132061780/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=6437065740132061780' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6437065740132061780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6437065740132061780'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/11/mas-fotos-sobre-smalltalks-2008.html' title='Mas fotos sobre Smalltalks 2008'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-6707305108481951265</id><published>2008-11-25T10:32:00.002-02:00</published><updated>2008-11-25T10:35:04.670-02:00</updated><title type='text'>Smalltalks 2008 en el diario La Razón</title><content type='html'>Salió una referencia a la conferencia en el diario La Razón. Se puede ver en &lt;a href="http://www.ee.larazon.com/ediciones/2008/11/25/default.asp"&gt;http://www.ee.larazon.com/ediciones/2008/11/25/default.asp&lt;/a&gt;&lt;div&gt;Tienen que elegir la sección UAI (donde dice Tapa, arriba a la izquierda) y luego ir a la página 3 de ese suplemento.&lt;/div&gt;&lt;div&gt;Gracias Gonzalo por haber hecho posible esta referencia.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-6707305108481951265?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/6707305108481951265/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=6707305108481951265' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6707305108481951265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6707305108481951265'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/11/smalltalks-2008-en-el-diario-la-razn.html' title='Smalltalks 2008 en el diario La Razón'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-2866801777283146270</id><published>2008-11-21T17:33:00.001-02:00</published><updated>2008-11-21T17:35:11.019-02:00</updated><title type='text'>Comentarios sobre Smalltalks 2008</title><content type='html'>Hay varios blogs que comentaron sobre el evento, pero este me pareció interesante referenciar por que es un buen resumén de lo que sintió Alan Knight:&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial; font-size: 13px; "&gt;&lt;a href="http://www.cincomsmalltalk.com/userblogs/knight/blogView?showComments=true&amp;amp;printTitle=Commodore_64s,_Soccer_Playing_Robots,_and_Lots_and_Lots_of_Meat_&amp;amp;entry=3404719124"&gt;http://www.cincomsmalltalk.&lt;/a&gt;&lt;a href="http://www.cincomsmalltalk.com/userblogs/knight/blogView?showComments=true&amp;amp;printTitle=Commodore_64s,_Soccer_Playing_Robots,_and_Lots_and_Lots_of_Meat_&amp;amp;entry=3404719124"&gt;&lt;wbr&gt;com/userblogs/knight/blogView?&lt;/a&gt;&lt;a href="http://www.cincomsmalltalk.com/userblogs/knight/blogView?showComments=true&amp;amp;printTitle=Commodore_64s,_Soccer_Playing_Robots,_and_Lots_and_Lots_of_Meat_&amp;amp;entry=3404719124"&gt;&lt;wbr&gt;showComments=true&amp;amp;printTitle=Commodore_64s,_Soccer_Playing_&lt;/a&gt;&lt;a href="http://www.cincomsmalltalk.com/userblogs/knight/blogView?showComments=true&amp;amp;printTitle=Commodore_64s,_Soccer_Playing_Robots,_and_Lots_and_Lots_of_Meat_&amp;amp;entry=3404719124"&gt;&lt;wbr&gt;Robots,_and_Lots_and_Lots_of_&lt;/a&gt;&lt;a href="http://www.cincomsmalltalk.com/userblogs/knight/blogView?showComments=true&amp;amp;printTitle=Commodore_64s,_Soccer_Playing_Robots,_and_Lots_and_Lots_of_Meat_&amp;amp;entry=3404719124"&gt;&lt;wbr&gt;Meat_&amp;amp;entry=3404719124&lt;/a&gt;&lt;/span&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/1292532279691646783-2866801777283146270?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/2866801777283146270/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=2866801777283146270' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2866801777283146270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2866801777283146270'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/11/comentarios-sobre-smalltalks-2008.html' title='Comentarios sobre Smalltalks 2008'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-3778373514585038898</id><published>2008-11-18T17:07:00.002-02:00</published><updated>2008-11-18T18:18:39.156-02:00</updated><title type='text'>Tip 1: Create an Isomorphism between objects and entities</title><content type='html'>Este fue el primer tip de la charla de Smalltalks que presenté el viernes pasado. Voy a tratar de repasar todos los tips durante las próximas semanas escribiendo los comentarios que obtuve en el congreso y también esperando que ustedes aporten algún comentario.&lt;div&gt;Este tip tiene como objetivo "lograr un buen modelo". En realidad, la definición de "buen modelo" que dí está basada en las ideas que Einstein escribe en "Física, la aventura del pensamiento", donde básicamente argumenta que un buen modelo es aquel que soporta todas las observaciones que se realizan de la realidad correctamente. Esta idea combinada con la que Norman ofrece en "The Design of Everyday thing" donde básicamente habla sobre la importancia del "mapping" entre los "entes del modelo mental" que uno se realiza de "la realidad" es que aparece este tip.&lt;/div&gt;&lt;div&gt;La idea es que si logramos mapear correctamente cada ente de la realidad a objetos del modelo computable que estamos haciendo estaremos logrando un buen modelo, puesto que cada observación será mapeada directamente a los objetos existentes, y en caso de no poder ser mapeada es porque aprendimos algo nuevo y por lo tanto hay que crear los objetos correspondiente para soportala. &lt;/div&gt;&lt;div&gt;Algo que hay que tener en cuenta sobre este tip, que no comenté en la charla, es que este es un objetivo, es lo que se debe buscar puesto que lograr ese isomorfismo es casi imposible (sino imposible) puesto que siempre habrá algo nuevo para aprender de la realidad o una nueva manera de organizar lo que entendimos. &lt;/div&gt;&lt;div&gt;Otro punto a tener en cuenta es que realmente uno no mapea los objetos con los entes de la realidad sino con el modelo mental que uno realiza de la realidad, es por ello que existen varios modelos del mismo problema que son pensados desde distintos puntos de vista. Es por este motivo que utilizar metáforas para realizar ese modelo mental es fundamental, puesto que guiará nuestra representación e interpretación de la realidad, nos dará una herramienta para entenderla, cuadrarla. El tema de la metáfora es tan importante que hay filósofos post-modernistas que dicen que no pensamos sino a través de metáforas. Representan a estas como "meta-ideas", o sea ideas sobre ideas.&lt;/div&gt;&lt;div&gt;Uno de los comentarios que recibí sobre este tip fue que en el modelo siempre existen objetos que no aparecen en el dominio del problema. En cierta forma es verdad, hay muchos objetos que aparecen en el modelo que no forman parte del dominio de problema funcional, pero muchos de ellos corresponden al hecho de estar haciendo un modelo computable, o sea que son objetos que representan entes de otro dominio de problema, el computable. No tengo manera de probar que siempre estos objetos serán de este dominio pero mi intuición de dice que si.... &lt;/div&gt;&lt;div&gt;Si no fuese así, debería cambiar el "isomorfismo" por aquella relación utilizada para indicar que todos los elementos del codominio se mapeaban al dominio (no recuerdo la palabra ahora).&lt;/div&gt;&lt;div&gt;Más allá de este detalle (no despreciable por cierto), lo importante es no olvidar la consigna de mantener este mapeo como objetivo y recordar la importancia de tener una metáfora que nos guie en el proceso...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-3778373514585038898?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/3778373514585038898/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=3778373514585038898' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3778373514585038898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3778373514585038898'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/11/tip-1-create-isomorphism-between.html' title='Tip 1: Create an Isomorphism between objects and entities'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-3527361588732422884</id><published>2008-11-18T16:53:00.002-02:00</published><updated>2008-11-18T17:07:45.654-02:00</updated><title type='text'>A personal Computer for Children of All Ages</title><content type='html'>Ese es el &lt;a href="http://www.mprove.de/diplom/gui/Kay72a.pdf"&gt;paper &lt;/a&gt;escrito por Alan Kay en Agosto del 72 donde presenta su idea de la Dynabook. Nunca lo había leído y luego de haberlo hecho no cabe duda de la visión que tuvo en su momento. La parte que más gracia me causo fue la que dice "seguramente una de las primeras aplicaciones que harían sería para evitar que aparezca propaganda..." (palabras más palabras menos, no encuentro exactamente lo que dijo ahora) cuando se refería a la conectividad de la computadora. Vale la pena leer esta paper historico.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-3527361588732422884?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/3527361588732422884/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=3527361588732422884' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3527361588732422884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3527361588732422884'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/11/personal-computer-for-children-of-all.html' title='A personal Computer for Children of All Ages'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-4322196641736594464</id><published>2008-11-17T17:29:00.002-02:00</published><updated>2008-11-17T18:02:47.548-02:00</updated><title type='text'>Adios Smalltalks 2008</title><content type='html'>Como ustedes sabrán, Smalltalks 2008 ha terminado. La verdad que han sido 3 días maravillosos, de charlas muy interesantes y de reencuentros muy lindos. Mi intención era hacer un resumen de todas las charlas pero no podrá ser. Vi que Andrés Valloud hizo una serie de comentarios sobre las mismas en su blog, así que pueden leer sobre ellas ahí.&lt;div&gt;Algunas charlas que recuerdo sin ningún orden particular son:&lt;/div&gt;&lt;div&gt;1) Claudio Acciaressi y Nicolás Butarelli que hablaron sobre la reimplementación de Collection para traits. Se notó que prepararon mucho esa presentación y fue muy chistosa&lt;/div&gt;&lt;div&gt;2) Dan Rozenfarb que presentó ExpertCare. Es muy interesante ver como Dan fue cambiando el diseño de la aplicación desde utilizar un árbol de decisión a modelar reglas con algo cercano a lógica de primer orden.&lt;/div&gt;&lt;div&gt;3) Gabriel Cotelli que habló sobre la herramienta reflexiva para generar reportes que usamos en XTrade. Gabriel subió a YouTube una filmación de la charla&lt;/div&gt;&lt;div&gt;4) Monty Williams que dió el keynote y comentó casos de éxito de usar Smalltalk en distintos sistemas. Hay sistemas de misión crítica y con miles de transacciones que ni siquiera sabía que usaban Smalltalk/GemStone, muy impresionante&lt;/div&gt;&lt;div&gt;5) DX Browser Tool de Bruno Buzzi o como implementar herramientas de Smalltalk para administrar web services y archivos XML. Bruno mostró cómo se puede simplificar el uso de herramientas que el hombre hace complejas.&lt;/div&gt;&lt;div&gt;6) Ambiente de Aprendizaje de Objetos de Fernando Olivara y Juan Burella. La presentación fue interesante y llegaron a mostrar el ambiente (en una versión anterior) funcionando en Croquet. Si embargo como se encuentran en medio de una gran refactorización la presentación no se lució tanto como podría haberlo hecho.&lt;/div&gt;&lt;div&gt;7) Glorp, de Alan Knigth. Fue muy intersante como mostró este framework, lástima que no haya presentado temas más relacionados con el diseño que creo que hubiese estado lindo.&lt;/div&gt;&lt;div&gt;8) Los roadmaps de GemStone y Cincom Smalltalk. En de GemStone en particular estuvo muy interesante cuando James mostró una herramienta parecida a WebVelocity pero que corre en GLASS&lt;/div&gt;&lt;div&gt;9) Andrés Valloud nos motró como modelo en coding contest y todas las opciones que tuvo en cuenta para hacerlo, una charla muy interesante para aquellos que trabajamos en el problema&lt;/div&gt;&lt;div&gt;10) Leandro mostró como se puede tener comportamiento por instancia en VisualSmalltalk. El truco es muy interesante y la verdad que la decisión de VisualSmalltalk de que los objetos conozcan un method dictionary en vez de su clase directamente me parece una decisión muy acertada. Como dijo Leandro, es darle más importancia al comportamiento que a la clasificación.&lt;/div&gt;&lt;div&gt;11) La charla de Richie sobre SqueakNos, impresionante. Yo había visto correr SqueakNos antes pero esta vez estuvo muy bien presentado y mucho más estable. En la charla mostro como acceder al boot sector de un disco IDE y todo desde Smalltalk! Ojala podamos hacer crecer este proyecto&lt;/div&gt;&lt;div&gt;12) La mejor charla de todas, por lo menos así fue elegida por la gente, la de Gabriel Honoré que mostró un Emulador de Commodore 64 hecho en VisualWorks! La gente aplaudió como loca con cada chiche que mostraba como el sonido, los juegos, podes controlar la pantalla desde un inspector, etc. Una presentación y trabajo impecable, de exportación!!&lt;/div&gt;&lt;div&gt;También estuvieron las charlas sobre MOOSE, Percolación, SqueakDBX, el trabajo de Tesis de Carlos Ferro, Zafiro y la mia.&lt;/div&gt;&lt;div&gt;Respecto de la mia, creo que generó bastante polvo, por lo menos luego de darla estuvimos hablando sobre varias ideas con Valeria y Richie y las diferencias sobre lo que ellos hacían. También tuvimos unas conversaciones intersantes con Andrés Fortier que me ayudaron a entender como transmitir mejor el mensaje que quería transmitir. Por supuesto, como me ocurre ultimamente, me quedé sin tiempo... es que quiero decir muchas cosas!!! pero fue una lástima porque no pude mostrar ejemplos concretos que hubiesen ayudado a asentar lo que transmitía.&lt;/div&gt;&lt;div&gt;Por supuesto estuvo el coding contest que ganaron Guillermo Amaral y Guido Chari. Lamentablemente yo no le encontré la vuelta aunque conseguí un certificado positivo pero de solo 2 millones contra 26 que consiguieron los ganadores. Creo que hubo varios factores que influyeron en que no lograse encontrar la solución: el cansancio y el hecho de no haber estado trabajando en el modelo por casi dos semanas... pero calavera no chilla! y estoy muy contento de haber participado y programado nuevamente después de unos meses de solo contestar mails, puaj!&lt;/div&gt;&lt;div&gt;Por último, el domingo llevamos a Monty, June, James, Alan y Victor al Tigre. Los llevamos a remar hasta la isla Rufino Elizalde, del Buenos Aires Rowing Club. Estuvo espectacular! creo que lo disfrutaron muchísimo y hasta comimos un asado. Lástima que por la sudestada del sábado el agua había inundado la isla y por lo tanto estaba todo barroso, pero igual creo que fue una experiencia inolvidable para ellos.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Espero que todos hayan disfrutado de esta conferencia tanto como lo hicimos nosotros. Los comentarios que me llegaron así lo dicen... y ya estaremos trabajando para Smalltalks 2009!!!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nos vemos!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-4322196641736594464?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/4322196641736594464/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=4322196641736594464' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4322196641736594464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4322196641736594464'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/11/adios-smalltalks-2008.html' title='Adios Smalltalks 2008'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-399564212667770538</id><published>2008-11-12T09:23:00.002-02:00</published><updated>2008-11-12T09:25:17.133-02:00</updated><title type='text'>Ya llega!! Ya llega!!</title><content type='html'>Si señores y señoras, mañana es el día!! mañana empiza la segunda edición del congreso Argentino de Smalltalk!!! Smalltalks 2008. No dejen de ir y participar, les aseguro que estará muy bueno y también se van a divertir mucho!! y habrá muchas sopresas!&lt;div&gt;Los veo ahí!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PD: Voy a intentar postear un resumen sobre cada charla para mantenerlos al tanto a los que no fueron.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-399564212667770538?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/399564212667770538/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=399564212667770538' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/399564212667770538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/399564212667770538'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/11/ya-llega-ya-llega.html' title='Ya llega!! Ya llega!!'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1057622813217176575</id><published>2008-11-04T16:29:00.002-02:00</published><updated>2008-11-04T16:35:48.542-02:00</updated><title type='text'>Smalltalks 2008 - Descripción de Charlas</title><content type='html'>Me olvide de comentar que en la sección "Charlas" del sitio del congreso hay un link llamado "Ver Propuestas Aceptadas" que lleva a una página con descripciones de las distintas charlas que se darán.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-1057622813217176575?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1057622813217176575/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1057622813217176575' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1057622813217176575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1057622813217176575'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/11/smalltalks-2008-descripcin-de-charlas.html' title='Smalltalks 2008 - Descripción de Charlas'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1967141167388050704</id><published>2008-11-04T14:59:00.001-02:00</published><updated>2008-11-04T15:00:54.532-02:00</updated><title type='text'>Smalltalks 2008 - Corrección</title><content type='html'>En el post anterior puse mal la dirección al sitio web del congreso, el mismo es: &lt;a href="http://neuquina.lifia.info.unlp.edu.ar:8001/Smalltalks-2008"&gt; http://neuquina.lifia.info.unlp.edu.ar:8001/Smalltalks-2008&lt;/a&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/1292532279691646783-1967141167388050704?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1967141167388050704/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1967141167388050704' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1967141167388050704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1967141167388050704'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/11/smalltalks-2008-correccin.html' title='Smalltalks 2008 - Corrección'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-5629429482559566733</id><published>2008-11-03T17:59:00.002-02:00</published><updated>2008-11-03T18:08:46.947-02:00</updated><title type='text'>Smalltalks 2008 - Inscripción y Cronograma</title><content type='html'>Ya está disponible el cronograma del congreso Smalltalks 2008!!! Creo que quedó muy bueno, hay charlas muy interesantes como el Emulador de Commodore 64 escrito completamente en Smalltalk!! (lo vi funcionando y es una masa!) o SqueakNos, la mía por supuesto :-), los temas de persistencia como SqueakDBX y Glorp, sin olvidar los tutorials (uno sobre la arquitectura de GemStone y otro de Futbol de Robots) y las charlas de gente de afuera como Monty Williams (arquitecto de GemStone), Alan Knight y James Forster nuevamente. (El cronograma lo pueden ver en http://neuquina.lifia.info.unlp.edu.ar:8001/ tab Cronograma)&lt;div&gt;No dejen de inscribirse puesto que por cuestiones de seguridad vamos a ser más estrictos este año con el ingreso. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-5629429482559566733?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/5629429482559566733/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=5629429482559566733' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/5629429482559566733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/5629429482559566733'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/11/smalltalks-2008-inscripcin-y-cronograma.html' title='Smalltalks 2008 - Inscripción y Cronograma'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1579994334225316033</id><published>2008-10-30T09:11:00.001-02:00</published><updated>2008-10-30T09:12:47.544-02:00</updated><title type='text'>Entrevista sobre Smalltalks en ClubSmalltalk</title><content type='html'>Hernán Galante nos hizo una entrevista muy interesante a los que estamos organizando Smalltalks 2008. Los que la quieran leer está en: &lt;a href="http://www.clubsmalltalk.org/web/index.php?option=com_content&amp;amp;view=article&amp;amp;id=153:interview-to-the-argentinean-smalltalk-organization-committee&amp;amp;catid=56:interviews-about-events&amp;amp;Itemid=108"&gt;http://www.clubsmalltalk.org/web/index.php?option=com_content&amp;amp;view=article&amp;amp;id=153:interview-to-the-argentinean-smalltalk-organization-committee&amp;amp;catid=56:interviews-about-events&amp;amp;Itemid=108&lt;/a&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/1292532279691646783-1579994334225316033?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1579994334225316033/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1579994334225316033' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1579994334225316033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1579994334225316033'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/10/entrevista-sobre-smalltalks-en.html' title='Entrevista sobre Smalltalks en ClubSmalltalk'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-7661676589142485694</id><published>2008-10-17T10:24:00.003-03:00</published><updated>2008-10-17T10:25:29.782-03:00</updated><title type='text'>Un poco de Historia...</title><content type='html'>La verdad que se me hace complicado mantener el blog con cosas interesantes, no porque no tenga ideas sino porque no tengo tiempo para escribir! &lt;div&gt;En fin, hoy leí un post en la lista de squeak que me pareció muy interesante para compartir (y no escribir tanto). Es sobre la historia de Eclipse y VisualAge Smalltalk.&lt;/div&gt;&lt;div&gt;http://talklikeaduck.denhaven2.com/articles/2008/10/15/will-it-go-round-in-circles&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/1292532279691646783-7661676589142485694?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/7661676589142485694/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=7661676589142485694' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7661676589142485694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7661676589142485694'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/10/un-poco-de-historia.html' title='Un poco de Historia...'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1720485050640455985</id><published>2008-10-02T10:12:00.002-03:00</published><updated>2008-10-02T10:15:05.533-03:00</updated><title type='text'>Smalltalks 2008 - Concurso de Programación II</title><content type='html'>Quería comentar que la reglas del concurso ya están disponibles en castellano. Por un tema de tiempo no llegamos a tenerlas disponibles ayer, pero en el &lt;a href="http://groups.google.com.ar/group/smalltalks2008cc"&gt;grupo del concurso&lt;/a&gt; se encuentra posteada las reglas en castellano.&lt;div&gt;Espero que esto no haya sido un inconveniente. También les comento que en el grupo del concurso se puede postear en inglés y castellano indistintamente.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-1720485050640455985?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1720485050640455985/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1720485050640455985' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1720485050640455985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1720485050640455985'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/10/smalltalks-2008-concurso-de-programacin_02.html' title='Smalltalks 2008 - Concurso de Programación II'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-665581650730422683</id><published>2008-10-01T14:20:00.003-03:00</published><updated>2008-10-01T14:22:35.602-03:00</updated><title type='text'>Smalltalks 2008 - Concurso de programación</title><content type='html'>Ya está disponible en el sitio del congreso de &lt;a href="http://neuquina.lifia.info.unlp.edu.ar:8001/Smalltalks-2008"&gt;Smalltalks 2008&lt;/a&gt; las bases para el concurso de programación! No pierdan tiempo! es un trabajo muy interesante y seguro que lo van a disfrutar y aprender!&lt;div&gt;Además el incentivo es bueno: 1er Premio un iPod Touch, 2do Premio un MP4 y 3er Premio voucher para libros en Yenny! &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/1292532279691646783-665581650730422683?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/665581650730422683/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=665581650730422683' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/665581650730422683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/665581650730422683'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/10/smalltalks-2008-concurso-de-programacin.html' title='Smalltalks 2008 - Concurso de programación'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-7749779002847314806</id><published>2008-10-01T06:21:00.003-03:00</published><updated>2008-10-01T06:48:35.943-03:00</updated><title type='text'>Charla de Smalltalk/X - Mis conclusiones</title><content type='html'>Se hizo esperar, pero finalmente encontré algo de tiempo para escribir mis conclusiones sobre la charla que tuvimos sobre Smalltalk/X:&lt;div&gt;* La charla fue muy interesante y dinámica. Claus mostró mucho conocimiento y experiencia tanto en Smalltalk como en la implementación de Smalltalk. La primera parte de la charla la dedicó a mostrar la implementación de Smalltalk/X y sobre el final mostró la herramienta de testing que han desarrollado.&lt;/div&gt;&lt;div&gt;Me sorprendió la implementación de Smalltalk/X, no la conocía y me gustó bastante. Es una VM que no tiene nada que envidiarle a otras implementaciones, todo lo contrario, es muy superior a Squeak y VisualAge por ejemplo. Algunas características son:&lt;/div&gt;&lt;div&gt;a) Utiliza IC y PIC para acelerar el method lookup. Solo VW hace eso que yo sepa y por lo tanto sobrepasa en performance por varios cuerpos a Squeak y VisualAge (hagan la prueba sino)&lt;/div&gt;&lt;div&gt;b) Utiliza un GC incremental cuando realiza el mark &amp;amp; sweep del old space (por supuesto, es un GC generacional típico). Esto es muy bueno porque permite limitar el tiempo de gc y por lo tanto asegurar tiempos de respuestas para aplicaciones real time. No conozco otro Smalltalk que tenga esta característica. Por los menos VisualAge y Squeak no la tienen y me parece que VW tampoco&lt;/div&gt;&lt;div&gt;c) El modelo de treading es muy interesante. Primero utiliza threads nativas lo cual permite hacer uso automáticamente de máquinas con más de un procesador, sin embargo no pueden haber dos threads ejecutando concurrentemente. O sea, por un lado es una ventaja por poder distribuir la carga pero no está completamente implementada la posibilidad de ejecutar de manera concurrente. Segundo, cada ventana tiene su propia thread de ejecución, por lo tanto si por darle "evaluate" una ventana se queda haciendo un loop infinito, esto no "cuelga" las otras ventanas, se puede seguir trabajando de manera "normal" (Finalmente alguién que hizo bien esto!)&lt;/div&gt;&lt;div&gt;d) Tiene la opción interesante de generar imágenes muy chicas y empaquetar todo como exes reales. Aunque personalmente no utilizaría esta opción porque la imagen a mi entender sigue siendo algo muy importante, es una opción interesante cuando es necesario hacer aplicaciones para dispositivos con pocos recursos. Hacerlo traería aparejado mayor tiempo de mantenimiento y desarrollo porque habría que asegurarse de que esté todo lo necesario cuando se crea ese "exe" particular, pero es una opción válida para ciertos ambientes.&lt;/div&gt;&lt;div&gt;e) Es interesante la posibilidad de escribir las primitivas en el mismo ambiente, lo cual permite ver con exactitud cómo está implementado cada método. Una lástima no poder debuggear las primitivas, pero tampoco debería ser un requerimiento muy frecuente.&lt;/div&gt;&lt;div&gt;f) Desde el punto de vista de Smalltalk, es una implementación bastante completa. Tiene SUnit, concexión a BD via ODBC, tiene soporte para aplicaciones web (aunque no soporta SeaSide debido a no poder implementar continuations por no poder reificar el stack de ejecución), tiene el refactoring browser migrado y las herramientas típicas de cualquier Smalltalk.&lt;/div&gt;&lt;div&gt;g) Quizá lo único negativo que podría nombrar es la UI. Tiene un estilo un poco "antiguo" y no tan atractivo, pero es algo lógico puesto que hacer UIs "lindas" lleva tiempo y mucha creatividad. Por supuesto que esto para un programador experimientado no debería moverle la aguja, pero para programadores novatos puede ser un stopper (lo que no entra por los ojos...)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En conclusión, una charla muy completa y muy bien dada desde el punto de vista pedagógico. Se nota que Claus tiene experiencia en lo que habla y tiene mucha didáctica por ser profesor también. La verdad que la disfruté mucho y al día siguiente me bajé Smalltalk/X, lo instalé y jugé un poco con él. Un Smalltalk más para tener en cuenta. Es gratis sin ningún tipo de royalties para desarrollar o vender, completamente gratis. No open source, hay algunas temas que no están abiertos. No hay soporte más allá de la misma comunidad a menos que se page por él (no precisó costos). Es una lástima no compartir esta fabulosa implementación de la VM con otros Smalltalks open source como Squeak, o que Smalltalk/X no haga uso de la UI de Dolphin que es más atractiva... un Smalltalk "casi ideal" sería la VM de Smalltalk/X con el modelo de Squeak o VW (o una mezcla de ambos) y el UI de Dolphin... todo open source por supuesto. Una combinación así sería un caño me parece... igual no creo que suceda, por ahora seguimos viendo islas donde cada implementación trata de seguir mejorando lo que tiene. Eliot Miranda mejorando Squeak, Craig Latta haciendo Spoon, VisualAge tratando de soportar SeaSide, Gilad Bracha implementado NewSpeak, etc. No se si sería factible juntar todos los esfuerzos ni tampoco se si sería productivo, pero si se que sería interesante probar.&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/1292532279691646783-7749779002847314806?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/7749779002847314806/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=7749779002847314806' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7749779002847314806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7749779002847314806'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/10/charla-de-smalltalkx-mis-conclusiones.html' title='Charla de Smalltalk/X - Mis conclusiones'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-4024689362206782431</id><published>2008-09-18T16:06:00.006-03:00</published><updated>2008-09-18T16:43:01.278-03:00</updated><title type='text'>Smalltalks 2008 - Novedades</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: arial; font-size: 13px; "&gt;Por si no se enteraron por otro medio, ya está disponible en el sitio de Smalltalks 2008 la registración para charlas y tutorials! No dejen de presentar sus ideas!.  Ah, la fecha tope se movió al 13 de Octubre, así tienen dos semanas más para pensar.... y no se olviden del concurso... tenemos a varios craniotecas pensando y trabajando en el mismo :-)&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: 13px; "&gt;Acá está el mail con el anuncio:&lt;br /&gt;-----------------------------&lt;br /&gt;Por medio del presente mail queremos informarles las novedades de la&lt;br /&gt;conferencia:&lt;br /&gt;&lt;br /&gt;1. Se encuentra habilitado el envío de propuestas de charlas en&lt;br /&gt;&lt;a href="http://neuquina.lifia.info.unlp.edu.ar:8001/Smalltalks-2008" target="_blank"&gt;http://neuquina.lifia.info.&lt;wbr&gt;unlp.edu.ar:8001/Smalltalks-&lt;wbr&gt;2008&lt;/a&gt; sección&lt;br /&gt;"Charlas". Aquí se podrán presentar distintos tipos de trabajos, ya&lt;br /&gt;sea de industria, investigación o educación. La fecha tope para enviar&lt;br /&gt;es el 13 de Octubre.&lt;br /&gt;&lt;br /&gt;2. Se encuentra habilitado el envío de propuestas de tutorials en&lt;br /&gt;&lt;a href="http://neuquina.lifia.info.unlp.edu.ar:8001/Smalltalks-2008" target="_blank"&gt;http://neuquina.lifia.info.&lt;wbr&gt;unlp.edu.ar:8001/Smalltalks-&lt;wbr&gt;2008&lt;/a&gt; sección&lt;br /&gt;"Tutorials". La fecha tope para enviar es el 13 de Octubre.&lt;br /&gt;&lt;br /&gt;3. Asimismo les recordamos que el 1ro de Octubre publicaremos el&lt;br /&gt;enunciado del concurso de programación. Para mas información ver la&lt;br /&gt;sección del "Concurso de Programación" en&lt;br /&gt;&lt;a href="http://neuquina.lifia.info.unlp.edu.ar:8001/Smalltalks-2008" target="_blank"&gt;http://neuquina.lifia.info.&lt;wbr&gt;unlp.edu.ar:8001/Smalltalks-&lt;wbr&gt;2008&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Esperamos verlos a todos en la conferencia!&lt;br /&gt;Comité Organizador de Smalltalks 2008.&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&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/1292532279691646783-4024689362206782431?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/4024689362206782431/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=4024689362206782431' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4024689362206782431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4024689362206782431'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/09/smalltalks-2008-novedades.html' title='Smalltalks 2008 - Novedades'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-3241370425670057256</id><published>2008-09-18T16:06:00.003-03:00</published><updated>2008-09-18T16:08:30.824-03:00</updated><title type='text'>OOPSLA 2008 - 50 años de Lisp</title><content type='html'>Ya escribí sobre este tema en otro post, pero ya se está formalizando. Miren este mail sino:&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial; font-size: 13px; "&gt;Lisp50@OOPSLA&lt;br /&gt;...celebrating the 50th birthday of Lisp at OOPSLA 2008&lt;br /&gt;&lt;br /&gt;Monday, October 20, 2008&lt;br /&gt;Nashville, Tennessee, USA&lt;br /&gt;co-located with OOPSLA 2008&lt;br /&gt;participation is free for all OOPSLA participants&lt;br /&gt;registration for at least one conference day at OOPSLA is required&lt;br /&gt;&lt;br /&gt;URL: http:&lt;a href="http://www.lisp50.org/" target="_blank" style="color: rgb(0, 0, 204); "&gt;www.lisp50.org&lt;/a&gt;&lt;br /&gt;Feed: &lt;a href="http://lisp50.blogspot.com/" target="_blank" style="color: rgb(0, 0, 204); "&gt;http://lisp50.blogspot.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Invited Speakers&lt;br /&gt;&lt;br /&gt;+ William Clinger, Northeastern University, USA&lt;br /&gt;+ Pascal Costanza, Vrije Universiteit Brussel, Belgium&lt;br /&gt;+ Richard Gabriel, IBM Research, USA&lt;br /&gt;+ Rich Hickey, Independent Consultant, USA&lt;br /&gt;+ Alan Kay, Viewpoints Research Institute, USA&lt;br /&gt;+ Fritz Kunze, USA&lt;br /&gt;+ Ora Lassila, Nokia Research Center, USA&lt;br /&gt;+ John McCarthy, USA&lt;br /&gt;+ Kent Pitman, PTC, USA&lt;br /&gt;+ Guy Steele, Sun Microsystems Laboratories, USA&lt;br /&gt;+ Herbert Stoyan, University of Erlangen, Germany&lt;br /&gt;+ Warren Teitelman, Google Inc., USA&lt;br /&gt;+ JonL White, USA&lt;br /&gt;&lt;br /&gt;Titles, abstracts, biographies and schedule will be announced at the&lt;br /&gt;Lisp50 webpage and blog in the coming days and weeks.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Abstract&lt;br /&gt;&lt;br /&gt;In October 1958, John McCarthy published one in a series of reports about&lt;br /&gt;his then ongoing effort for designing a new programming language that&lt;br /&gt;would be especially suited for achieving artificial intelligence. That&lt;br /&gt;report was the first one to use the name LISP for this new programming&lt;br /&gt;language. 50 years later, Lisp is still in use. This year we are&lt;br /&gt;celebrating Lisp's 50th birthday. OOPSLA 2008 is an excellent venue for&lt;br /&gt;such a celebration, because object-oriented programming benefited heavily&lt;br /&gt;from Lisp ideas and because OOPSLA 2008 takes place in October, exactly&lt;br /&gt;50 years after the name Lisp has been used publicly for the first time.&lt;br /&gt;We will have talks by John McCarthy himself, and numerous other&lt;br /&gt;influential Lispers from the past five decades. We will also take a look&lt;br /&gt;at the next 50 years of Lisp.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Organizers&lt;br /&gt;&lt;br /&gt;+ Pascal Costanza, Vrije Universiteit Brussel, Belgium&lt;br /&gt;+ Richard Gabriel, IBM Research, Hawthorne, NY, USA&lt;br /&gt;+ Robert Hirschfeld, Hasso-Plattner-Institut, Potsdam, Germany&lt;br /&gt;+ Guy Steele, Sun Microsystems Laboratories, Burlington, MA, USA&lt;br /&gt;&lt;br /&gt;Sponsored by ACM SIGPLAN&lt;br /&gt;&lt;br /&gt;Supported by&lt;br /&gt;+ IBM Research&lt;br /&gt;+ LispWorks Ltd&lt;br /&gt;+ Franz Inc.&lt;br /&gt;+ Clozure Associates&lt;/span&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/1292532279691646783-3241370425670057256?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/3241370425670057256/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=3241370425670057256' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3241370425670057256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3241370425670057256'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/09/oopsla-2008-50-aos-de-lisp.html' title='OOPSLA 2008 - 50 años de Lisp'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-2370495424246701795</id><published>2008-09-12T18:38:00.002-03:00</published><updated>2008-09-12T18:46:05.033-03:00</updated><title type='text'>Presentación de Tesis Licenciatura - Tema: Refactoring de Traits</title><content type='html'>&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial; font-size: 13px; "&gt;&lt;div&gt;Seguramente también se hayan enterado de este evento, pero de la misma manera que con la charla, me parece importante publicarlo acá. La realidad es que estoy muy contento con el avance que estoy teniendo con el grupo de tesistas de la UBA. Estamos haciendo trabajos muy interesante.... bue, en realidad ellos están trabajando mucho, yo solo puse las ideas iniciales y de vez en cuando nos reunimos, pero la verdad que estar trabajando con gente motivada, autónoma y con espíritu de investigación es muy reconfortante. Lástima que tenga tan poco tiempo para dedicarles... si le dedicase más tiempo creo que ni mi perro me reconocería!.&lt;/div&gt;&lt;div&gt;En particular,Alejandro ha hecho un trabajo excepcional con esta investigación y la ha presentado en Smalltalks 2007 cuando aún estaba trabajando en ella. Esta presentación será aún mejor, se los puedo asegurar, si tienen la oportunidad de venir no se van a arrepentir. De vuelta, es un trabajo muy interesante y Alejandro ha trabajado muy bien y con mucha fuerza. Además tendremos un jurado de lujo! Máximo Prieto y Gabriela Arévalo! ¿Qué más se puede pedir?&lt;/div&gt;&lt;div&gt;También me emociona pensar que otros grupos estarán exponiendo para fin de este año si Dios quiere, o principo del que viene, uno también sobre traits y otro sobre ambientes de enseñanza con objetos, así que estén atentos!&lt;/div&gt;&lt;div&gt;Ahora les transcribo el mail que mandé invitando a la presentación de tesis:&lt;/div&gt;&lt;div&gt;-----------------------------&lt;/div&gt;&lt;div&gt;Que tal, &lt;br /&gt;&lt;/div&gt;&lt;div&gt; el miércoles 17 de Septiembre a las 10 hrs. (aula a determinar), Alejandro Gonzalez presentará su trabajo de Tesis de Licenciatura que trata sobre el estudio e implementación de "Refactorings para Traits".&lt;/div&gt;&lt;div&gt; El mismo se basó en realizar cambios a jerarquías de clases existentes utilizando un nuevo elemento de representación de conocimiento denominado Trait (o Rasgo en castellano). Al ir realizando estos cambios se tomó nota de aquellos procesos comunes que pudiesen ser creados como Refactorings, para luego implementarlos como tal.&lt;/div&gt;&lt;div&gt; El trabajo se realizó con Squeak (una implementación open source de Smalltalk) y se amplió la funcionalidad del Refactoring Browser. El mismo se encuentra disponible para ser utilizado en SqueakSource.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; Esta es la primer presentación de un conjunto de tesis que tratan sobre la utilización de Traits en ambientes de objetos que utilizan clasificación como metodología de representación de conocimiento. El resto de los trabajos se irán presentando en los próximos meses.&lt;/div&gt;&lt;div&gt; El jurado estará compuesto por Máximo Prieto, Gabriela Arévalo &lt;br /&gt;&lt;/div&gt;&lt;div&gt; Director: Hernán Wilkinson&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; A continuación se adjunta un resumen:&lt;/div&gt;&lt;div&gt;---&lt;/div&gt;Traits es un nuevo concepto para estructurar programas orientados a objetos.&lt;br /&gt;Este concepto, permite que el comportamiento total de una clase pueda ser construido&lt;br /&gt;composicionalmente a partir de pequeños rasgos de comportamientos llamados traits.&lt;br /&gt;&lt;br /&gt;Traits complementa a la herencia simple y es por esto,&lt;br /&gt;que su inclusión conlleva la necesidad de querer refactorizar nuestros diseños,&lt;br /&gt;ya que con ellos ahora se pueden resolver cuestiones antes no resueltas, o mal resueltas, por la herencia.&lt;br /&gt;En particular, aquellas jerarquías cuestionadas por hacer un fuerte uso de la herencia&lt;br /&gt;como único mecanismo para compartir comportamiento, son las que se convierten en candidatas a ser refactorizadas con traits.&lt;br /&gt;Pero estas refactorizaciones no pueden ser realizadas eficientemente sin la asistencia de una herramienta apropiada.&lt;br /&gt;&lt;br /&gt;Muchos ambientes de desarrollo incluyen herramientas para refactorizar código.&lt;br /&gt;Éstas soportan, a menudo, refactorings típicos que pueden realizarse en forma semi-automática,&lt;br /&gt;como por ejemplo Push up method y Rename method.&lt;br /&gt;El problema es que, éstas operan sobre conceptos conocidos del paradigma:&lt;br /&gt;jerarquía de clases, métodos, variables de instancia, etc.&lt;br /&gt;Actualmente, ninguna brinda soporte para la refactorización con este nuevo concepto, traits.&lt;br /&gt;&lt;br /&gt;En este trabajo se investigan, tanto desde un punto de vista conceptual como implementativo, nuevos refactorings para traits.&lt;br /&gt;El resultado es un nuevo conjunto de operaciones de refactorings que,&lt;br /&gt;inicialmente surgieron de ideas básicas y operaciones típicas al programar con traits,&lt;br /&gt;pero que luego fueron refinándose a medida que las comenzamos a utilizar para realizar diferentes refactorizaciones.&lt;br /&gt;&lt;br /&gt;Estos nuevos refactorings se implementaron en Squeak, un dialecto open-source de Smalltalk,&lt;br /&gt;dado que éste es el único ambiente que incluye una implementación sólida de ambos,&lt;br /&gt;el nuevo concepto de traits y una herramienta de refactorings conocida como refactoring browser.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-2370495424246701795?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/2370495424246701795/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=2370495424246701795' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2370495424246701795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2370495424246701795'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/09/presentacin-de-tesis-licenciatura-tema.html' title='Presentación de Tesis Licenciatura - Tema: Refactoring de Traits'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-4998786483766835604</id><published>2008-09-12T17:57:00.000-03:00</published><updated>2008-09-12T18:38:14.956-03:00</updated><title type='text'>Charla sobre Smalltalk/X y Model Base Testing</title><content type='html'>&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial; font-size: 13px; "&gt;&lt;div&gt;Seguramente ya se entereron de esta charla por las listas de mails de Smalltalk, la facultad, etc. Sin embargo me parecía útil comunicarla acá también. Les transcribo el mail que envié sobre la misma:&lt;/div&gt;&lt;div&gt;--------&lt;/div&gt;&lt;div&gt;Que tal,&lt;br /&gt;&lt;/div&gt;&lt;div&gt; el comité organizador de "Smalltalks 2008" tiene el agrado de anunciar la charla que dará Claus Gittinger, co-fundador de eXept Software AG y creador de Smalltalk/X el viernes 19 de Septiembre, a las 19 hrs. en Ciudad Universitaria (los detalle del aula serán dados más adelante).&lt;/div&gt;&lt;div&gt; La misma será una exposición técnica sobre la implementación de Smalltalk/X en primera instancia, para luego incursionar en el tema de "Model Base Testing" en donde mostrará un ejemplo real de uso utilizando la herramienta denominada "Expecco", la cual fue desarrollada por eXept justamente con Smalltalk/X&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; Para más información sobre eXept y Smalltalk/X pueden visitar: &lt;a href="http://www.exept.de/en/home" target="_blank" style="color: rgb(0, 0, 204); "&gt;http://www.exept.de/&lt;wbr&gt;en/home&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; Para más información sobre "Model Base Testing" y Expecco, pueden visitar: &lt;a href="http://www.exept.de/en/products/expecco" target="_blank" style="color: rgb(0, 0, 204); "&gt;http://www.exept.de/&lt;wbr&gt;en/products/expecco&lt;/a&gt;&lt;/div&gt;&lt;div&gt; Para más información sobre "Smalltalks 2008" pueden visitar: &lt;a href="http://neuquina.lifia.info.unlp.edu.ar:8001/Smalltalks-2008" target="_blank" style="color: rgb(0, 0, 204); "&gt;http://neuquina.&lt;wbr&gt;lifia.info.unlp.edu.ar:8001/&lt;wbr&gt;Smalltalks-2008&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; A continuación se detalla el profile de Claus Gittinger:&lt;/div&gt;&lt;div&gt; Claus Gittinger has a 22-year background as a software architect for object oriented software. He is&lt;/div&gt;&lt;div&gt;the creator of the Smalltalk/X programming system.&lt;/div&gt;&lt;div&gt; As a co-founder of eXept Software AG he was defining and supervising development and testing&lt;/div&gt;&lt;div&gt;processes with various customers in telecommunication-, factory automization and automotive&lt;/div&gt;&lt;div&gt;projects.&lt;/div&gt;&lt;div&gt; He is responsible for strategic product planning and the further development of the eXept's expecco&lt;/div&gt;&lt;div&gt;quality management and test automation tool.&lt;/div&gt;&lt;div&gt; He is part-time teaching computer science at the Hochschule der Medien in Stuttgart.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; Los esperamos!&lt;/div&gt;&lt;div&gt; Saludos,&lt;/div&gt;&lt;div&gt; Hernán Wilkinson.&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-4998786483766835604?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/4998786483766835604/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=4998786483766835604' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4998786483766835604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4998786483766835604'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/09/charla-sobre-smalltalkx-y-model-base.html' title='Charla sobre Smalltalk/X y Model Base Testing'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-8750757482117204015</id><published>2008-09-10T18:33:00.002-03:00</published><updated>2008-09-10T18:37:46.212-03:00</updated><title type='text'>Clojure - On state and Identity</title><content type='html'>Este &lt;a href="http://clojure.org/state"&gt;paper &lt;/a&gt;sobre el lenguaje &lt;a href="http://clojure.org"&gt;Clojure &lt;/a&gt;me pareció muy interesante. Está muy clara la problemática de los lenguajes actuales (tanto procedurales como funcionales como de objetos) y provee una solución implementativa muy interesante. &lt;div&gt;Lo que me parece más intersante de la solución que propone es que es fácilmente ampliable para mantener la historia de los objetos y así no tener más la limitación de que los sistemas reflejen sólo un snapshot de la realidad. &lt;/div&gt;&lt;div&gt;Hacer que un lenguaje de objetos soporte la historia de los mismos es un lindo tema de tesis que tengo pendiente. Imaginensé si a ese lenguaje le agregamos persistencia automática en una base relacional (puesto que la gente aún se asusta de las bases de objetos), ¿no tendríamos el COBOL del siglo XXI? :-)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-8750757482117204015?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/8750757482117204015/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=8750757482117204015' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8750757482117204015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8750757482117204015'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/09/clojure-on-state-and-identity.html' title='Clojure - On state and Identity'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-967524644311274490</id><published>2008-09-10T18:25:00.002-03:00</published><updated>2008-09-10T18:32:53.145-03:00</updated><title type='text'>V8 - La Virtual Machine de JavaScript de Google</title><content type='html'>Como todos deben estar al tanto, Google sacó un nuevo Browser llamado Chrone que incluye la VM de JavaScript más rápida hasta ahora (&lt;a href="http://code.google.com/p/v8/"&gt;http://code.google.com/p/v8/&lt;/a&gt;)&lt;div&gt;Lo interesante de esta VM es que fue hecha por gente que trabajó en la VM de &lt;a href="http://research.sun.com/self/"&gt;Self &lt;/a&gt;y de &lt;a href="http://www.strongtalk.org/"&gt;Strongtalk&lt;/a&gt;, ambas VMs famosas por sus aportes a la materia en cuestión. &lt;/div&gt;&lt;div&gt;En particular Self aportó mucho sobre como mejorar la performance en el algoritmo de method lookup, implementando algo que se llama PIC (polimorphic inline cache), utilizado actualmente en la VM de VisualWorks por ejemplo. V8 utiliza una versión simplificada de PIC que es IC (inline cache únicamente). La técnica de PIC también fue utlizada por Strontalk, la VM de Smalltalk más rápida hasta ahora (aunque no realiza garbage collection...).&lt;/div&gt;&lt;div&gt;En fin, me parece que desde el punto de vista técnico es muy interesante leer sobre como funciona esta VM, ver cómo está implementada puesto que el código es open source, etc. Y desde el punto de vista de marketing, es muy bueno tener uno de los grander players apostando en un lenguaje dinámico, lástima que sea JavaScript. Sin embargo lo bueno es que en la página de V8 se hace referencia a Self y Smalltalk, lo cual no es poco.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-967524644311274490?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/967524644311274490/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=967524644311274490' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/967524644311274490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/967524644311274490'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/09/v8-la-virtual-machine-de-javascript-de.html' title='V8 - La Virtual Machine de JavaScript de Google'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-2923131278092316156</id><published>2008-08-26T16:03:00.001-03:00</published><updated>2008-08-26T16:04:32.476-03:00</updated><title type='text'>Smalltalk está muerto! Larga vida a Smalltalk! Bienvenido Smalltalks 2008</title><content type='html'>Transcribo a continuación un artículo que salió publicado en el Journal del Lifia acerca de Smalltalks, espero que lo disfruten!&lt;br /&gt;-------&lt;br /&gt;A mediados de Septiembre de 2007, a cuatro locos se nos ocurrió organizar un congreso de un lenguaje de programación al que la mayoría de la gente lo da por muerto o cree que sólo sirve para enseñar: Smalltalk. ¿A quién se le ocurre utilizar ese lenguaje hoy en día? ¿Hay gente en el mundo o más aún, en Argentina que lo utilice?&lt;br /&gt;Aquellos que conocen Smalltalk y las comunidad que existe alrededor de él, sabrán que sí, que hay gente en el mundo y más aún, en Argentina que usa este lenguaje. Pero además saben que aquellos que formamos parte de esta comunidad tenemos características especiales que compartimos con muchas comunidades de otros lenguajes de programación: amor por desarrollar software de calidad y pasión por el lenguaje que utilizamos, en este caso un lenguaje de programación que tiene ya casi treinta años.&lt;br /&gt;Es por eso que cuando se nos ocurrió hacer este evento (ver http://www.dc.uba.ar/smalltalks2007) nuestras expectativas de convocatoria rondaban las 40, 50 personas como mucho. No pretendíamos hacer una conferencia de más de un día y tampoco pensábamos desplegar una logística complicada. Por ejemplo, los anotados debían enviar un mail a una casilla de correo creado para tal fin, la conferencia no tendría costo, etc. El congreso se realizaría en un aula común de la Facultad de Ciencias Exactas y Naturales de la UBA, a principio de Diciembre; y como se decidió hacerlo muy sobre la fecha, no había mucho tiempo para esperar grandes presentaciones, por lo que el único requisito que se pedía era un abstract de no más de una carilla.&lt;br /&gt;Luego de enviar el mail de convocatoria empezamos a recibir inscripciones a un ritmo inesperado. Imaginamos al principio que el ritmo decaería con el acercamiento de la fecha del congreso, pero sucedió todo lo contrario. Cuando superamos los 40 inscriptos tuvimos que empezar a buscar un aula más grande pero al mes superamos los 100! y luego los 150, y luego los 200! A esa altura sólo quedaba como opción utilizar el Aula Magna del Pabellón I, la cual puede albergar cerca de 450 persona. Teníamos miedo. ¿Qué pasaría si de todos estos inscriptos solo venía la mitad o menos? El congreso era gratis, por lo tanto esto podría suceder. No sería agradable ver el aula Magna con 100 personas, sería verla vacía. Pero nos arriesgamos y decidimos utilizarla, decisión que nos alegra haber tomado porque la cantidad de inscriptos llegó a ser 300!, un número impensable para una congreso técnico en Argentina y menos todavía para un lenguaje que se suponía muerto o en el mejor de los casos fuera de moda!&lt;br /&gt;Pero la sorpresa no terminó en la cantidad de gente anotada, siguió con la cantidad de trabajos presentados. Esperábamos recibir propuestas para presentar 6 u 8 trabajos, pero recibimos 30! Indudablemente un día no alcanzaba para presentar todo. Ni siquiera dos días alcanzaban sin que hubiese superposición de presentaciones. Además de las presentaciones argentinas, GemStone ofreció gracias a la publicidad y gran convocatoria que tuvo el congreso, realizar un Workshop sobre GLASS (http://seaside.gemstone.com), un ambiente de desarrollo web que utiliza Seaside (http://www.seaside.st) como framework web y GemStone (http://www.gemstone.com) como mecanismo de persistencia. &lt;br /&gt;Finalmente el cronograma del congreso pasó de ser de un día con sólo 6 u 8 presentaciones nacionales a tres días, con 30 presentaciones, un workshop de un día entero y gente del exterior participando y presentando. ¡¡Totalmente inesperado!! Este evento superó todas nuestras expectativas, consumió todo nuestro tiempo libre (y no libre :-) ), nos volvió locos, "pero ¡la pucha que vale la pena estar vivo!" y este evento nos dio vida a todos, eso lo puedo asegurar.&lt;br /&gt;Y las sorpresas no terminaron en la "cantidad" sino que también tuvimos sorpresas relacionado a la "calidad", característica que se notó en las presentaciones realizadas. Hubo presentaciones de una calidad técnica inesperada, con una claridad de conceptos e ideas que nos sorprendieron. Esto terminó de mostrarnos lo fuerte e importante que es la comunidad Smalltalk en Argentina. Un ejemplo demostrativo de esta importancia es la participación en los premios que ESUG otorga a los sistemas realizados en Smalltalk, que este año de 22 candidatos 6 son trabajos argentinos, el 25% (y me consta que hay aún más trabajos argentinos que se podrían presentar).&lt;br /&gt;Las presentaciones realizadas abarcaron un espectro de temas muy completo. Las empresas locales presentaron sus sistemas y varias herramientas que usan para poder trabajar mejor, los grupos de investigación nos desasnaron sobre temas actuales y novedosos y hubo también exposiciones de los distintos grupos de enseñanza de objetos de diversas universidades.&lt;br /&gt;En el congreso participó gente que vino de Luján, Mar del Plata, Concepción de Uruguay, Córdoba, Rosario, Rafaela, Resistencia, Formosa y varios lugares más del país. De los inscriptos, el 56% provino de la industria del software y el 44% restante de universidades (un balance muy interesante). De las universidades la que llevó más gente fue la UTN con el 36% (una gran sorpresa para todos nosotros), seguida por la Universidad de la Plata con un 31% y luego la UBA con un 21%. ¡Hasta hubo gente que catalogó el evento como "la conferencia de Smalltalk más importante de los últimos años"! (&lt;a id="m6mu" href="http://doesnotunderstand.free.fr/?p=459" target="_blank"&gt;http://doesnotunderstand.free&lt;wbr id="m6mu0"&gt;.fr/?p=459&lt;/a&gt;)&lt;br /&gt;Trabajamos muchísimo para realizar esta conferencia y no lo habríamos logrado sin la ayuda desinteresada de varias empresas argentinas (Mercap SRL, InfoOil, Snoop, etc.) e internacionales (CaesarSystems, Cincom, Instantiations, GemStone, etc.), así como otras organizaciones como ESUG, LIFIA, STIC y la UBA, que por medio del Departamento de Computación de la Facultad de Ciencias Exactas, nos dió todo el soporte e infraestructura necesaria para que este evento fuera posible. Gracias a ellos pudimos cubrir cosas como el café y las medias lunas, las tazas y remeras referentes al evento, los cronogramas, DVDs y libros sorteados, así como un descuento del 50% a todos los participantes del congreso para asistir a Smalltalk Solutions 2008 en Reno, Estados Unidos (&lt;a id="vyea1" href="http://www.stic.st/stic?content=sts2008" target="_blank"&gt;http://www.stic.st/stic&lt;wbr id="vyea2"&gt;?content=sts2008&lt;/a&gt;).&lt;br /&gt;Un hecho interesante del evento fueron los videos que recolectamos de personalidades representativas de la comunidad Smalltalk de distintos lugares del mundo, como aquel de ViewPoint Reasearch Institute (liderado por Alan Kay) o de Dan Ingalls quien declaró sus ganas de venir este año a tomar unas cervezas con nosotros (¿quién dice no?).&lt;br /&gt;En conclusión, fueron todas sorpresas y alegrías muy gratas. Valió la pena invertir el tiempo que se dedicó a este evento y los participantes han quedado más que satisfechos, pidiéndonos repetirlo para este año, lo cual estamos haciendo.&lt;br /&gt;Por supuesto que no va a ser fácil igualar o superar el evento del año pasado. No sabemos si se generará más, menos o igual expectativa, no sabemos si vendrá más o menos gente, pero de algo sí estamos seguros: será un congreso excepcional por varios motivos. Uno de ellos es que como nos propusimos, será realizado en otra universidad, la UAI, quienes con la ayuda de Gonzalo Zabala nos abrieron sus puertas para este evento. Nuestra idea es hacer el congreso en una universidad distinta cada año. También estamos trabajando para que el track de investigación y educación tenga más importancia y podamos imprimir los trabajos presentados. Es nuestro objetivo a corto plazo publicar los trabajos en revistas de investigación de reconocimiento mundial, pero no es sencillo coordinarlo. Se está organizando un "coding contest" muy interesante y al cual están todos invitados. El evento será no sólo para gente de la comunidad Smalltalk sino también para todos aquellos programadores que "amen" su trabajo. Traeremos también personalidades bien conocidas de la comunidad Smalltalk internacional para que nos ofrezcan todo su conocimiento. Por lo tanto, no se olviden de agendar estas fechas: 13, 14 y 15 de Noviembre, y si tienen ganas de participar, tanto realizando una presentación como asistiendo a éstas, no dejen de visitar nuestro sitio para anotarse: http://neuquina.lifia.info.unlp.edu.ar:8001/Smalltalks-2008&lt;br /&gt;Los que usamos Smalltalk somos muy pasionales, no hay porque ocultarlo. Esta actitud tiene su lado positivo pero también su lado negativo, puesto que al ser mal utilizada genera rechazo por parte de otros grupos, algo que ha sucedido en algunos casos. Luego de varios años de maduración y de varías "caídas", el grupo de gente que utiliza Smalltalk ha aprendido a sobrellevar su fanatismo de una manera más "social", menos pedante y más amistosa y estos eventos son el resultado de estos cambios. Es por eso que el evento está abierto a todas aquellas personas a las que les guste desarrollar software cada vez mejor y comparta esa pasión por hacerlo correctamente y con calidad.&lt;br /&gt;Espero haberles transmitido en esta nota las energías, el empuje, el entusiasmo que tuvimos y tenemos para la organización de estos congresos. Tenemos muchas ganas y mucha pasión por hacer algo interesante, educativo, atractivo, con libertad y con calidad. No un congreso más, no un congreso dirigido por temas de modas, no un congreso donde nos digan como tenemos que trabajar, sino un congreso donde podamos compartir cómo nos gusta trabajar y podamos demostrar que es posible hacerlo como queremos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-2923131278092316156?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/2923131278092316156/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=2923131278092316156' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2923131278092316156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2923131278092316156'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/08/smalltalk-est-muerto-larga-vida.html' title='Smalltalk está muerto! Larga vida a Smalltalk! Bienvenido Smalltalks 2008'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-4077762377696059123</id><published>2008-08-15T18:01:00.002-03:00</published><updated>2008-08-15T18:12:09.565-03:00</updated><title type='text'>Natural Language Programming</title><content type='html'>A partir de un artículo en la última &lt;a href="https://www.myacm.org/login.cfm?code=%276%3A%3B%29Q%2CC%271%40%20%20%0A&amp;amp;ui=cacmde&amp;amp;subsvc=1378704"&gt;Communications de la ACM&lt;/a&gt;, escrito por Mark Guzdiel llegué a unos papers muy interesantes sobre lo que se denomina "Natural Language Programming" o "Natural Programming". La idea es tener lenguajes de programación que estén hechos para los seres humanos y no para las computadoras.&lt;br /&gt;Una de las observaciones que hacen es que los lenguajes de programación actuales están hechos para ser entendidos por computadoras y que por eso son tan detallados los programas y es tan difícil programar. Lo que proponen es hacer que los lenguajes de programación se asemejen más al lenguaje natural y que se pueda de esa manera entender mejor los programas que se escriben.&lt;br /&gt;Más allá de las limitaciones y dificultades que esto tiene, la idea me parece muy interesante porque cambia completamente el ángulo de importancia. Va de acorde con lo vengo diciendo hace rato y que fue motivo de la charla de la ECI y es lograr que "la computadora haga más y el programador menos".&lt;br /&gt;Una sorpresa que me llevé, que ya a esta altura está empezando a dejar de ser sorpresa, es que es un tema de investigación "antiguo", de hecho los papers fundadores de este movimiento son del '70! La verdad que cada vez más me doy cuenta que hay que ir a buscar en nuestra historia para descubrir los buenos trabajos (será que me estoy volviendo viejo? :-) )&lt;br /&gt;En fin, les paso algunos nombres porque se los pueden bajar de internet sin problema:&lt;br /&gt;* Natural Language programming: Styles, strategies, and contrasts, L.A. Miller (1970)&lt;br /&gt;* Studying the Language ad Structure in Non-Programmers' solutions to programming problems, J. F. Pane et. al&lt;br /&gt;* The influence of the Psychology Of programming on a Language Design: Project Status Report, J.F. Pane et. al.&lt;br /&gt;&lt;br /&gt;Espero los disfruten!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-4077762377696059123?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/4077762377696059123/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=4077762377696059123' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4077762377696059123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4077762377696059123'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/08/natural-language-programming.html' title='Natural Language Programming'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1444289058581792166</id><published>2008-08-14T09:27:00.002-03:00</published><updated>2008-08-14T09:30:12.811-03:00</updated><title type='text'>Smalltalks 2008 - Registración y CFP</title><content type='html'>Ya está habilitado en el sitio web de &lt;a href="http://neuquina.lifia.info.unlp.edu.ar:8001/Smalltalks-2008"&gt;Smalltalks 2008&lt;/a&gt; la opción para registrarse al evento y la de sumitir papers de investigación (dentro de poco estará la opción de presentaciones de industria y workshops).&lt;br /&gt;¡No dejen de anotarse! ¡Este año tenemos que romper el record del año pasado!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-1444289058581792166?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1444289058581792166/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1444289058581792166' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1444289058581792166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1444289058581792166'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/08/smalltalks-2008-registracin-y-cfp.html' title='Smalltalks 2008 - Registración y CFP'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-6379611597838763827</id><published>2008-08-08T10:10:00.003-03:00</published><updated>2008-08-08T10:30:32.671-03:00</updated><title type='text'>Los IFs no ofrecen información Meta</title><content type='html'>Hay un comentario de Gabriel (gaboto) en el post de la conferencia de la ECI donde me pide aclarar un comentario que hice en la presentación relacionado a los IFs. El comentario tenía que ver con el hecho de que los IFs no tienen información "meta". Lo voy a tratar de explicar con el ejemplo de la presentación.&lt;br /&gt;En dicho ejemplo, una de los cambios de diseño que mostré fue reemplazar una serie de IFs por objetos que se encargan de "tipificar" un objeto. Al haberlo hecho hay mucha información que se está poniendo en el código que antes no estaba. Ahora para tipificar un objeto no se utiliza una construcción tan genérica como el IF sino una más concreta que se encarga justamente de "tipificar" objetos. En pocas palabras, a partir de ese momento cuando un programador lee el código se dará cuenta que se está tipificando un objeto simplemente por ver qué objeto (clase en este caso) se está usando.&lt;br /&gt;Algo similar sucede con los patrones; cuando se ve un "state" se entiende para qué está, su función, etc. Si en vez de un "state" hubiese un conjunto de IFs o CASEs, habría que leer lo que está escrito, interpretarlo, etc. para llegar a la conclusión de que se está programando un "state" (a menos que exista un comentario que diga eso, pero así y todo, no se puede deducir información automáticamente de un comentario, solo lo puede interpretar un ser humano).&lt;br /&gt;Un IFs, lo único que indica es que se está tomando una decisión, pero no da indicios sobre qué decisión, por qué, etc., para obtener esa información alguien tiene que "interpretar" el IFs, y solo los seres humanos lo pueden hacer (al menos por ahora... :-) ) De la otra manera no solo le resulta directa la interpretación al ser humano sino que también se puede utilizar esa información de manera automática. Por ejemplo, si se quiere ver todas aquellas clases cuyas instancias son tipificadas, se busca las referencias a la clase que implementa esa responsabilidad y listo. Si se quisiese hacer estadísticas sobre la cantidad de tipos que existen, se puede a partir de estas referencias ver la jerarquía de tipos sobre las que trabajan y obtener todas las subclases de la clase raíz de cada jerarquía y obtendríamos dicha información, etc.&lt;br /&gt;En pocos palabra, no es que el IFs no indique nada sobre lo que se está haciendo, sino que al ser tan genérico se pierde información, información que luego debe ser reconstruida por el programador cada vez que lo lee. De la otra manera, al utilizar un objeto más específico existe información que puede ser interpretada más fácilmente y de manera automática. A esto me refiero con información "meta". Estos objetos que reemplazan al IFs no solo hacen lo que tienen que hacer sino que ofrecen información "más allá de lo que hacen", información sobre el código en el cual están siendo utilizados, o sea, meta-información sobre el programa.&lt;br /&gt;Bueno, espero haber logrado explicar mi idea. Cualquier duda chiflen!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-6379611597838763827?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/6379611597838763827/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=6379611597838763827' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6379611597838763827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6379611597838763827'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/08/los-ifs-no-ofrecen-informacin-meta.html' title='Los IFs no ofrecen información Meta'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-6944698039340974991</id><published>2008-08-05T11:36:00.003-03:00</published><updated>2008-08-05T12:08:24.272-03:00</updated><title type='text'>La Imagen de Smalltalk</title><content type='html'>Muchas veces se discute si es bueno que Smalltalk tenga un imagen, es más, recientemente hubo una discusión al respecto en la lista de Squeak-Dev.&lt;br /&gt;El problema que se le achaca a la imagen es que es difícil de "integrar" con el resto del ambiente. La verdad que si hay algo que no me gustaría perder de Smalltalk es el concepto de imagen y es más, me parece que es una característica que todo lenguaje tendrá que incluir en su evolución.&lt;br /&gt;De la misma manera que hace 10 años la gente discutía sobre si era bueno tener un VM o Garbage Collection hasta que salió Java y empezó a verse sus ventajas, me parece que lo mismo pasará con la imagen. Seguramente salga en algunos años algún lenguaje que tenga una imagen y como será un lenguaje nuevo todos usarán porque estará "copado" y de ahí en más no se discutirá sobre la conveniencia o no de tener una imagen.&lt;br /&gt;De hecho, la "imagen" existe en los ambientes de desarrollo actuales pero en una forma más cavernícola. En Eclipse por ejemplo, la "imagen" está compuesta por todos los archivos .java, las configuraciones, etc. Lo que sucede que esa "imagen" no está compuesta por objetos sino por elementos más antiguos como archivos, texto, etc. y que hacen por lo tanto que el ambiente sea más arcaico y menos manipulable.&lt;br /&gt;Para mí la imagen "siempre existió", pero con otras características y con menos capacidades como aún vemos en varios ambientes de desarrollo. Es por eso que creo que la evolución inevitable de todo "lenguaje" debe ir hacia una "imagen" más estilo Smalltalk.&lt;br /&gt;En conclusión, me parece que antes de que la imagen desaparezca, la imagen aparecerá con más fuerza en algunos años.... veremos si me equivoco.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-6944698039340974991?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/6944698039340974991/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=6944698039340974991' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6944698039340974991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/6944698039340974991'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/08/la-imagen-de-smalltalk.html' title='La Imagen de Smalltalk'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-8495597996650361808</id><published>2008-08-05T11:23:00.002-03:00</published><updated>2008-08-05T11:36:01.574-03:00</updated><title type='text'>Visitors en la presentación de la ECI</title><content type='html'>Hay varios que me preguntaron sobre el test de los visitors que mostré en la presentación de la ECI. En otro post de este blog ya había hablado del tema, el link es: &lt;a href="http://objectmodels.blogspot.com/2007/10/cmo-asegurar-la-evolucin-de-un-sistema.html"&gt;http://objectmodels.blogspot.com/2007/10/cmo-asegurar-la-evolucin-de-un-sistema.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En si, el código del test es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;testVisitorsImplementVisitorProtocol&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    | acceptingVisitorsRoots visitorProtocols visitorImplementors invalidVisitorImplementors |&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    acceptingVisitorsRoots := MCPAcceptingVisitorRootFinder allAcceptingVisitorRoots.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    visitorProtocols := acceptingVisitorsRoots collect: [ :anAcceptingVisitorRoot | &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        MCPVisitorProtocol for: anAcceptingVisitorRoot ].&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    visitorImplementors := visitorProtocols &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        inject: OrderedCollection new&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        into: [ :implementors :aVisitorProtocol |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;            implementors addAll: aVisitorProtocol implementors; yourself ].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    invalidVisitorImplementors := visitorImplementors reject: [ :aVisitorImplementor | &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        aVisitorImplementor isValid ].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    self assert: invalidVisitorImplementors isEmpty&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Instancias de &lt;span style="font-style: italic;"&gt;MCPAcceptingVisitorRootFinder &lt;/span&gt;se encargan de buscar la raíz de una jerarquía de clases que acepta visitors. Para ello busca las clases que implementan &lt;span style="font-style: italic;"&gt;#accept:&lt;/span&gt; y dada un jerarquía devuelve la clase que más arriba se encuentre en la misma.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;MCPVisitorProtocol &lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;modela el protocolo que debe implementar un visitor. Lo deduce a partir de todos los mensajes que se envían en el método &lt;span style="font-style: italic;"&gt;#accept:&lt;/span&gt; de una jerarquía de clases. Dado un VisitorProtocol se puede obtener todas las clases que lo implementan. Las implementaciones de un protocolo de visitor está modelado con la clase &lt;span style="font-style: italic;"&gt;MCPVisitorImplementor &lt;/span&gt;que entre otras responsabilidades sabe responder si es una implementación válida de ese visitor.&lt;br /&gt;Bueno, si desean más detalles de la implementación pregunten!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-8495597996650361808?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/8495597996650361808/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=8495597996650361808' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8495597996650361808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/8495597996650361808'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/08/visitors-en-la-presentacin-de-la-eci.html' title='Visitors en la presentación de la ECI'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1270074006965249352</id><published>2008-08-04T16:50:00.002-03:00</published><updated>2008-08-04T16:53:59.471-03:00</updated><title type='text'>Presentación de ECI 2008</title><content type='html'>El viernes di la presentación de técnicas y herramientas que usamos en Mercap en el marco de la ECI. Creo que salió muy bien, por lo menos me fui contento. Lástima no haber tenido más tiempo y haber cometido un par de equivocaciones con la imagen que había que usar (por estar apurado levanté otra imagen...)&lt;br /&gt;Para aquellos que estén interesados, la presentación está disponible acá: &lt;a href="http://www.mercapsoftware.com/ECI2008.pdf"&gt;http://www.mercapsoftware.com/ECI2008.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-1270074006965249352?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1270074006965249352/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1270074006965249352' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1270074006965249352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1270074006965249352'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/08/presentacin-de-eci-2008.html' title='Presentación de ECI 2008'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1529783832942652565</id><published>2008-07-18T16:26:00.002-03:00</published><updated>2008-07-18T17:10:11.718-03:00</updated><title type='text'>The Story of the Ribbon - La UI de Office 2007</title><content type='html'>Pocas veces vi presentaciones interesantes de gente de Microsoft, pero tengo que decir que esta vale mil veces verla... no se la pierdan, es sobre el UI de Office 2007. El link es &lt;a href="http://blogs.msdn.com/jensenh/archive/2008/03/12/the-story-of-the-ribbon.aspx"&gt;http://blogs.msdn.com/jensenh/archive/2008/03/12/the-story-of-the-ribbon.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-1529783832942652565?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1529783832942652565/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1529783832942652565' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1529783832942652565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1529783832942652565'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/07/story-of-ribbon-la-ui-de-office-2007.html' title='The Story of the Ribbon - La UI de Office 2007'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-2457829376130559189</id><published>2008-07-08T16:10:00.001-03:00</published><updated>2008-07-08T16:10:39.895-03:00</updated><title type='text'>Lisp cumple 50 años!</title><content type='html'>y como me gustaría estar en esta conferencia: http://www.franz.com/services/conferences_seminars/lisp_50th-birthday.lhtml&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-2457829376130559189?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/2457829376130559189/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=2457829376130559189' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2457829376130559189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2457829376130559189'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/07/lisp-cumple-50-aos.html' title='Lisp cumple 50 años!'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-3782130267820493988</id><published>2008-07-08T14:49:00.002-03:00</published><updated>2008-07-08T16:00:57.269-03:00</updated><title type='text'>Alan Kay sobre la enseñanza de computación</title><content type='html'>Un amigo me pasó este link muy interesante al blog de Mark Guzdial,  &lt;a href="http://www.amazon.com/gp/blog/post/PLNKVUNBWIDAS9YQ" target="_blank"&gt;http://www.amazon.com/gp/blog&lt;wbr&gt;/post/PLNKVUNBWIDAS9YQ&lt;/a&gt;&lt;br /&gt;donde critica un nuevo plan de estudios de Ciencias de la Computación e Ingeniería de Software que propone la ACM. Lo interesante de este blog es que Alan Kay opinó sobre esto y la verdad que no tiene desperdicio todo lo que dice. El blog es largo así que si no tienen tiempo les aconsejo solo leer lo que dice Alan Kay.&lt;br /&gt;Alan hace hincapié nuevamente en la importancia de utilizar el método científico para desarrollarnos como personas y sociedades. También refuerza mucho la necesidad de conocer lo que hicieron en el pasado las personas que trabajan en esta profesión porque sino estamos no reinventando la rueda sino "una rueda pinchada". Comenta que en otras disciplinas como física no pueden darse el lujo de no saber que pensó Newton o Einstein, sin embargo en computación hay gente que no conoce que hizo Engelbart. (A mi me pasa cuando doy clases que los alumnos no conoces a Turing, ni que hablar de Church). Esto hace que estemos en una continua infancia, que nunca crezcamos y seamos adultos. Además comenta que se perdió el espíritu de investigación que existía con ARPA/PARC donde se buscaban nuevas soluciones constantemente, ahora todo está más orientado al "resultado inmediato".&lt;br /&gt;También Mark y Alan hablan de un curso especial que está dando Alan Kay el cual desconozco pero voy a buscar información porque parece interesante.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-3782130267820493988?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/3782130267820493988/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=3782130267820493988' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3782130267820493988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3782130267820493988'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/07/alan-kay-sobre-la-enseanza-de.html' title='Alan Kay sobre la enseñanza de computación'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-7640408224912845028</id><published>2008-07-07T14:00:00.003-03:00</published><updated>2008-07-07T14:03:07.850-03:00</updated><title type='text'>Charla en la ECI 2008</title><content type='html'>Este año voy a dar una charla en la ECI (Escuela de Ciencias Informáticas) que organiza el Departamento de Computación de la Facultad de Ciencias Exactas. La descripción de la charla la pueden ver en http://www.dc.uba.ar/events/eci/2008/conferencias/mercap&lt;br /&gt;La misma será una charla técnica en la cual mostraremos las herramientas y técnicas que usamos en Mercap para hacerle la vida más fácil y animada al programador.&lt;br /&gt;Espero verlos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-7640408224912845028?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/7640408224912845028/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=7640408224912845028' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7640408224912845028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7640408224912845028'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/07/charla-en-la-eci-2008.html' title='Charla en la ECI 2008'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-7420034285241352674</id><published>2008-06-30T18:27:00.001-03:00</published><updated>2008-06-30T18:29:12.234-03:00</updated><title type='text'>MagLev o Ruby corriendo en GemStone</title><content type='html'>La gente de GemStone está encontrando la manera de empezar a hacer más conocido su producto.&lt;br /&gt;Miren esta demo de Avi Bryant sobre MagLev, una implementación de Ruby corriendo en la infraestructura de GemStone.&lt;br /&gt;http://www.vimeo.com/1147409&lt;br /&gt;La verdad que es muy buena y está muy bien dada, creo que dieron en la tecla en la presentación&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-7420034285241352674?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/7420034285241352674/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=7420034285241352674' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7420034285241352674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/7420034285241352674'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/06/maglev-o-ruby-corriendo-en-gemstone.html' title='MagLev o Ruby corriendo en GemStone'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-4000132830675626716</id><published>2008-06-30T15:57:00.002-03:00</published><updated>2008-06-30T16:05:16.317-03:00</updated><title type='text'>Más sobre TDD</title><content type='html'>Siempre me costó encontrar un buen ejemplo para enseñar TDD, pero creo que finalmente he encontrado un problema interesante para resolver mientras se enseña esta técnica.&lt;br /&gt;El problema consiste en modelar un árbol genealógico. Es muy interesante porque se puede empezar por resolver el problema de obtener los padres de una persona y luego los abuelos  y luego los tatarabuelos. Haciendo esto se encuentra una recursión que puede ser modelada primero con mensajes y luego con objetos, todo utilizando refactorings!.&lt;br /&gt;Luego se puede continuar con encontrar hermanos, primos, tíos, etc. para luego cuando está todo reificado crear composiciones de búsqueda... un lindo ejercicio, este sábado lo utilice en el postgrado de la UCA con un buen resultado (según me parece).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-4000132830675626716?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/4000132830675626716/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=4000132830675626716' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4000132830675626716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4000132830675626716'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/06/ms-sobre-tdd.html' title='Más sobre TDD'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-4324171037193389763</id><published>2008-06-14T12:47:00.000-03:00</published><updated>2008-06-14T12:45:17.602-03:00</updated><title type='text'>Como hacer TDD</title><content type='html'>Hace un par de semanas cuando estaba revisando como iban los trabajos prácticos de POO, vi una confusión sobre lo que significa hacer TDD. Muchos grupos habían escritos varios test pero no habían corrido dichos tests. O sea, seguían trabajando de manera clásica C o Java, donde se escribe todo primero y luego se prueba, en vez de trabajar de manera dinámica, a la Smalltalk, donde se escribe y prueba constantemente.&lt;br /&gt;Es interesante ver que cambiar este hábito es uno de los puntos más costosos e interesantes de este curso. Que los alumnos entiendan que la computadora está para "usarla" y no simplemente para escribir texto es muy difícil de lograrlo y es de esas cosas que hasta que no lo hacen no lo entienden.&lt;br /&gt;En fin, hago este comentario para que todos aquellos que hacen TDD, no se olviden que los pasos son:&lt;br /&gt;1) Escribir UN test&lt;br /&gt;2) Hacer que el test funcione&lt;br /&gt;3) Hacer que todos los test corran&lt;br /&gt;4) Hay que mejorar el diseño?&lt;br /&gt;    a) Si hay que mejorarlo, hacerlo, refactorizar, etc. Ir a 3.&lt;br /&gt;    b) Si el diseño es aceptable, ir a 1&lt;br /&gt;&lt;br /&gt;En estos pasos creo que está claro que luego de escribir UN test hay que hacerlo funcionar, no vale escribir varios test y luego hacerlos funcionar a todos juntos.&lt;br /&gt;De vuelta, es importante darse cuenta que haciendo lo último, estamos manteniendo muchas ideas, soluciones, problemas, etc. en nuestra cabeza en vez de descargarlas a la computadora, y recuerden que los seres humanos cuanto más cosas tenemos en la cabeza más nos equivocamos y olvidamos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-4324171037193389763?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/4324171037193389763/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=4324171037193389763' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4324171037193389763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/4324171037193389763'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/05/como-hacer-tdd.html' title='Como hacer TDD'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1124348889290774393</id><published>2008-06-13T18:16:00.002-03:00</published><updated>2008-06-14T10:41:20.751-03:00</updated><title type='text'>Smalltalks 2008</title><content type='html'>Quería comentarles que ya hicimos el anuncio de Smalltalks 2008. Este año será en otra fecha y otro lugar, pero esperamos tener la misma calidad de presentaciones y cantidad de gente y por qué no, mejorarla.&lt;br /&gt;Estamos trabajando para que venga gente "importante" a dar key notes y lo anunciaremos a su debido tiempo. También estamos trabajando para hacer un "coding contest" y que hayan tutoriales interesantes.&lt;br /&gt;El lugar elegido esta año para hacer el congreso es la Universidad Abierta Interamericana que tiene unas instalaciones muy lindas y nos han abierto sus puertas con muy buena predisposición.&lt;br /&gt;El sitio web del congreso este año será http://neuquina.lifia.info.unlp.edu.ar:8001/Smalltalks-2008&lt;br /&gt;Aún estamos trabajando para hacer la inscripción automática y no por mail, etc. así que hay algunas páginas que están bajo construcción.&lt;br /&gt;Espero verlos a todos en el congreso nuevamente!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-1124348889290774393?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1124348889290774393/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1124348889290774393' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1124348889290774393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1124348889290774393'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/06/smalltalks-2008.html' title='Smalltalks 2008'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-1670252943776940019</id><published>2008-06-10T11:14:00.006-03:00</published><updated>2008-06-14T12:32:46.433-03:00</updated><title type='text'>Por qué escribir de manera inversa?</title><content type='html'>Estos días de "reposo" que tuve que hacer, los aproveché para ver algunos videos de Abelson y Sussman que son realmente muy recomendables.&lt;br /&gt;Ellos hacen mucho hincapié en los mimos principios que usamos nosotros en POO y DAO, es muy interesante ver como piensan en el MIT y como lo hacían hace más de 20 años atrás!&lt;br /&gt;Sin embargo, viendo uno de los ejemplos que mostraban me di cuenta que no siempre uno cumple lo que dice. Por ejemplo, vean este código:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_MFPZ3JVsnfE/SFPQJHaF9oI/AAAAAAAADd0/YBSo4r6hSp0/s1600-h/add-fib.JPG"&gt;&lt;img style="cursor: pointer; width: 655px; height: 491px;" src="http://bp2.blogger.com/_MFPZ3JVsnfE/SFPQJHaF9oI/AAAAAAAADd0/YBSo4r6hSp0/s320/add-fib.JPG" alt="" id="BLOGGER_PHOTO_ID_5211738048823686786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Más allá de que es un poco difícil de entender la sintaxis porque está escrito en Scheme, lo que quiero remarcar es que para entender lo que hace hay que leer de abajo para arriba. La idea es que esta función sume los primeros n fibonaccies que son impares, y para ello utiliza el patrón&lt;br /&gt;map/filter. Se debe leer, como dije, de abajo para arriba:&lt;br /&gt;1) enum-interval 1 n  -&gt; crea un intervalo de 1 a n (a)&lt;br /&gt;2) map fib (a) -&gt; mapea los números del intervalo a su fibonacci correspondiente (b)&lt;br /&gt;3) filter odd (b) -&gt; filtra aquellos fibonacci que son pares, o sea, se queda con los impares (c)&lt;br /&gt;4) accumulate cons '() (c) -&gt; Acumula los resultados en una lista usando un lista vacía como valor inicial&lt;br /&gt;Ahora, si estamos abogando por escribir código entendible, que se pueda leer fácilmente, etc. por qué para leer esta función tengo que hacerlo de abajo para arriba en vez de arriba para abajo que es más natural?&lt;br /&gt;Me parece que sería mejor algo así (ahora en Smalltalk):&lt;br /&gt;&lt;br /&gt;interval := 1 to: n.&lt;br /&gt;fibonacciNumbers := interval collect: [ :aNumber | aNumber fibonacci ].&lt;br /&gt;oddFibonacciNumbers := interval select: [ :aNumber | aNumber odd ].&lt;br /&gt;^oddFibonacciNumbers&lt;br /&gt;&lt;br /&gt;Al hacerlo así, se puede leer de manera natural, de arriba hacia abajo, de izquierda a derecha como van realizándose el computo.&lt;br /&gt;Tiene una desventaja implementativa respecto de la primera versión y es que guarda todos los fibonacci para luego filtrarlo para quedarse con los impares mientras que la versión Scheme si el fibonacci no es impar, no lo guarda.  Se podría lograr lo mismo haciendo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;oddFibonacciNumbers := OrderedCollection new.&lt;br /&gt;fibonacciNumbers := 1 to: n do: [ :aNumber | | fibonacci |&lt;br /&gt;    fibonacci := aNumber fibonacci.&lt;br /&gt;    fibonacci odd ifTrue: [ oddFibonacciNumbers add: fibonacci] ].&lt;br /&gt;^oddFibonacciNumbers&lt;br /&gt;&lt;br /&gt;No es tan claro como la versión anterior, por lo que se podría abstraer en algo así:&lt;br /&gt;&lt;br /&gt;(1 to: n)&lt;br /&gt;     add: [ :aNumber | aNumber fibonacci ]&lt;br /&gt;     into: OrderedCollection new while:&lt;br /&gt;     [ :aFibonacciNumber | aFibonacciNumber odd ]&lt;br /&gt;&lt;br /&gt;De esta manera queda mejor expresada la idea que se quiere implementar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-1670252943776940019?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/1670252943776940019/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=1670252943776940019' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1670252943776940019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/1670252943776940019'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/06/por-qu-escribir-de-manera-inversa.html' title='Por qué escribir de manera inversa?'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_MFPZ3JVsnfE/SFPQJHaF9oI/AAAAAAAADd0/YBSo4r6hSp0/s72-c/add-fib.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-9065440331404703677</id><published>2008-06-09T17:54:00.002-03:00</published><updated>2008-06-09T18:03:08.792-03:00</updated><title type='text'>Ojo con el ojo</title><content type='html'>Simplemente quería hacer un comentario de tipo personal. El jueves pasado me realizaron un operación de retina del ojo izquierdo... los Wilkinson tenemos un par de problemas genéticos con los ojos... a mi me tocó algo que no es tan grave que se llama pit de papila que es un agujero en la retina.  En fin, entró un poco de líquido por ese lugar, separó la retina del nervio óptico y dejé de ver algunos "pixels".&lt;br /&gt;La operación fue muy interesante, pude ver todo lo que pasaba adentro del ojo porque tenía una fibra óptica que iluminaba todo. Tengo la operación grabada así que si alguien está interesado en verla me avisa!! jaja.&lt;br /&gt;En fin, ahora estoy recuperándome, en una especie de reposo donde solo puedo ver con un ojo puesto que el operado está medio "atontado" por unas gotas que me estoy poniendo para que la retina cicatrice bien.&lt;br /&gt;Es increíble el avance que hay en este tipo de operaciones. Me operaron en menos de una hora y salí caminando como si nada, es más, salí muy interesado en toda la operación, seguramente por el estado de "atontamiento" que tenía por el sedante que me dieron... según mi mujer parecía chico con juguete nuevo jaja.&lt;br /&gt;Voy a ver cuanto puedo escribir con un solo ojo durante una semana!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-9065440331404703677?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/9065440331404703677/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=9065440331404703677' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/9065440331404703677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/9065440331404703677'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/06/ojo-con-el-ojo.html' title='Ojo con el ojo'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-5195873537606801560</id><published>2008-06-09T17:52:00.002-03:00</published><updated>2008-06-09T17:54:22.276-03:00</updated><title type='text'>VM de Squeak más rápido que VisualWorks</title><content type='html'>Parece que Eliot Miranda está trabajando en hacer una VM para Squeak muy rápida, basado en todo su conocimiento de la VM de VisualWorks. Según dice en su blog, su intención es que sea más rápida que la de VisualWorks... veremos si lo logra. Su blog está en http://www.mirandabanda.org/cogblog/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-5195873537606801560?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/5195873537606801560/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=5195873537606801560' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/5195873537606801560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/5195873537606801560'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/06/vm-de-squeak-ms-rpido-que-visualworks.html' title='VM de Squeak más rápido que VisualWorks'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-2732521915506905495</id><published>2008-05-27T17:10:00.003-03:00</published><updated>2008-05-27T17:52:02.578-03:00</updated><title type='text'>Ejemplos de buena implementación</title><content type='html'>En la materia de POO, uno de los ejercicios que tienen que hacer es implementar un modelo de medidas y otro un autómata finito determinístico y no determinístico. Son ejercicios muy interesantes y que dan buenos ejemplos de problemas de modelado e implementación.&lt;br /&gt;A continuación transcribo alguna de las cosas que les comenté por mail a los alumnos y que me parecen interesantes en general:&lt;br /&gt;&lt;br /&gt;1) En el ejercicio de las medidas, la implementación del mensaje #*, que se puede utilizar para hacer cosas como: "diezMetros * 5" o "diezMetros * dosMetros", no utiliza polimorfismo sino un "if" para solucionar el problema de multiplicar por un número o por una medida. Por ejemplo:&lt;br /&gt;&lt;br /&gt;Measure&gt;&gt;* aMeasure&lt;br /&gt;&lt;br /&gt;  ^aMeasure class = self class&lt;br /&gt;      ifTrue: [ ... multiplicación de medidas, en muchos casos puesto el código acá directamente en vez de factorizarlo en un mensaje ]&lt;br /&gt;      ifFalse: [ ... multiplicación por un número ]&lt;br /&gt;&lt;br /&gt;Esta solución adolece de varios problemas:&lt;br /&gt;a) Restringe la solución a multiplicar medidas y cualquier otra cosa, asumiendo siempre que la otra cosa va a ser un número, lo cual está implícito y por lo tanto puede generar errores en la evolución del modelo. Para evitar este problema de evolución, una correcta solución sería:&lt;br /&gt;&lt;br /&gt;  ^aMeasure class = self class&lt;br /&gt;      ifTrue: [ ... multiplicación de medidas, en muchos casos puesto el código acá directamente en vez de factorizarlo en un mensaje ]&lt;br /&gt;      ifFalse: [ (aMeasure isKindOf: Number)&lt;br /&gt;          ifTrue: [ ... multiplicación por un numero ]&lt;br /&gt;          ifFalse: [ Exception!!! -&gt; El modelo no está preparado para multiplicar por cualquier otra cosa ]&lt;br /&gt;&lt;br /&gt;b) La opción anterior, por supuesto que sigue estando distante de una buena solución, por el motivo que comente en el punto a (que restringe la multiplicación a lo que conocemos ahora que se puede multiplicar), pero también porque queda claro si nos fijamos con cuidado que el colaborador externo aMeasure no es un buen nombre, porque si es una medida, cómo puede ser un Number?. Esto tiene mal olor. Es este caso puede ser interpretado como que falta una abstracción que permita "juntar" el concepto de medida y de número en algo más abstracto, que en el caso de VisualWorks se llama ArithmeticValue. Por lo tanto, Measure debería subclasificar ArithmeticValue (igual que Number) y el colaborado externo se debería llamar "anArithmeticValue" en vez de aMeasure&lt;br /&gt;&lt;br /&gt;c) Para no restringir la multiplicación a medidas y números, hay que utilizar la técnica que se denomina "double dispacth". La idea de esta técnica es que las decisiones la tomen los objetos enviándose mensajes en vez de los programadores por medio de un "if". La solución correcta para este caso sería:&lt;br /&gt;&lt;br /&gt;Measure&gt;&gt;* anArithmeticValue&lt;br /&gt;&lt;br /&gt;  ^anAritmeticValue multiplyMeasure: self&lt;br /&gt;&lt;br /&gt;Measure&gt;&gt;multiplyMeasure: aMeasure&lt;br /&gt;&lt;br /&gt;  "En este caso estoy seguro que aMeasure es instancia de Measure, puesto que el mensaje lo envió una Measure"&lt;br /&gt;  ^... (multiplicación de medidas)&lt;br /&gt;&lt;br /&gt;Number&gt;&gt;multiplyMeasure: aMeasure&lt;br /&gt;&lt;br /&gt;  "Soy un número y me piden multplicar aMeasure por mi"&lt;br /&gt;  ^Measure amount: aMeasure amount * self unit: aMeasure unit  (o algo así)&lt;br /&gt;&lt;br /&gt;Esta solución erradica el if y está preparada para el día de mañana si alguien observa que se puede multiplicar una medida por algo que no sea ni una medida ni un número... algo quizá medio difícil de ver en primera instancia, pero la puerta queda abierta para esa posibilidad (algún loco le gustaría poder multiplicar por un punto por ejemplo. Para el caso de VisualWorks no parece loco hacerlo puesto que Point subclasifica ArithmeticValue como también lo hace Complex)&lt;br /&gt;Fijense que también el código queda automáticamente factorizado y en el caso de querer multiplicar por algo que no tiene sentido, por ejemplo un punto, automáticamente se genera un doesNotUnderstand y no hay que explícitamente manejar ese caso en el código, los objetos se encargan.&lt;br /&gt;&lt;br /&gt;2) Otro ejemplo de código que tiene mal olor es este que pongo a continuación y tiene que ver con la creación de una función no determinística de un atómata finito:&lt;br /&gt;&lt;br /&gt;funcionNoDeterministica&lt;br /&gt;   | dictionary |&lt;br /&gt;   dictionary := Dictionary new.&lt;br /&gt;   dictionary&lt;br /&gt;       add: (Association key: #(1 'a') value: (Set new add:7;add:6  ));&lt;br /&gt;       add: (Association key: #(7 'a') value: (Set new add:3  ));&lt;br /&gt;       add: (Association key: #(3 'b') value: (Set new add:5  ));&lt;br /&gt;       add: (Association key: #(6 'b') value: (Set new add:2));&lt;br /&gt;       add: (Association key: #(6 'a') value: (Set new add:4));&lt;br /&gt;       add: (Association key: #(4 'b') value: (Set new add:2; add:5)).&lt;br /&gt;&lt;br /&gt;   ^TransitionFunction dictionary: dictionary.&lt;br /&gt;&lt;br /&gt;Si lo analizamos un poco, veremos que:&lt;br /&gt;a) Nombre "dictionary" no agrega valor, no representa su rol en el contexto. En esta caso es difícil pensar un mejor nombre y creo que tiene que ver con el problema de usar un diccionario para representar las transiciones, pero esto es solo una suposición.&lt;br /&gt;b) Se utiliza el mensaje #add: en vez de #at:put:&lt;br /&gt;c) No queda claro qué representa la key ni el value. Por qué se usa como key un Array? y el value? Parecería por el código que se espera que el value sea un Set, pero qué termina siendo?... observen bien el código.... termina siendo un número puesto que el mensaje #add: devuelve el colaborador externo, no el receptor del mensaje. Esto demuestra además que los test realizado no son buenos, no cubren todos los casos.&lt;br /&gt;d) No sería más claro tener algo así:&lt;br /&gt;&lt;br /&gt;  | transitions |&lt;br /&gt;&lt;br /&gt;  transitions := OrderedCollection new&lt;br /&gt;    add: (Transition from: 1 to: 7 by: $a);&lt;br /&gt;    add: (Transition from: 1 to: 6 by: $a);&lt;br /&gt;    add: (Transition from: 7 to: 3 by: $a);&lt;br /&gt;    ....&lt;br /&gt;    yourself.&lt;br /&gt;&lt;br /&gt;   ^TransitionFunction with: transitions&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-2732521915506905495?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/2732521915506905495/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=2732521915506905495' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2732521915506905495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2732521915506905495'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/05/en-la-materia-de-poo-uno-de-los.html' title='Ejemplos de buena implementación'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-3024506200936816861</id><published>2008-05-15T11:34:00.003-03:00</published><updated>2008-05-15T12:29:44.502-03:00</updated><title type='text'>Igualdad de Set</title><content type='html'>Esta semana hubo una discusión muy interesante en la lista de la materia de la UBA de POO sobre el problema de la igualdad de Set. El problema surgió porque un grupo haciendo un TP compararon Sets y les dió false cuando esperaban que el resultado sea true. Por ejemplo, si evaluamos:&lt;br /&gt;&lt;br /&gt;(Set with: 1 with: 2) = (Set with: 1 with: 2)&lt;br /&gt;&lt;br /&gt;el resultado es false y no true como se esperaría intuitivamente.&lt;br /&gt;Fácilmente se puede deducir que este comportamiento se debe a que el mensaje #= no está redefinido en Set de tal manera que verifique si su contenido es el mismo, sino que usa la implementación otorgada por Object que define la igualdad como identidad, o sea, dos objetos son iguales si son idénticos, lo que significa que ocupan "la misma posición de memoria".&lt;br /&gt;Hago esta aclaración puesto que la identidad de Smalltalk no es lo mismo que la identidad "filosófica". En Smalltalk pueden existir dos o más objetos que representen el mismo ente de la realidad y que por lo tanto cuando se los compare por identidad devuelvan false, sin embargo en la realidad hay un único ente que posee esa identidad. Por ejemplo:&lt;br /&gt;&lt;br /&gt;Date today == Date today&lt;br /&gt;&lt;br /&gt;Esta colaboración devuelve false, sin embargo el día de hoy (el ente de la realidad) es único e idéntico a si mismo. Es por este motivo que nunca hay que usar el mensaje #== a menos que explícitamente se necesite verificar si dos objetos ocupan la misma posición de memoria, algo que solo sucede en aquellos modelos relacionados con problema computacionales (por ejemplo frameworks mapeo relacionales, modelos de objetos distribuidos, etc.).&lt;br /&gt;Volviendo al tema de la comparación de conjuntos, luego de varios emails de idas y vueltas en la lista (y un par de errores de mi parte), quedó claro que no se puede fácilmente implementar ese comportamiento y por otro lado tampoco es sencillo darle una semántica clara a esta comparación cuando se están utilizando conjuntos definidos por comprensión (aporte de Daniel Altman que quedó plasmado en la tesis que hizo junto a Hernán Tylin).&lt;br /&gt;Uno de los problemas que surge al implementar el #= en Set es que se debe definir si solo se será true para aquellos casos en que se comparen conjuntos. Algo que yo había pensado es que la comparación debería devolver true si las colecciones comparadas tenían los mismos objetos, más allá de como están implementadas, pero la realidad es que no es sencillo implementarlo así y tampoco tiene sentido semánticamente. Por ejemplo:&lt;br /&gt;&lt;br /&gt;(Set with: 1 with: 2) = (OrderedCollection with: 1 with: 1 with: 2)&lt;br /&gt;&lt;br /&gt;¿Debería dar true o false?. Cualquier decisión que se tome al respecto es arbitraria. Por lo tanto el #= solo debería devolver true si se comparan conjuntos. Esa es la decisión que tomaron los implementadores de Squeak, donde el #= en Set está definido de la siguiente manera:&lt;br /&gt;&lt;br /&gt;= aSet&lt;br /&gt;    self == aSet ifTrue: [^ true].    "stop recursion"&lt;br /&gt;    (aSet isKindOf: Set) ifFalse: [^ false].&lt;br /&gt;    self size = aSet size ifFalse: [^ false].&lt;br /&gt;    self do: [:each | (aSet includes: each) ifFalse: [^ false]].&lt;br /&gt;    ^ true&lt;br /&gt;&lt;br /&gt;Fijensé que es necesario que aSet sea instancia de Set o de alguna de sus subclasses. Esto restringe la comparación a que solo devolverá true si se comparan conjuntos. Sin embargo tiene la desventaja de no poder implementar un conjunto fuera de la jerarquía de Set y poder compararlo por igual con un Set puesto que siempre dará falso.&lt;br /&gt;Una vez hecha esta salvedad, surge el problema de cómo implementar el #hash en Set, puesto que al haber implementado el #=, tengo que implementar un algoritmo de hash que cumpla con la condición que dos objetos iguales deben tener el mismo hash. Para la implementación de Object, el hash viene dado utilizando un número que se asigna a cada objeto que se crea y que se almacena en su header (fijensé que no se puede usar la posición de memoria puesto que la misma puede cambiar debido al garbage collector).&lt;br /&gt;La implementación de Squeak es la siguiente:&lt;br /&gt;&lt;br /&gt;hash&lt;br /&gt;&lt;br /&gt;    | hash |&lt;br /&gt;&lt;br /&gt;    hash := self species hash.&lt;br /&gt;    self size &lt;= 10 ifTrue: [self do: [:elem | hash := hash bitXor: elem hash]].&lt;br /&gt;    ^hash bitXor: self size hash&lt;br /&gt;&lt;br /&gt;Podemos observar que se realiza un trade-off entre obtener un buen número y performance. Un buen número estaría dado a partir del hash de los objetos que contiene el conjunto, pero recorrer todo un conjunto puede ser time-consuming y por eso se limita a hacerlo solo en el caso de tener 10 o menos elementos.&lt;br /&gt;Por lo tanto, implementar el #= en Set como uno intuye que debería funcionar no es tan sencillo, tiene sus complicaciones y trade-offs.&lt;br /&gt;Una solución que me propuso Nicolás Kicillof, quién está trabajando en Microsoft en USA, es hacer como hacen ellos en su lenguaje de verificación en donde cada vez que se crea un conjunto, se verifica si el mismo no existe y de existir se devuelve el mismo. O sea, hablando mal y pronto, usan los conjuntos como los símbolos de Smalltalk. Esto implica que los conjuntos son inmutables y por ende tienen que tener un buen algoritmo de búsqueda para asegurarse de no tardar mucho cuando tienen que verificar si ya existe el conjunto (lo cual nos lleva nuevamente al hash...)&lt;br /&gt;Otra solución es la que propone Daniel Altman, la cual crea una nueva manera de ver el problema completamente distinto y que me parece sumamente interesante y acertada. Transcribo lo que Daniel escribió en la lista porque no tiene desperdicio:&lt;br /&gt;               &lt;p style="color: rgb(51, 102, 255);"&gt;&lt;span style="font-size: 11pt;"&gt;"[...] un Set en computación sea distinto del de la matemática, es el dinamismo que hay en el mundo de los objetos, cosa que no ocurre en principio en la matemática.&lt;br /&gt;Es decir, un objeto matemático nunca tiene un estado que cambia.&lt;br /&gt;Basta probar que dos conjuntos tienen los mismos elementos para demostrar que son iguales. Qué pasa en Squeak? Los elementos contenidos en un conjunto cambian a lo largo del tiempo.&lt;br /&gt;Acá entra en juego una consideración bastante importante: es lo mismo hablar de conjuntos como simples  “&lt;i&gt;contenedores de elementos&lt;/i&gt;” (o sea, básicamente una estructura de datos) que hablar de un conjunto como un ente que tiene una semántica propia?&lt;br /&gt;Para mí, los conjuntos interesantes son los segundos, los que tienen semántica.  En ese caso un cambio en el ambiente, o en algún objeto cualquiera, pueden hacer que un elemento pertenezca o deje de pertenecer al conjunto. (por ejemplo, imaginen el conjunto de los objetos que responden &lt;i&gt;true &lt;/i&gt;al mensaje &lt;i&gt;#foo&lt;/i&gt;).&lt;br /&gt;De ahí se desprende que la manera de comprar la igualdad de conjuntos sería comparar su semántica."&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Este comentario quedó a mi entender claramente definido con un ejemplo que escribió más adelante en otro mail:&lt;br /&gt;&lt;/p&gt;&lt;p style="color: rgb(51, 102, 255);"&gt;"Ejemplo: tenes el conjunto de las facturas impagas de una empresa por una&lt;br /&gt;lado, y el conjunto de todas las facturas de la empresa por otro. Esos&lt;br /&gt;conjuntos pueden tener los mismos elementos si nadie pagó ninguna factura,&lt;br /&gt;pero son claramente distintos."&lt;/p&gt;&lt;p style="color: rgb(0, 0, 0);"&gt;Un concepto muy interesante, ¿no les parece?&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-3024506200936816861?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/3024506200936816861/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=3024506200936816861' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3024506200936816861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3024506200936816861'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/05/igualdad-de-set.html' title='Igualdad de Set'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-3658821899775659986</id><published>2008-05-08T11:33:00.002-03:00</published><updated>2008-05-08T12:07:45.657-03:00</updated><title type='text'>Ventajas del código autodocumentado</title><content type='html'>&lt;div&gt;Este año hay un grupo muy activo en POO lo cual es muy bueno porque preguntan y hacen cosas más allá de lo que comúnmente sucede en esta materia.&lt;br /&gt;Por ejemplo, el otro día en la lista de POO un alumno preguntó como hacer una búsqueda de algún String particular en los métodos. Pareciera que en VisualWorks no hay manera de hacerlo directamente usando las herramientas de desarrollo que ofrece, pero como esto es Smalltalk no cuesta nada escribir un conjunto de colaboraciones para hacerlo. Así se los propuse y, debido a que es un grupo muy interesante, generaron una solución.&lt;br /&gt;La solución que generaron fue:&lt;br /&gt;&lt;br /&gt;| resultado aBuscar bloque |&lt;/div&gt; &lt;p&gt;resultado := OrderedCollection new.&lt;br /&gt;aBuscar := (Dialog request: 'Texto a buscar:' initialAnswer: '&lt;string&gt;' windowLabel: 'Buscar' for: nil).&lt;br /&gt;bloque := [:class :selector :aString | | method |&lt;br /&gt;    method := class compiledMethodAt: selector.&lt;br /&gt;    ( method allLiterals anySatisfy: [:lit | lit isString and: [aString match: lit]])&lt;br /&gt;                ifTrue: [ resultado add: method definition]&lt;br /&gt;].&lt;br /&gt;Object allSubclasses do: [:class | class selectors do: [:sel | bloque value: class value: sel value: aBuscar ]].&lt;/p&gt;&lt;p&gt;RefactoringBrowser&lt;br /&gt;  openListBrowserOn: resultado&lt;br /&gt;  label: 'Resultados de búsqueda'&lt;br /&gt;  initialSelection: nil&lt;/p&gt;&lt;p&gt;Me parece interesante analizar los errores que posee dicho fragmento de código y como se puede escribir de otra manera para que sea más simple de entender. Como errores podríamos enumerar:&lt;br /&gt;1) No tiene en cuenta el caso de presionar Cancel cuando se pregunta por el string. En dicho caso buscará el String ''&lt;br /&gt;2) No tiene en cuenta aquellas clases que no tienen superclase que no sea Object&lt;br /&gt;3) No busca el string en Object puesto que hace Object allSubclasses en vez de Object withAllSubclasses&lt;br /&gt;&lt;/p&gt; Respecto a como está escrito, los nombre de las variables que usaron no están muy buenos. Dichos nombres deberían ser más explicativos, por ejemplo "resultado" no dice mucho sobre el objeto que referencia.&lt;br /&gt;El objeto "bloque", también es un poco confuso, no solo por el nombre sino por como termina participando en las colaboraciones. Me imagino que la intención fue refactorizar el código puesto que de estar escribiendo esto en una clase ese "bloque" estaría representado por un método. Ahora, de ser así, seguramente ese método no se activaría al enviar el mensaje #bloque, lo que demuestra que "bloque" no es un buen nombre para dicho objeto.&lt;br /&gt;Mi propuesta para resolver este problema es:&lt;br /&gt;&lt;br /&gt;| methods stringToLookFor |&lt;br /&gt;&lt;br /&gt;methods := OrderedCollection new.&lt;br /&gt;stringToLookFor := Dialog request: 'Texto a buscar:' initialAnswer: '&lt;string&gt;' windowLabel: 'Buscar' for: nil.&lt;br /&gt;stringToLookFor isEmpty ifTrue: [^self].&lt;br /&gt;&lt;br /&gt;Class rootsOfTheWorld do: [ :aRootClass |&lt;br /&gt;    aRootClass withAllSubclasses do: [ :aClass | | methodContainingStringToLookFor |&lt;br /&gt;        methodContainingStringToLookFor := aClass methodDictionary values select: [ :aMethod |&lt;br /&gt;            aMethod allLiterals anySatisfy: [ :aLiteral | aLiteral isString and: [ stringToLookFor match: aLiteral ]]].&lt;br /&gt;        methods addAll: methodContainingStringToLookFor ]].&lt;br /&gt;&lt;br /&gt;RefactoringBrowser&lt;br /&gt;  openListBrowserOn: (methods collect: [ :aMethod | aMethod definition ])&lt;div class="Ih2E3d"&gt;  label: 'Resultados de búsqueda'&lt;br /&gt;  initialSelection: nil&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;Esta solución resuelve los errores del script anterior. Creo que es un poco más fácil de leer, pero el hecho de tener tantos bloques anidados complica bastante su lectura. Para hacer un poco más entendible el script, utilizo la variable methodContainingStringToLookFor para explicar qué hace el conjunto de colaboraciones "aClass methodDictionary values select: ...". De esta manera no es necesario leer toda las colaboraciones para entender qué resulta al evaluarlas.&lt;br /&gt;Sin embargo, la mejor solución sería modelar esto en una clase (olvidarnos del script...), puesto que al hacerlo se podría refactorizar bastante y hacer que el código quede más "autodocumentado".&lt;br /&gt;De hacerlo, obtendríamos algo así:&lt;br /&gt;...&gt;&gt;methodsContaining: aString&lt;br /&gt;&lt;br /&gt;    ^Class rootsOfTheWorld inject: OrderedCollection new into: [ :methods :aRootClass |&lt;br /&gt;        methods addAll: (self methodsContaining: aString inAll: aRootClass withAllSubclasses).&lt;br /&gt;        methods]&lt;br /&gt;&lt;br /&gt;...&gt;&gt;methodsContaining: aString inAll: aCollectionOfClasses&lt;br /&gt;&lt;br /&gt;  ^aCollectionOfClasses inject: OrderedCollection new into: [:methods :aClass |&lt;br /&gt;        methods addAll: (self methodsContaining: aString in: aClass) ]&lt;br /&gt;&lt;br /&gt;..&gt;&gt;methodsContaining: aString in: aClass&lt;br /&gt;&lt;br /&gt;  "Lamentablemente VisualWorks no define le mensaje #methods en Behavior, por eso trabajo con el methodDictionary. Esto rompe el encapsulamiento pero es una solución de compromiso para no modificar Behavior"&lt;br /&gt;   ^aClass methodDictionary values select: [ :aMethod | self does: aMethod includes: aString ]&lt;br /&gt;&lt;br /&gt;...&gt;&gt;does: aMethod includes: aString&lt;br /&gt;&lt;br /&gt;    ^aMethod allLiterals anySatisfy: [ :aLiteral | aLiteral isString and: [ aString match: aLiteral ]].&lt;br /&gt;&lt;br /&gt;Creo que así queda mucho más lindo y fácil de entender. Fijensé como desaparece la necesidad de definir la variable methodContainingStringToLookFor debido a que fue reemplazada por el envío de un mensaje, #methodsContaining:inAll: , que a mi gusto además transmite mejor la intención de qué están haciendo los objetos.&lt;br /&gt;Fijensé también que los métodos #methodsContaining:in: y #does:includes: podrían haber sido implementados en Behavior y CompiledCode respectivamente, de tal manera que quedasen como #methodsContainingString: e #includesString:&lt;br /&gt;Me parece interesante este caso como ejemplo de cómo se puede mejorar la legibilidad del código y de cómo así y todo en algo tan sencillo pueden haber varios errores.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-3658821899775659986?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/3658821899775659986/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=3658821899775659986' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3658821899775659986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3658821899775659986'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/05/ventajas-del-cdigo-autodocumentado.html' title='Ventajas del código autodocumentado'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-9030259258026171567</id><published>2008-05-07T13:40:00.002-03:00</published><updated>2008-05-07T13:48:38.528-03:00</updated><title type='text'>Programming as a Threory Building</title><content type='html'>&lt;p class="vspace"&gt;Debido al curso que estoy dando en la UCA, volví a reeler el paper de Peter Naur que se llama "Programming as a Theory Building".&lt;br /&gt;&lt;/p&gt;&lt;p class="vspace"&gt;Es interesante que cuando uno relee lecturas, le impresionan partes distintas a las lecturas anteriores. Eso me pasó esta vez, donde lo que más me impresionó fue esta parte donde habla del "status" del programador: (si quieren leer todo el artículo, vayan a &lt;a href="http://www.zafar.se/bkz/Articles/NaurProgrammingTheory"&gt;http://www.zafar.se/bkz/Articles/NaurProgrammingTheory&lt;/a&gt;)&lt;br /&gt;&lt;/p&gt;&lt;p class="vspace"&gt;"More generally, much current discussion of programming seems to assume that programming is similar to industrial production, the programmer being regarded as a component of that production, a component that has to be controlled by rules of procedure and which can be replaced easily. Another related view is that human beings perform best if they act like machines, by following rules, with a consequent stress on formal modes of expression, which make it possible to formulate certain arguments in terms of rules of formal manipulation. Such views agree well with the notion, seemingly common among persons working with computers, that the human mind works like a computer. At the level of industrial management these views support treating programmers as workers of fairly low responsibility, and only brief education. &lt;/p&gt; &lt;p class="vspace"&gt;On the Theory Building View the primary result of the programming activity is the theory held by the programmers. Since this theory by its very nature is part of the mental possession of each programmer, it follows that the notion of the programmer as an easily replaceable component in the program production activity has to be abandoned. Instead the programmer must be regarded as a responsible developer and manager of the activity in which the computer is a part. In order to fill this position he or she must be given a permanent position, of a status similar to that of other professionals, such as engineers and lawyers, whose active contributions as employers of enterprises rest on their intellectual proficiency. &lt;/p&gt; &lt;p class="vspace"&gt;The raising of the status of programmers suggested by the Theory Building View will have to be supported by a corresponding reorientation of the programmer education. While skills such as the mastery of notations, data representations, and data processes, remain important, the primary emphasis would have to turn in the direction of furthering the understanding and talent for theory formation. To what extent this can be taught at all must remain an open question. The most hopeful approach would be to have the student work on concrete problems under guidance, in an active and constructive environment."&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-9030259258026171567?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/9030259258026171567/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=9030259258026171567' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/9030259258026171567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/9030259258026171567'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/05/programming-as-threory-building.html' title='Programming as a Threory Building'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-3120293698053453806</id><published>2008-05-02T16:38:00.002-03:00</published><updated>2008-05-02T16:55:54.699-03:00</updated><title type='text'>Ejercicio de Distancia</title><content type='html'>El otro día hicimos en la facultad, durante POO, un ejercicio que me ha dado muy buenos resultados. El ejercicio consiste en modelar medidas de distancia, o sea un modelo capaz de expresar cosas como "3 metros", "5 centimetros + 10 metros", etc.&lt;br /&gt;Es increíble como un tema que parece tan sencillo genera tantos modelos distintos, tantas ideas distintas sobre como resolverlo y ofrece una gran cantidad de temas para hablar y discutir.&lt;br /&gt;También es interesante porque es un tema que se puede ampliar a medidas de cualquier tipo, como volumen, velocidad, tiempo, riqueza, etc. y por lo tanto como ejercicio siguiente deben hacerlo.&lt;br /&gt;Lo que implemente este año a diferencia de los anteriores, es que para el modelo de medidas genéricas ellos tienen que escribir los test usando TDD, mientras que en el de distancias nosotros les proveemos los test y ellos solo los tienen que hacer andar.&lt;br /&gt;Aún así, dándole los test, los diseños son distintos.... da para pensar no?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-3120293698053453806?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/3120293698053453806/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=3120293698053453806' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3120293698053453806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/3120293698053453806'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/05/ejercicio-de-distancia.html' title='Ejercicio de Distancia'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-2911136608070532406</id><published>2008-04-18T17:26:00.002-03:00</published><updated>2008-04-18T17:29:08.450-03:00</updated><title type='text'>Charla de Patrick Chanezon, Google Developer Advocate</title><content type='html'>Les paso un dato sobre una charla de un tema bastante "hot" actualmente que se dará en la FCEyN de la UBA (Ciudad Universitaria). Copio el mail que me llegó:&lt;br /&gt;&lt;br /&gt;El viernes 2 de mayo a las 19 hs, en el Aula Magna del Pabellón I, Patrick Chanezon, Google Developer Advocate, ofrecerá una perspectiva técnica de OpenSocial, el nuevo estándar abierto de Google para redes sociales.&lt;br /&gt;La charla se titula "OpenSocial, a standard programming model for Social Web" y será en inglés.&lt;br /&gt;Resumen:&lt;br /&gt;OpenSocial define un set de APIs que corren en diversos sitios sociales, entre los que se encuentran MySpace, hi5, LinkedIn, Friendster, Vostu, Sonico, Plaxo, Ning, orkut y Salesforce.com. Con OpenSocial, los desarrolladores solo necesitan aprender una API que luego les permitirá crear aplicaciones sociales para utilizar en cualquiera de aquellos&lt;br /&gt;sitios, así llegando a más de 200 millones de usuarios en todo el mundo.&lt;br /&gt;Como está basada en estándares web como HTML y JavaScript, los desarrolladores no necesitan aprender un lenguaje de programación customizado. OpenSocial es una especificación abierta: cualquier sitio que mantenga una red social puede implementarlo y así convertirse en&lt;br /&gt;OpenSocial container.&lt;br /&gt;En estas charlas, explicaremos OpenSocial, sus beneficios y utilidades; mostraremos ejemplos de aplicaciones y containers OpenSocial; y daremos un panorama de las oportunidades que ofrece.&lt;br /&gt;Patrick Chanezon es API Evangelist de Google desde 2005. Actualmente, sus mayores intereses giran en torno a OpenSocial API y software social, Google APIs, REST, SOAP y Ajax, Java, Groove, JavaScript, PHP, Ruby y Python. Anteriormente, se desempeñó en Sun Microsystems, AOL y Netscape como Software Architect, B2B, Technical Evangelist, Tech Lead y Training&lt;br /&gt;Manager en portales, weblogs, RSS y open source.&lt;br /&gt;Más en su blog en &lt;a href="http://wordpress.chanezon.com/" target="_blank"&gt;http://wordpress.chanezon.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-2911136608070532406?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/2911136608070532406/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=2911136608070532406' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2911136608070532406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/2911136608070532406'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/04/charla-de-patrick-chanezon-google.html' title='Charla de Patrick Chanezon, Google Developer Advocate'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1292532279691646783.post-5829652372363897391</id><published>2008-04-14T16:40:00.003-03:00</published><updated>2008-04-14T16:46:43.984-03:00</updated><title type='text'>Sigo vivo y videito</title><content type='html'>Hace rato que no escribo nada, principalmente por falta de inspiración y llenar un blog con pavadas no es mi estilo (bah, en realidad todo lo que escribo son pavadas! :-) ), pero no quería dejar que pase mucho tiempo y siga sin escribir algo. Se me pasaron muchas cosas por la cabeza, pero al no haberlas escrito ya se me olvidaron (me estoy volviendo viejo también).&lt;br /&gt;En fin, un par de cosas que recuerdo que quería comentar es que empezó POO nuevamente este año en la UBA con el grupo de gente más grande de los últimos años, están cursando aproximadamente 35 alumnos lo cual es mucho para el promedio de 15 que veníamos teniendo. Parece que los cambios que estuvimos haciendo están dando resultados, la gente ya no le tiene "miedo" al final de la materia, ven que es "cursable" y siguen aprendiendo bastantes cosas nuevas, lo que me pone muy contento.&lt;br /&gt;Por otro lado seguramente esté dando clases en el postgrado de la UCA también, lo cual es un esfuerzo pero vale la pena. Aunque ya dí cursos de postgrado, siempre es bueno tener contacto con gente de mayor experiencia en el campo que los cursos de grado.&lt;br /&gt;También les comento (aunque seguro que lo leyeron en el blog de Andrés) que estamos trabajando para Smalltalks 2008, de apoco, pero va asomando...&lt;br /&gt;&lt;br /&gt;En fin, no mucho sobre objetos este post, así que les dejo un video, que para aquellos no acostumbrados a Smalltalk les puede resultar interesante: http://simberon.com/videos/SmalltalkDemo.html&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1292532279691646783-5829652372363897391?l=objectmodels.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://objectmodels.blogspot.com/feeds/5829652372363897391/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1292532279691646783&amp;postID=5829652372363897391' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/5829652372363897391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1292532279691646783/posts/default/5829652372363897391'/><link rel='alternate' type='text/html' href='http://objectmodels.blogspot.com/2008/04/sigo-vivo-y-videito.html' title='Sigo vivo y videito'/><author><name>Hernan Wilkinson</name><uri>http://www.blogger.com/profile/15637852043224382103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
