<?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-2376322310829911769</id><updated>2011-04-21T12:15:03.425-07:00</updated><category term='ruby'/><category term='C#'/><category term='dynamic typing'/><category term='runt'/><category term='big'/><category term='pet project'/><category term='ETL'/><category term='java'/><category term='publications'/><category term='asynchronous programming'/><category term='DSL'/><category term='persistence'/><category term='bugs'/><category term='generics'/><category term='OODBMS'/><category term='blogspot'/><category term='UML'/><category term='open source'/><category term='JDO'/><category term='static typing'/><category term='developerWorks'/><category term='database'/><category term='.NET'/><category term='JDJ'/><title type='text'>Personal brain dump</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://constantine-plotnikov.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://constantine-plotnikov.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>const</name><uri>http://www.blogger.com/profile/14198516934017644045</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>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2376322310829911769.post-7851501687719458331</id><published>2009-01-28T02:16:00.000-08:00</published><updated>2009-01-28T02:29:50.517-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='ETL'/><category scheme='http://www.blogger.com/atom/ns#' term='pet project'/><title type='text'>Extensible Term Language 0.2.1 Released</title><content type='html'>I have released &lt;a href="http://etl.sf.net"&gt;ETL 0.2.1&lt;/a&gt;, the hardest part was writing the tutorial. The language specification is not yet here yet, but I see how to tackle it.&lt;br /&gt;&lt;br /&gt;The tutorial experience was quite interesting. I have made a lot of fixes to the language in the places where it was simpler to fix than to explain. Some bugs were detected in the areas that are not covered by the test suit. Also I have added new features to avoid some lame excuses in the tutorial. I guess I will continue writing tutorials.&lt;br /&gt;&lt;br /&gt;This makes me wonder if the developers should write at least documentation drafts for their products. The attempt to explain product to the user could seriously affect the product interface and the product features.  If it is hard to explain, possibly it will be hard to use as well. Possibly aversion to writing the documentation is caused by the desire to avoid realization that the code has a questionable usability and quality. The usable product should have a working model that is easy to explain.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2376322310829911769-7851501687719458331?l=constantine-plotnikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://constantine-plotnikov.blogspot.com/feeds/7851501687719458331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2376322310829911769&amp;postID=7851501687719458331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/7851501687719458331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/7851501687719458331'/><link rel='alternate' type='text/html' href='http://constantine-plotnikov.blogspot.com/2009/01/extensible-term-language-021-released.html' title='Extensible Term Language 0.2.1 Released'/><author><name>const</name><uri>http://www.blogger.com/profile/14198516934017644045</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-2376322310829911769.post-1896579545488934004</id><published>2009-01-28T02:11:00.000-08:00</published><updated>2009-01-28T02:16:38.553-08:00</updated><title type='text'>Changes...</title><content type='html'>A lot of time passed since I blogged here something. There are some changes in the personal details.&lt;br /&gt;&lt;br /&gt;I'm now working at &lt;a href="http://www.jetbrains.com/"&gt;JetBrains&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm now living in St. Peterburg, Russia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2376322310829911769-1896579545488934004?l=constantine-plotnikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://constantine-plotnikov.blogspot.com/feeds/1896579545488934004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2376322310829911769&amp;postID=1896579545488934004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/1896579545488934004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/1896579545488934004'/><link rel='alternate' type='text/html' href='http://constantine-plotnikov.blogspot.com/2009/01/changes.html' title='Changes...'/><author><name>const</name><uri>http://www.blogger.com/profile/14198516934017644045</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-2376322310829911769.post-4812613228426078638</id><published>2007-11-07T00:24:00.000-08:00</published><updated>2007-11-07T00:31:50.998-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='publications'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='developerWorks'/><category scheme='http://www.blogger.com/atom/ns#' term='asynchronous programming'/><title type='text'>New article: Java EE meets Web 2.0</title><content type='html'>My article about Java EE concurrency model problems is &lt;a href="http://www.ibm.com/developerworks/web/library/wa-aj-web2jee/index.html"&gt;published on developerWorks&lt;/a&gt;. The article is mostly rehash of the problems and overview of available solutions. This article fared much better through publishing process. Some content were cut, but none of it were essential.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2376322310829911769-4812613228426078638?l=constantine-plotnikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://constantine-plotnikov.blogspot.com/feeds/4812613228426078638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2376322310829911769&amp;postID=4812613228426078638' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/4812613228426078638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/4812613228426078638'/><link rel='alternate' type='text/html' href='http://constantine-plotnikov.blogspot.com/2007/11/new-article-java-ee-meets-web-20.html' title='New article: Java EE meets Web 2.0'/><author><name>const</name><uri>http://www.blogger.com/profile/14198516934017644045</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-2376322310829911769.post-859383519327452520</id><published>2007-10-08T05:33:00.000-07:00</published><updated>2007-10-08T05:46:18.386-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML'/><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><title type='text'>What is a value of reverse and round-trip engineering in UML tools?</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="" lang="EN-US"&gt;For some reason, reverse engineering and round-trip engineering is considered important feature for UML tools. UML tool developers sometimes postpone other features in order to make it running. I always wondered why so. It looks it is &lt;a href="http://www.theregister.co.uk/2007/10/08/uml_not_magic_bullet/"&gt;not only me&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;In theory, the feature could display a messy body of source code as messy diagrams. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;The problem with reverse-engineering is that diagrams have the same level of abstraction as original code. If we add into mix the fact that diagrams are more cumbersome than source code, we receive less efficient representation of what we already have in the code. Why we need that?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;I have seen two roles of UML where UML might be useful in the projects:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;ol style="margin-top: 0cm; text-align: justify;" start="1" type="1"&gt;&lt;li class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;UML can be used to document important      parts of the application. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;UML could be use as substrate      for domain specific language.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;Reverse-engineering offers a little for the both of uses. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;As documenting usually comes before implementing, there is a little to reverse-engineer when we creating the docs.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;When the code is generated from UML-based DSL, mapping is usually one-to-many and mapping functions are not easily reversible. Therefore changing one element in UML model affects many places in source code. And even the code structure could change depending on the changes (consider changing multiplicity of the attribute in OR-mapping). This complicates creation of reverse engineering tools greatly. So there are usually no reverse-engineering for DSLs.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;One of few cases where it was at least marginally useful was JBuilder’s UML view of the currently selected class. This view were somewhat convenient when get an idea of what is used by the class. However there was no significant advantage over outline view and Ctrl-LEFT_CLICK&lt;left&gt; in Eclipse.&lt;o:p&gt;&lt;/o:p&gt;&lt;/left&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2376322310829911769-859383519327452520?l=constantine-plotnikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://constantine-plotnikov.blogspot.com/feeds/859383519327452520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2376322310829911769&amp;postID=859383519327452520' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/859383519327452520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/859383519327452520'/><link rel='alternate' type='text/html' href='http://constantine-plotnikov.blogspot.com/2007/10/what-is-value-of-reverse-and-round-trip.html' title='What is a value of reverse and round-trip engineering in UML tools?'/><author><name>const</name><uri>http://www.blogger.com/profile/14198516934017644045</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-2376322310829911769.post-543121015484178955</id><published>2007-10-03T11:11:00.000-07:00</published><updated>2008-01-19T12:36:50.299-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='runt'/><category scheme='http://www.blogger.com/atom/ns#' term='blogspot'/><title type='text'>Blogspot autoformatting</title><content type='html'>&lt;div style="text-align: justify;"&gt;I have not blogged on blogspot for some time.&lt;br /&gt;&lt;br /&gt;And now there is a nasty surprise on it. There is no option to disable auto-formatting when creating HTML (at least in the Russian skin for blogger). Blogspot insisting on inserting the pesky "&amp;lt;br&amp;gt;" in source where there is a newline in the html source.&lt;br /&gt;&lt;br /&gt;I think that this is a bug.&lt;br /&gt;&lt;br /&gt;When the user chooses to edit html instead of rich text is expected that the user knows html and that the user wants to create something better than the not-so-nice html generated by "create" option. So there must be an option to disable the questionable "helper".&lt;br /&gt;&lt;br /&gt;The generated html is so problematic that it displays differently on the comments page. For example unordered lists are broken.&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/2376322310829911769-543121015484178955?l=constantine-plotnikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://constantine-plotnikov.blogspot.com/feeds/543121015484178955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2376322310829911769&amp;postID=543121015484178955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/543121015484178955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/543121015484178955'/><link rel='alternate' type='text/html' href='http://constantine-plotnikov.blogspot.com/2007/10/blogspot-autoformatting.html' title='Blogspot autoformatting'/><author><name>const</name><uri>http://www.blogger.com/profile/14198516934017644045</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-2376322310829911769.post-4615662360899369150</id><published>2007-10-03T10:45:00.001-07:00</published><updated>2007-10-03T11:30:04.613-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='static typing'/><category scheme='http://www.blogger.com/atom/ns#' term='big'/><category scheme='http://www.blogger.com/atom/ns#' term='generics'/><category scheme='http://www.blogger.com/atom/ns#' term='dynamic typing'/><title type='text'>Static vs. dynamic typing</title><content type='html'>&lt;div style="text-align: justify;"&gt;Several people that I somewhat respect blogged how good dynamic typing is and how restrictive static typing is. I feel uncomfortable about as I see how well static typing could facilitate software development process.&lt;br /&gt;&lt;br /&gt;I do not see it as restricting.&lt;br /&gt;&lt;br /&gt;I see it as facilitating.&lt;br /&gt;&lt;br /&gt;I do not argue with that good programs could be written using dynamically typed languages. A plenty has been already written. And there are quite a lot of awful programs written using statically typed languages.&lt;br /&gt;&lt;br /&gt;I also do not argue with that dynamically typed programs are usually simpler to type, since that there is less to type.&lt;br /&gt;&lt;br /&gt;However programs exist not just for being executed. There are other tools that need to read the program beyond compiler or interpreter. There are other humans that need to read the program. And the human that will wear your skin will be other human in a year or so if you worth anything as programmer. So when writing programs, you need to address that future you as well.&lt;br /&gt;&lt;br /&gt;The type is a specification of the value expected to be. The compiler (or interpreter) checks that these specifications are consistent. It also can optimize basing on these specifications at own leisure.&lt;br /&gt;&lt;br /&gt;However other tools are able to use these specifications as well. If we take Eclipse Java IDE, there are following facilities that jump to mind when I think about static typing:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Refactoring&lt;/li&gt;&lt;li&gt;Navigation to type definition&lt;/li&gt;&lt;li&gt;Incremental compilation and error checking as code is typed&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;APT-based code generation is another example of how static typing information could be used.&lt;br /&gt;&lt;br /&gt;And this is possible even with as broken type system as Java's is.&lt;br /&gt;&lt;br /&gt;Humans also benefit from type annotations. Type information communicates (albeit incompletely) a contract of the component. The expected kind of value is specified in a standard place and in a standard way. If type annotations are missing, this information would have been communicated anyway, but other means were used (for example, comments).&lt;br /&gt;&lt;br /&gt;Most dynamically typed languages that I know support optional type annotations. Some typing information could be inferred basing on source code in dynamically typed languages. However, such inference will be incomplete, and that will limit tools and understandability of the programs. For example, refactoring will not work reliably.&lt;br /&gt;&lt;br /&gt;Another issue is that Java requires too much type annotations even in places where such information could be easily derived (for example, collection for and final variables). Generics in Java are hopeless broken as well, but I have already ranted about it.&lt;br /&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/2376322310829911769-4615662360899369150?l=constantine-plotnikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://constantine-plotnikov.blogspot.com/feeds/4615662360899369150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2376322310829911769&amp;postID=4615662360899369150' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/4615662360899369150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/4615662360899369150'/><link rel='alternate' type='text/html' href='http://constantine-plotnikov.blogspot.com/2007/10/static-vs-dynamic-typing.html' title='Static vs. dynamic typing'/><author><name>const</name><uri>http://www.blogger.com/profile/14198516934017644045</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-2376322310829911769.post-4615365049306619820</id><published>2007-04-28T10:04:00.000-07:00</published><updated>2007-04-28T12:26:52.461-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='asynchronous programming'/><category scheme='http://www.blogger.com/atom/ns#' term='pet project'/><title type='text'>AsyncObjects 0.1.0 finally out</title><content type='html'>After long time and some pain I have released an updated version of the &lt;a href="http://asyncobjects.sourceforge.net/"&gt;the AsyncObjects framework&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The frameworks has been worked upon mostly in the context of &lt;a href="http://sebyla.sf.net/"&gt;the Sebyla project&lt;/a&gt;. It is a blatant rip off of ideas of &lt;a href="http://www.erights.org/"&gt;E programming language&lt;/a&gt;. Initially, it was created just as prototype of some ideas for the Sebyla project back at 2002. And I have tried some new ideas in it form time to time. I have even ported the thing to Java 5, and I have learned in process how thin the layer of generics in Java is.&lt;br /&gt;&lt;br /&gt;For some weird reason, nothing similar had appeared during five years of the framework life.&lt;br /&gt;&lt;br /&gt;Then there was a project that might have used the framework. However it would have used the framework on Foundation Profile 1.1 runtime. So I partially took old version and and partially removed generics from new version and I have put into the separate project that is currently the home of the framework. Alas the project has been canceled just after the beginning. However I have done some work on the framework in context of that project. After that I have continued the work in my free time. However the framework was a low priority project for me, so the progress was glacially slow. There is &lt;a href="http://sf.net/projects/etl"&gt;a higher priority personal project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now there is yet another project that might use the framework. And it already has a dependency on Java 5. The framework might experience yet another flip, now to Java 5. If this project won't happen, I guess I would need to advertise it on some wider forums.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2376322310829911769-4615365049306619820?l=constantine-plotnikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://constantine-plotnikov.blogspot.com/feeds/4615365049306619820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2376322310829911769&amp;postID=4615365049306619820' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/4615365049306619820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/4615365049306619820'/><link rel='alternate' type='text/html' href='http://constantine-plotnikov.blogspot.com/2007/04/asyncobjects-010-finally-out.html' title='AsyncObjects 0.1.0 finally out'/><author><name>const</name><uri>http://www.blogger.com/profile/14198516934017644045</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-2376322310829911769.post-7338432214851388970</id><published>2007-04-24T10:57:00.000-07:00</published><updated>2007-04-24T11:14:12.108-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ETL'/><title type='text'>Ruby for text processing</title><content type='html'>In context of&lt;a href="http://sf.net/projects/etl"&gt; ETL&lt;/a&gt; project, I has ported a large Java class from old API to new API. I actually has done it twice to try two different implementation options. Since ported API had a very regular structure, I decided to try Ruby for this task. It worked pretty well. Ruby has a great text processing library. The method gsub!() that invokes a closure to perform text substitution when using regular expression has saved me a lot of efforts. This allows quite complex transformations just in the place where it is needed.&lt;br /&gt;&lt;br /&gt;I'm not sure whether I saved efforts or I would have faster done it manually. I do not know Ruby very well after all. But surely, the process was more enjoyable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2376322310829911769-7338432214851388970?l=constantine-plotnikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://constantine-plotnikov.blogspot.com/feeds/7338432214851388970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2376322310829911769&amp;postID=7338432214851388970' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/7338432214851388970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/7338432214851388970'/><link rel='alternate' type='text/html' href='http://constantine-plotnikov.blogspot.com/2007/04/ruby-for-text-processing.html' title='Ruby for text processing'/><author><name>const</name><uri>http://www.blogger.com/profile/14198516934017644045</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-2376322310829911769.post-1735071516362737745</id><published>2007-02-28T05:42:00.000-08:00</published><updated>2007-04-24T11:17:48.284-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JDO'/><category scheme='http://www.blogger.com/atom/ns#' term='persistence'/><category scheme='http://www.blogger.com/atom/ns#' term='big'/><category scheme='http://www.blogger.com/atom/ns#' term='OODBMS'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Software system longevity paradigms</title><content type='html'>Software systems functionality often needs to survive changes like hardware and software failures, version upgrades, and system reimplementation.&lt;br /&gt;&lt;br /&gt;There are two basic paradigms in providing this property: intentional and orthogonal. The differences between these two paradigms might look insignificant at first sight, but they lead to different properties of the products. I have an obvious bias in favor of intentional paradigm.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Saving State - Orthogonal Paradigm&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In this paradigm the application state is saved. Saved artifacts are considered as based on the application. The saved state might be the entire application state or just a part of it. This functionality is often considered as orthogonal to other application functionality. A programmer working in this paradigm generally does not want to care if it is working with persistent objects or not. The features of persistence layer that leaks to application layer are often considered as sad facts of life and framework clutter.&lt;br /&gt;&lt;br /&gt;The basic principle is that the entire software system survives because each application (or at least an important part of it) survives.&lt;br /&gt;&lt;br /&gt;There are a lot of systems that use this paradigm.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;MS Office file formats&lt;/li&gt;&lt;br /&gt;&lt;li&gt;OS hibernate&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Java object serialization&lt;/li&gt;&lt;br /&gt;&lt;li&gt;CapROS&lt;/li&gt;&lt;br /&gt;&lt;li&gt;JDO 1.0&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Most of object databases&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Some of these technologies can be also used in the context of the intentional paradigm. But they are designed in the context of the orthogonal paradigm.&lt;br /&gt;&lt;br /&gt;This paradigm has many features that make it attractive in the eyes of the developer. It is very simple to start using. An existing application object is just marked as persistent. So a developer does not have to learn a new technology.&lt;br /&gt;&lt;br /&gt;The fundamental "feature" of this paradigm is that it assumes that the application does not change significantly during its life cycle. Problems surface when this assumption is invalidated. When the application evolves, it is hard to migrate data to a new version application. It is even harder to use data from other applications. Particularly if another programming language is used.&lt;br /&gt;&lt;br /&gt;Problems of Java object serialization are relatively well documented. For example, almost each swing component JavaDoc file states that successful deserialization in other version of Java is unlikely.&lt;br /&gt;&lt;br /&gt;JDO 1.0 changes semantics of Java objects using enhancer tool. This causes a number of interesting problems. On source level, objects look the same as they were before they we made persistent. Theoretically it could save a programmer from changing the code that had previously worked with these objects. However the behavior of the objects changes in the number of ways. Among other things, the tool replaces field access instructions with method calls. And if fields are public, it requires changes of persistent classes and client classes. The places that previously could not have been throwing an exception, now can throw an exception. Reflection stops to work because there are no more such fields in the class.&lt;br /&gt;&lt;br /&gt;The problems of other products created in orthogonal persistence paradigm are also well documented. The hibernate functionality of operating systems possibly one of few places where the paradigm is applicable and quite natural. In this case it sometimes fails mostly because hardware and drivers are not quite ready for it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Accessing Data - Intentional Paradigm&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In this paradigm the application works with data that have life time longer than application's one. The application is considered to be dependent on the data rather than reverse as in orthogonal paradigm. This is paradigm looks more natural to me as the thing with shorter lifetime depends on the thing with longer lifetimes. Working with persistent data is considered as part of application functionality and constructs specific to persistence layers (like transactions) are considered as an essential part of application logic rather than unnecessary clutter.&lt;br /&gt;&lt;br /&gt;The basic principle is that we ensure that the data survives, and an application is a transient thing anyway. It could die any time. Upon restart it will be able to work with the data again. Some data could be lost, but this is a known risk that should have been calculated.&lt;br /&gt;&lt;br /&gt;There are a lot of systems that use this paradigm.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Relational and SQL databases&lt;br /&gt;&lt;/li&gt;&lt;li&gt;File systems&lt;br /&gt;&lt;/li&gt;&lt;li&gt;OASIS Open Document Format&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Java XML Binding&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Products created in the context of the intentional paradigm are usually a bit harder to use because the code that works with persistent state is aware of this fact. There is no attempt to create an illusion that these objects are just local to the application.&lt;br /&gt;&lt;br /&gt;However, because of this, there are no problems related to the situation when an illusion breaks. The decisions related to persistence are explicit and they are part of the application logic.&lt;br /&gt;&lt;br /&gt;If data is considered as separate thing from the application from the start, the features like upgradeability, support for multiple applications, and for legacy versions of the application come relatively naturally.&lt;br /&gt;&lt;br /&gt;I think that the orthogonal paradigm is suitable only in cases of short lived data that can be written and read by the single version of the single application. There are quite a lot of such situations. But if such paradigms quickly fails in the case of modern EIS where applications are created, replaced (and often by rewriting them in another programming language), changed, and retired. And this is possibly one of most significant reasons why OODBMS (which are mostly developed in the context of the orthogonal paradigm) failed to overtake SQL databases (which are developed in the context of the intentional paradigm) in EIS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2376322310829911769-1735071516362737745?l=constantine-plotnikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://constantine-plotnikov.blogspot.com/feeds/1735071516362737745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2376322310829911769&amp;postID=1735071516362737745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/1735071516362737745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/1735071516362737745'/><link rel='alternate' type='text/html' href='http://constantine-plotnikov.blogspot.com/2007/02/software-system-longevity-paradigms.html' title='Software system longevity paradigms'/><author><name>const</name><uri>http://www.blogger.com/profile/14198516934017644045</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-2376322310829911769.post-8971684624094810664</id><published>2007-02-26T06:56:00.000-08:00</published><updated>2007-04-24T11:19:08.586-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='big'/><category scheme='http://www.blogger.com/atom/ns#' term='generics'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Java 5 vs. .NET 2.0 generics: past vs. future</title><content type='html'>There is a thing that struck me out about Java 5 vs. .NET 2.0 generics.&lt;br /&gt;&lt;br /&gt;Major design constraint for the generics in Java 5 was the backward compatibility. Much of the statically available information related to generics is not retained in the byte code. It is erased during a compilation process. The generics become sort of consistent with the rest of the language. There is even ability to retrofit old API to the new language features as it could be seen from the collection framework.&lt;br /&gt;&lt;br /&gt;As result, the generics in Java 5 cause a kind of "fake" feeling. There are a lot of things that cannot be done using Java 5 generics which are desirable. For example, a instance of a generic class cannot learn about arguments with which it was created. Some awkward constructs like "&lt;span style="font-family:courier new;"&gt;((ArrayList&amp;lt;String&amp;gt;)(Object)(new ArrayList&amp;lt;Integer&amp;gt;())).add("Test")&lt;/span&gt;" do not create a runtime exception (the compiler honestly warns that there might be a problem).&lt;br /&gt;&lt;br /&gt;However by doing so, Java was positioned as a "legacy" language where the burden of the past outweights needs of the future development.&lt;br /&gt;&lt;br /&gt;In .NET 2.0, the generics were added as a new feature. It looks like the backward compatibility was not a major constraint during the development. It is a bit facilitated since new collections also implement untyped collections interfaces. However unlike Java 5 counterparts, .NET 2.0 generics do need invoking the backward compatibility argument for explaining weird features. They are much cleaner. So generics in .NET 2.0 looks like mostly motivated by their future use.&lt;br /&gt;&lt;br /&gt;On other hand, it is puzzle to me why generics did not make into .NET 1.0. Lack of generics was well documented problem of Java. And .NET framework IS primarily inspired by Java (it was quite funny to read some MS documents that discuss C# and very carefully avoid mentioning Java and mentioning such remote languages as as C). And many fundamental Java language problems were fixed in .NET. This one belongs exquisite group of language problems that .NET designers chosen to reproduce. I kinda understand time-to-market arguments. But I do not believe that few additional months would have made a difference here. Many Java proposals for generics were on the table for long time, and it was possible to select a good one from the start. At least it would have saved them from the shame of CodeDom API.&lt;br /&gt;&lt;br /&gt;So it looks like Java position itself as legacy language and .NET as an actively developed language runtime. It might be explained by the fact that the Java had much longer past than .NET. However it does not bode well for Java future. This is a possible reason why Sun started development of the new language called Fortress instead of adding needed features to Java. Open sourcing Java might break this self-image problem and cause implementing and trying more daring features in Java language, but I would not bet on it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2376322310829911769-8971684624094810664?l=constantine-plotnikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://constantine-plotnikov.blogspot.com/feeds/8971684624094810664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2376322310829911769&amp;postID=8971684624094810664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/8971684624094810664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/8971684624094810664'/><link rel='alternate' type='text/html' href='http://constantine-plotnikov.blogspot.com/2007/02/java-5-vs-net-20-generics-past-vs.html' title='Java 5 vs. .NET 2.0 generics: past vs. future'/><author><name>const</name><uri>http://www.blogger.com/profile/14198516934017644045</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-2376322310829911769.post-3293539535535749641</id><published>2007-01-24T23:10:00.000-08:00</published><updated>2007-04-24T11:19:47.030-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='publications'/><category scheme='http://www.blogger.com/atom/ns#' term='JDJ'/><title type='text'>JDJ article availalbe</title><content type='html'>My first published article become &lt;a href="http://jdj.sys-con.com/read/313563.htm"&gt;available&lt;/a&gt; from JDJ web site some time ago. I cannot say that I'm completely satisfied by it.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It does not completely match the original idea and some important related things have been just mentioned in the final version because of size constraints.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The language and style are the result of difficult compromises between me and other author, so it could have been better and more consistent.&lt;/li&gt;&lt;li&gt;Also almost all references has been cut out during internal review cycle "because other articles on the site do not  do it". I personally prefer articles that mention its sources.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;But it was the first article that I have written myself and overall working on it was a good experience.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2376322310829911769-3293539535535749641?l=constantine-plotnikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://constantine-plotnikov.blogspot.com/feeds/3293539535535749641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2376322310829911769&amp;postID=3293539535535749641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/3293539535535749641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2376322310829911769/posts/default/3293539535535749641'/><link rel='alternate' type='text/html' href='http://constantine-plotnikov.blogspot.com/2007/01/jdj-article-availalbe.html' title='JDJ article availalbe'/><author><name>const</name><uri>http://www.blogger.com/profile/14198516934017644045</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>
