<?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:blogger='http://schemas.google.com/blogger/2008' 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-10728539</id><updated>2024-03-23T18:43:51.912+01:00</updated><title type='text'>idea.log</title><subtitle type='html'>Ideas and opinions from a programmer at &lt;a href=&quot;http://www.jetbrains.com/&quot;&gt;JetBrains&lt;/a&gt;.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default?alt=atom'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default?alt=atom&amp;start-index=26&amp;max-results=25'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10728539.post-117589250102663958</id><published>2007-04-06T22:37:00.000+02:00</published><updated>2007-04-06T22:48:21.046+02:00</updated><title type='text'>IntelliJ IDEA is the &quot;best HTML editor in the world&quot;</title><content type='html'>Patrick Lightbody calls &lt;a href=&quot;http://www.jetbrains.com/idea/?java_r&quot;&gt;IntelliJ IDEA&lt;/a&gt; the &quot;&lt;a href=&quot;http://blogs.opensymphony.com/plightbo/2007/04/idea_really_is_that_good.html&quot;&gt;best HTML editor in the world&lt;/a&gt;&quot;. Strange. You would think that he meant best &lt;i&gt;Java&lt;/i&gt; editor, or that he would have picked a dedicated HTML editor. But no, he is very clear:&lt;br /&gt;&lt;blockquote&gt;This is not an understatement. Ruby-fanatics even admit their beloved TextMate has nothing on IDEA (right Dion?). Heck, at my company, our VP of Marketing (who gets hands-on w/ web design) now uses IDEA and swears by it. Why? Because it speaks fluent CSS, HTML, and JavaScript. And all those nice inspections work here too. It&#39;ll highlight unused CSS declarations. It&#39;ll help you find usages for JS functions and CSS classes. It&#39;ll even point out the fact that &quot;0px&quot; is redundant and can simply be &quot;0&quot;... and you don&#39;t have to delete &quot;px&quot;... remember, just press Alt-Enter!&lt;/blockquote&gt;&lt;br /&gt;In fact, he&#39;s right! And he&#39;s not the first to notice. This year, &lt;a href=&quot;http://www.joltawards.com/2007/&quot;&gt;IntelliJ IDEA won a Jolt Productivity Award&lt;/a&gt; in a new category, under Web Development, at least in part due to its &lt;a href=&quot;http://www.jetbrains.com/idea/features/html_css_editor.html?java_r&quot;&gt;HTML-editing features&lt;/a&gt;. (Check out the &lt;a href=&quot;http://www.jetbrains.com/idea/features/javascript_editor.html?java_r&quot;&gt;Javascript&lt;/a&gt; and &lt;a href=&quot;http://www.jetbrains.com/idea/features/ruby_development.html?java_r&quot;&gt;Ruby&lt;/a&gt; support as well....)&lt;br /&gt;&lt;br /&gt;The trick is that IDEA is not just dedicated to Java, it has a code-centric architecture that can enhance any language in an intelligent way, including editing, refactoring, code search, navigation, inspections, code highlighting, and formatting. On top of this architecture is the &lt;a href=&quot;http://www.jetbrains.com/idea/plugins/developing_custom_language_plugins.html?java_r&quot;&gt;Language API&lt;/a&gt;, which allows any language (e.g. Ruby, SQL, etc.) to be plugged in to benefit from these productivity features. Of course, the real beauty of web development with IDEA is the ability of all the languages to work together. Got a JSP page with embedded HTML, CSS, and Javascript? No problem! It all works.&lt;br /&gt;&lt;br /&gt;The IntelliJ philosophy is this: Programmers spend most of their time working with code, so the IDE should be as intelligent about code as possible. That&#39;s why we have a dedicated code-centric architecture to handle any language a Java programmer might need to tackle. It is also why &lt;a href=&quot;http://www.jetbrains.com/idea/?java_r&quot;&gt;IntelliJ IDEA&lt;/a&gt; is not only the best Java editor, but the best HTML editor, too.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/117589250102663958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/117589250102663958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117589250102663958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117589250102663958'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2007/04/intellij-idea-is-best-html-editor-in.html' title='IntelliJ IDEA is the &quot;best HTML editor in the world&quot;'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-117491294115361807</id><published>2007-03-26T15:32:00.000+02:00</published><updated>2007-03-26T15:42:21.226+02:00</updated><title type='text'>Rediscovering Refactorings</title><content type='html'>Michael Feathers wrote a &lt;a href=&quot;http://www.artima.com/weblogs/viewpost.jsp?thread=198698&quot;&gt;blog&lt;/a&gt; listing some of the refactorings he would like to see in IDEs. Two refactorings in particular caught my eye, Extract Class and Introduce Parameter Object. In fact, these refactorings have been available for quite some time via a third-party plugin for &lt;a href=&quot;http://www.jetbrains.com/idea/?java_r&quot;&gt;IntelliJ IDEA&lt;/a&gt; called &lt;a href=&quot;http://www.sixthandredriver.com/refactor-j.html&quot;&gt;Refactor-J&lt;/a&gt;, from &lt;a href=&quot;http://www.sixthandredriver.com/index.html&quot;&gt;Sixth &amp; Red River Software&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Introduce Parameter Object is great for simplifying a long parameter list by condensing several parameters into a single parameter object. This can be a great way to clean up your design to make it easier to use, easier to read and comprehend, and easier to maintain. Parameter objects can stay as simple value objects, or they can evolve into something more intelligent, as needed.&lt;br /&gt;&lt;br /&gt;Michael&#39;s request also includes that any arbitrary group of variables (fields or local variables) could also be converted into aggregate objects. If it is possible to implement, I&#39;d like to see this as well. It could potentially be a very useful refactoring, allowing you to quickly sketch out the collaborating classes your design may need. Just start with basic ints and Strings and build your object-oriented design from that.&lt;br /&gt;&lt;br /&gt;If you regularly do complex refactorings, or if you just happen to want more power out of refactoring, I suggest looking into the &lt;a href=&quot;http://www.sixthandredriver.com/refactor-j.html&quot;&gt;Refactor-J&lt;/a&gt; plugin. It has about 20 extra refactorings in total. Also, for more &#39;personalized&#39; refactorings, you can always use the built-in &lt;a href=&quot;http://www.jetbrains.com/idea/documentation/ssr.html?java_r&quot;&gt;Structural Search &amp;amp; Replace&lt;/a&gt; feature of IDEA. It takes a little getting used to, and it cannot do all kinds of refactoring, but it is often the best way to make refactoring-like changes to your code that cannot already be made with existing refactorings.&lt;br /&gt;&lt;br /&gt;At the end of his post, Michael asks for what he calls &#39;intelligent statement move&#39;. Well, unfortunately what he&#39;s asking for is not likely to be seen for a while, but with a sufficient suite of unit tests, the basic Move Statement Up/Down editor command (Ctrl-Shift-Up/Down) is sufficient for most purposes. It can even move syntactically correct blocks of code (you can select sytactic blocks with Ctrl-W), or even whole methods.&lt;br /&gt;&lt;br /&gt;Have you ever dreamed up any special refactorings you would like to see in your IDE?</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/117491294115361807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/117491294115361807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117491294115361807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117491294115361807'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2007/03/rediscovering-refactorings.html' title='Rediscovering Refactorings'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-117396834919257324</id><published>2007-03-15T16:02:00.000+01:00</published><updated>2007-03-15T16:19:09.213+01:00</updated><title type='text'>Productivity Talks at JHUG Tech Day</title><content type='html'>Last Saturday I gave a talk at the &lt;a href=&quot;http://www.jhug.gr/&quot;&gt;Java Hellenic User Group&lt;/a&gt;, and I found it interesting that all of the talks given there had an underlying motivation of increasing productivity.&lt;br /&gt;&lt;br /&gt;First was Dr. Heinz Kabutz, the famous Java Champion and editor of the &lt;a href=&quot;http://www.javaspecialists.co.za/&quot;&gt;Java Specialist newsletter&lt;/a&gt;, who had a talk called Productive Coder. It was a good talk to start the day because he gets you thinking right away about seeing things from a productivitiy perspective. For instance, his first major point is that most programmers that he has met cannot even touch-type without looking at the keyboard. It seems like such a minor thing, but by learning the keyboard so well that it is intuitive, it&#39;s just more productive since you don&#39;t have to spend your awareness on the keyboard and can think of the task at hand instead. Heinz&#39; talk included many similar small-but-important ideas about becoming a more productive coder.&lt;br /&gt;&lt;br /&gt;He also showed a demo of &lt;a href=&quot;http://www.jetbrains.com/idea/?java_r&quot;&gt;IntelliJ IDEA&lt;/a&gt;, emphasizing learning the keyboard shortcuts for an IDE (even I learned a feature -- column editing mode, Alt-Shift-Insert). I think learning shortcut keys is in many ways like learning a new language. Once you&#39;ve learned one useful language, it&#39;s frustrating to try to get to the same fluency in another, unless you put some effort into it. This can make switching IDEs painful. Heinz mentioned the IntelliJ IDEA keymap reference card you can print out and stand up on your desk to help you learn the shortcuts (see &lt;a href=&quot;http://www.jetbrains.com/idea/documentation/documentation.html?java_r&quot;&gt;here&lt;/a&gt;). He also talked about object-oriented principles and how to tame a jungle of legacy code with refactorings like Encapsulate Fields, to make fields private.&lt;br /&gt;&lt;br /&gt;Tom Baeyens of JBoss/RedHat did a talk on workflows and process languages. Part of the motivation there is to simplify and automate communication between the analyst and the programmer, an attempt to increase productivity in this area. Tom has a great sense of humour and I enjoyed his talk very much.&lt;br /&gt;&lt;br /&gt;Patrick Linskey of BEA talked about JPA (Java Persistence API), and how a big motivation is to simplify object-relational mapping, automating it, so you can think in higher level concepts of objects rather than tables. Of course the flexibility is there to use tables if necessary, but the real power of the spec is in ease of use and testability that the object abstraction gives you. Patrick was extremely knowledgeable, as we could tell during the Q&amp;A. &lt;br /&gt;&lt;br /&gt;Finally, my talk was on Tools for Agile Teams, focusing on how &lt;a href=&quot;http://www.jetbrains.com/idea/?java_r&quot;&gt;IntelliJ IDEA&lt;/a&gt; and &lt;a href=&quot;http://www.jetbrains.com/teamcity/?java_r&quot;&gt;TeamCity&lt;/a&gt; support agile development methodologies by helping developers stay in &lt;a href=&quot;http://en.wikipedia.org/wiki/Flow_%28psychology%29&quot;&gt;flow&lt;/a&gt; longer and more often. Flow is the highly productive state of mind when you&#39;re focused on a task and outside distractions seem to melt away. Most people in the audience reported that they had experienced the state of flow and also that they have experienced being frustrated by tools that interfere with flow by annoying distractions and context switches. I demoed some of IntelliJ IDEA&#39;s productivity features and gave an overview demo of how the TeamCity continuous-integration server can help increase team-level productivity.&lt;br /&gt;&lt;br /&gt;Thanks to Paris Apostolopoulos and Panos Konstantinidis of the JHUG for organizing the event. It went very well and was quite enjoyable.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/117396834919257324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/117396834919257324' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117396834919257324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117396834919257324'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2007/03/productivity-talks-at-jhug-tech-day.html' title='Productivity Talks at JHUG Tech Day'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-117277866376568619</id><published>2007-03-01T19:06:00.000+01:00</published><updated>2007-03-12T12:13:59.763+01:00</updated><title type='text'>TheServerSide asks the right questions</title><content type='html'>Some IDE surveys are just simple popularity contests. Not &lt;a href=&quot;http://efm.ttresearch.com/se.ashx?s=2E3662CE3DD1BE91&quot;&gt;this one&lt;/a&gt;. This survey from &lt;a href=&quot;http://www.theserverside.com/&quot;&gt;TheServerSide.com&lt;/a&gt;, has much smarter questions, and I&#39;m really looking forward to the results!&lt;br /&gt;&lt;br /&gt;For instance, instead of just asking which IDE you use, it splits it up into which IDE the organization uses as standard, and which IDE you personally use.&lt;br /&gt;&lt;br /&gt;Some organizations impose a particular IDE on all the developers because of an &#39;organizational standard&#39;. Such standards might be good for something like databases and servers, but I hardly think it makes sense to &lt;b&gt;force&lt;/b&gt; a developer to use an IDE that he or she is not productive in. Developer productivity often trumps the relatively small cost-savings of standardization. If you save $1,000 a month by standardizing, but the IDE you choose makes your 10 programmers even 5% less productive, you&#39;re actually losing a big chunk of money there, since the lost productivity is closer to $5,000 per month.&lt;br /&gt;&lt;br /&gt;Also, professional programmers &lt;b&gt;like&lt;/b&gt; being productive and, given the choice, most of them would choose the one that makes them more productive rather than being forced to use an organizational standard. One of the interesting questions in the survey is &quot;If you do not directly choose your IDE, which one would you prefer to use?&quot; I definitely want to see the results there! I expect to see a lot of cases of organizations standardizing on a particular IDE, but some of their developers wishing they could use a different IDE. IDE choice is often a personal thing, and hopefully this survey will help people realize that.&lt;br /&gt;&lt;br /&gt;Of course, the questions aren&#39;t perfect, although they are definitely a step in the right direction. One of the questions asks, &quot;Which three features do you value most in an IDE?&quot; While this is a good start, it completely ignores that things like &#39;productivity&#39; and &#39;usability&#39; are not features, but they can &lt;i&gt;easily&lt;/i&gt; be the most important thing people value in an IDE. It is very common to hear fans of &lt;a href=&quot;http://www.jetbrains.com/idea/?java_r&quot;&gt;IntelliJ IDEA&lt;/a&gt; say things like, &quot;There&#39;s no particular feature I can point to, it&#39;s just that all the features just seem to work better.&quot; I hope to see surveys in the future that tackle the importance of intangibles like usability, intelligence, and productivity.&lt;br /&gt;&lt;br /&gt;Check out the survey &lt;a href=&quot;http://efm.ttresearch.com/se.ashx?s=2E3662CE3DD1BE91&quot;&gt;here&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/117277866376568619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/117277866376568619' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117277866376568619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117277866376568619'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2007/03/theserverside-asks-right-questions.html' title='TheServerSide asks the right questions'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-117258687600941498</id><published>2007-02-27T15:23:00.000+01:00</published><updated>2007-03-08T18:02:48.186+01:00</updated><title type='text'>BDD and the Power of Metaphor</title><content type='html'>I read an &lt;a href=&quot;http://blog.objectmentor.com/articles/2007/02/01/specs-vs-tests&quot;&gt;interesting article by &quot;Uncle&quot; Bob Martin&lt;/a&gt; talking about Behaviour Driven Development (BDD). Since I hadn&#39;t heard of it before, I decided to scratch the surface and see what I could find. One of the nuggets I found was a &lt;a href=&quot;http://blog.daveastels.com/files/BDD_Intro.pdf&quot;&gt;PDF by Dave Astels&lt;/a&gt; expressing his frustration about how no one seems to get Test Driven Development (TDD) right:&lt;br /&gt;&lt;blockquote&gt;&quot;Everyone who&#39;s doing TDD is fully understanding it and getting the full benefit, right? &lt;i&gt;Fat Chance!&lt;/i&gt; Too few people I talk to really understand what it&#39;s really about. That means that many people who practice TDD are not getting the full benefit from it.&quot;&lt;br /&gt;...&lt;br /&gt;&quot;The thing is, when the evolution to TDD happened what we ended up with was a different kind of animal... not just a slight tweak on the original.&quot;&lt;br /&gt;...&lt;br /&gt;&quot;So, there you have it. A fabulous idea... wrapped in packaging that causes people to think from a testing point of view.&quot;&lt;br /&gt;...&lt;br /&gt;&quot;So if it&#39;s not about testing, what&#39;s it about? It&#39;s about figuring out what you are trying to do before you run off half-cocked to try to do it.&quot;&lt;/blockquote&gt;Digging a little deeper, it turns out that Dan North has been having these ideas for a while and he writes a &lt;a href=&quot;http://dannorth.net/introducing-bdd/&quot;&gt;nice introduction to behaviour-driven development&lt;/a&gt;. I recommend it highly, as it clearly lays out the motivation for BDD. This &lt;a href=&quot;http://behaviour-driven.org/Introduction&quot;&gt;introduction to BDD&lt;/a&gt; is also a good place to start.&lt;br /&gt;Basically, BDD is taking TDD closer to specifications rather than tests. Well, executable specifications, so they remain tests, just look and sound more like specifications. In essence, it&#39;s not really a new technique per se, but a new way of thinking about, designing, and organizing tests.&lt;br /&gt;&lt;br /&gt;What I find interesting is that one of the main motivations is &lt;a href=&quot;http://behaviour-driven.org/GettingTheWordsRight&quot;&gt;&#39;getting the words right&#39;&lt;/a&gt;, which is exactly what I was thinking when I wrote a blog called &lt;a href=&quot;http://idea-log.blogspot.com/2005/10/why-are-continuations-so-confusing-and.html&quot;&gt;&quot;Why Are Continuations So Confusing, and What Do They Really Do?&quot;&lt;/a&gt;. My gripe was that the word &#39;continuation&#39; doesn&#39;t actually help you to understand what a continuation really is, and I proposed thinking instead in terms of &#39;execution sites&#39;. For me, that metaphor works much better, just as the metaphor of specifying behaviour is better than the metaphor of unit testing.&lt;br /&gt;&lt;br /&gt;Metaphor and analogy are powerful tools of understanding and insight, &lt;b&gt;if&lt;/b&gt; you can find a useful connection. Earlier this week I blogged about the connection shared by &lt;a href=&quot;http://idea-log.blogspot.com/2007/02/faster-feedback-and-why-you-want-it.html&quot;&gt;TDD and continuous integration (CI)&lt;/a&gt;, showing that they are both part of the same agile trend towards faster and faster feedback on quality (TDD at the programmer-level and CI at the team-level). Now with this whole BDD thing, I wonder what kinds of insights and connections BDD can bring to CI and vice versa. Maybe part of the job of developing &lt;a href=&quot;http://www.jetbrains.com/teamcity/?java_r&quot;&gt;TeamCity&lt;/a&gt; will be to develop a new vocabulary for continuous integration.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/117258687600941498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/117258687600941498' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117258687600941498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117258687600941498'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2007/02/bdd-and-power-of-metaphor.html' title='BDD and the Power of Metaphor'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-117223341419187136</id><published>2007-02-23T12:59:00.000+01:00</published><updated>2007-02-23T13:23:34.330+01:00</updated><title type='text'>Why IntelliJ IDEA Customers Keep Coming Back</title><content type='html'>Brian Pontarelli has a passion for the keyboard and makes some &lt;a href=&quot;http://brian.pontarelli.com/2007/02/15/why-intellij-will-always-win/&quot;&gt;good points about usability and support&lt;/a&gt; in regards to Java IDEs, specifically &lt;a href=&quot;http://www.jetbrains.com/idea/?java_r&quot;&gt;IntelliJ IDEA&lt;/a&gt; and &lt;a href=&quot;http://www.eclipse.org/&quot;&gt;Eclipse&lt;/a&gt;. The &lt;a href=&quot;http://brian.pontarelli.com/2007/02/15/why-intellij-will-always-win/#comment-3121&quot;&gt;comments&lt;/a&gt; after the main post are especially interesting, such as where some commenters argue over whether a reported issue counts as either a severe bug or a missing feature. I mean, come on. Does it really matter? The point is that it interferes with Brian&#39;s experience of usability and productivity. I&#39;ve been saying it for a while: It&#39;s not about feature lists, it&#39;s about usability and productivity. You won&#39;t find usability or productivity on a feature list, but it can easily be &lt;b&gt;the&lt;/b&gt; most important deciding factor on whether or not to choose one piece of software over another. JBuilder was marketed on the length of its feature list, and look where it got them.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/117223341419187136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/117223341419187136' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117223341419187136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117223341419187136'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2007/02/why-intellij-idea-customers-keep.html' title='Why IntelliJ IDEA Customers Keep Coming Back'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-117205712071852366</id><published>2007-02-21T12:05:00.000+01:00</published><updated>2007-02-21T12:25:20.893+01:00</updated><title type='text'>JDJ Readers&#39; Choice Awards</title><content type='html'>Just a reminder for folks to join in the voting at the &lt;a href=&quot;http://java.sys-con.com/general/readerschoice.htm&quot;&gt;Java Developers’ Journal Readers’ Choice Awards&lt;/a&gt;. &lt;a href=&quot;http://www.jetbrains.com/?java_r&quot;&gt;JetBrains&lt;/a&gt; has entries in several categories for &lt;a href=&quot;http://www.jetbrains.com/idea/?java_r&quot;&gt;IntelliJ IDEA&lt;/a&gt; and &lt;a href=&quot;http://www.jetbrains.com/teamcity/?java_r&quot;&gt;TeamCity&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www2.sys-con.com/webservices/readerschoice2004/frameliveupdate.cfm?BType=11&quot;&gt;Best IDE&lt;/a&gt;  - IntelliJ IDEA 6.0&lt;br /&gt;&lt;a href=&quot;http://www2.sys-con.com/mx/readerschoice2004/frameliveupdate.cfm?BType=3&quot;&gt;Best Web Development Tool&lt;/a&gt;  - IntelliJ IDEA 6.0&lt;br /&gt;&lt;a href=&quot;http://www2.sys-con.com/java/readerschoice2004/frameliveupdate.cfm?BType=5&quot;&gt;Best Java Application&lt;/a&gt;  - IntelliJ IDEA 6.0&lt;br /&gt;&lt;a href=&quot;http://www2.sys-con.com/java/readerschoice2004/frameliveupdate.cfm?BType=13&quot;&gt;Best Java Debugging Tool&lt;/a&gt;  - IntelliJ IDEA 6.0&lt;br /&gt;&lt;a href=&quot;http://www2.sys-con.com/java/readerschoice2004/frameliveupdate.cfm?BType=4&quot;&gt;Best Java EE App Dev. Framework&lt;/a&gt;  - IntelliJ IDEA 6.0&lt;br /&gt;&lt;a href=&quot;http://www2.sys-con.com/java/readerschoice2004/frameliveupdate.cfm?BType=15&quot;&gt;Best Java IDE Environment &lt;/a&gt; - IntelliJ IDEA 6.0&lt;br /&gt;&lt;a href=&quot;http://www2.sys-con.com/java/readerschoice2004/frameliveupdate.cfm?BType=29&quot;&gt;Best Java Project Build Tool&lt;/a&gt;  - TeamCity 1.0&lt;br /&gt;&lt;a href=&quot;http://www2.sys-con.com/java/readerschoice2004/frameliveupdate.cfm?BType=23&quot;&gt;Best Team Development Tool &lt;/a&gt; - &quot;IntelliJ IDEA 6.0 / TeamCity 1.0&quot; Pack&lt;br /&gt;&lt;a href=&quot;http://www2.sys-con.com/java/readerschoice2004/frameliveupdate.cfm?BType=28&quot;&gt;Best Tool for Rich Internet Applications&lt;/a&gt;  - IntelliJ IDEA 6.0&lt;br /&gt;&lt;a href=&quot;http://www2.sys-con.com/java/readerschoice2004/frameliveupdate.cfm?BType=24&quot;&gt;Most Innovative Java Product&lt;/a&gt;  - TeamCity 1.0</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/117205712071852366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/117205712071852366' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117205712071852366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117205712071852366'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2007/02/jdj-readers-choice-awards.html' title='JDJ Readers&#39; Choice Awards'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-117199656743407059</id><published>2007-02-20T17:59:00.000+01:00</published><updated>2007-02-22T06:24:51.246+01:00</updated><title type='text'>Faster Feedback and Why You Want It: From TDD to CI and Beyond</title><content type='html'>I recently heard from someone in the industry that around 30-40% of teams are using &lt;a href=&quot;http://en.wikipedia.org/wiki/Test-driven_development&quot; rel=&quot;tag&quot;&gt;test-driven development&lt;/a&gt;, but only 5-10% of teams are using &lt;a href=&quot;http://www.martinfowler.com/articles/continuousIntegration.html&quot; rel=&quot;tag&quot;&gt;continuous integration&lt;/a&gt; servers. I&#39;m not sure how reliable those numbers are, but that&#39;s not important; what &lt;i&gt;is&lt;/i&gt; important is the general picture: Even the people who seem to understand the benefits of test-driven development don&#39;t seem to understand the benefits of continuous integration. I found that very puzzling, especially because I see continuous integration (CI) as a natural progression of test-driven development (TDD). They are, after all, part of the same trend of agile software development leading towards faster and faster feedback.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Oh, Waterfall...&lt;/b&gt;&lt;br /&gt;The trend goes all the way back to that dusty fossil of software development theory, the &lt;a href=&quot;http://en.wikipedia.org/wiki/Waterfall_model&quot;&gt;waterfall model&lt;/a&gt; and its fixed and rigid phases of: Analysis, Design, Coding, Integration, Testing (and Deployment and Maintenance, which I won&#39;t bother with here). The big problem with waterfall is that once something is planned at the beginning, it is set-in-stone and changing it becomes very expensive. Many projects would either fail by going over time or budget constraints, or by the death of a thousand cuts... the dreaded &lt;a href=&quot;http://en.wikipedia.org/wiki/Feature_creep&quot;&gt;Feature Creep&lt;/a&gt;. Clearly there needed to be a more flexible way to get the right plans up-front so that there would be no need for changes during development.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Spiralling Towards Agility&lt;/b&gt;&lt;br /&gt;This is the motivation for the &lt;a href=&quot;http://en.wikipedia.org/wiki/Spiral_model&quot;&gt;spiral model&lt;/a&gt;, with its repeated iterations of little waterfalls: Analysis, Design, Coding, Integration, and Testing, repeated several times until done. Of course, the spiral model&#39;s flexibility was complicated by too much reliance on planning and documentation, leading to the recent rise of agile methodologies which repeat that loop in ever smaller, but more frequent, iterations. Depending on the agile methodology you look at, sometimes it will treat a 1 month iteration as a mini-waterfall, and in other cases it will take this progression even further, even down to the level of a week or even a day, so that on any given day, a programmer might do a bit of Analysis, a bit of Design, a bit of Coding, a bit of Integration, and a bit of Testing.&lt;br /&gt;&lt;br /&gt;What is the meaning of this trend? The obvious answer is that it is a progression toward greater and greater flexibility. However, the proponents of test-driven development see flexibility as a side effect of a more important trend toward faster and faster feedback cycles. By seeing where things are going off-track earlier, you can make corrections to get things back on-track earlier. That is the source of flexibility; when a change or a new requirement comes up, fast feedback allows you to adjust to the new circumstances faster. So, faster feedback leads to greater flexibility.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A New Style&lt;/b&gt;&lt;br /&gt;TDD takes it to the next level, breaking the programming task into even smaller iterations, and simultaneously putting the primary feedback mechanism, testing, at the forefront. In fact, it kind of reverses the whole process, putting testing at the beginning of each iteration, rather than at the end. The goal of TDD is to use the feedback from unit-tests to actually &lt;i&gt;drive&lt;/i&gt; development. While this may seem counter-intuitive, when you realize that the goal is faster feedback, it actually makes sense because the sooner you have the test running, the sooner you are getting feedback from that test.&lt;br /&gt;&lt;br /&gt;If for no other reason, it is important for programmers to understand TDD because it opens up a new style of programming. Instead of starting by thinking about how to make a design for the task, the programmer thinks about what it would take for the task to be complete. By holding the mindset of &quot;tests first&quot;, this immediately requires breaking the task into much smaller sub-tasks because it is nearly impossible to write a high-level test from scratch. In fact, the only practical way to proceed is to start with very simple tests and build up from there. You need to think: &quot;What is the simplest test that will actually test something useful?&quot; In essence, we have shifted mindsets from being task-oriented to feedback-oriented.&lt;br /&gt;&lt;br /&gt;When you think in this mindset, you can actually reverse the normal programming process. &lt;b&gt;A&lt;/b&gt;nalysis, &lt;b&gt;D&lt;/b&gt;esign, &lt;b&gt;C&lt;/b&gt;oding, &lt;b&gt;I&lt;/b&gt;ntegration, &lt;b&gt;T&lt;/b&gt;esting (ADCIT) becomes &lt;b&gt;T&lt;/b&gt;esting, &lt;b&gt;I&lt;/b&gt;ntegration, &lt;b&gt;C&lt;/b&gt;oding, &lt;b&gt;D&lt;/b&gt;esign, &lt;b&gt;A&lt;/b&gt;nalysis (TICDA).&lt;br /&gt;But in order for this analogy to make sense, you need to think at a much lower level. The actual process goes something like this: Write a small &lt;b&gt;t&lt;/b&gt;est for some behaviour, compile and run the test to ensure that it fails (you can think of compiling as &#39;&lt;b&gt;i&lt;/b&gt;ntegration&#39; at this low level of coding), write some &lt;b&gt;c&lt;/b&gt;ode that will make the test pass, refactor the code until its &lt;b&gt;d&lt;/b&gt;esign is as simple and clean as possible, then &lt;b&gt;a&lt;/b&gt;nalyze the information you learned to decide which test to write next.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Test-o-matic Tools&lt;/b&gt;&lt;br /&gt;The reason this reversal of the process is interesting is because it can change the way you look at programming, and potentially make you much more productive, but it is only possible with the right experience and the right tools. Every phase has its own tools associated with it to help automate it. It is only by sufficiently automating these phases that TDD can be achieved economically. Testing is done with a testing framework such as JUnit, compilation/integration is usually done by the IDE or a build script in Ant, coding is automated somewhat by editor features such as code completion, low-level design is aided with automated refactoring in the IDE, and analysis can even be automated somewhat with a static code analysis tool (either built into the IDE or separate). With all this tool support, TDD can be a very productive style of programming.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Next Up, Continuous Integration&lt;/b&gt;&lt;br /&gt;Like testing, integration has followed a similar trend toward faster and faster feedback. In the early days, you had one big integration phase near the end of the project as different components were basically forced together. This was called Big Bang Integration. And like a big bang, it often did. The integration efforts often failed miserably, pushing project development past deadlines. People started to do integration more often, eventually implementing weekly or even daily builds. The concept of the daily build is promoted by several agile methodologies.&lt;br /&gt;&lt;br /&gt;Continuous Integration is the next logical step beyond daily builds. With CI, each programmer takes responsibility for making sure that their contribution does not break the build. Martin Fowler describes it in detail in &lt;a href=&quot;http://martinfowler.com/articles/continuousIntegration.html&quot;&gt;his article on the subject&lt;/a&gt;, but the basic idea of Continuous Integration is that once you finish a task, including writing tests for that task, you:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ensure that the project (including all the latest changes from the repository) builds properly on your development machine. &lt;/li&gt;&lt;li&gt;Then, after fixing any issues that arise, you check in your code and do another clean build on an integration machine to ensure that you properly submitted everything to the repository. &lt;/li&gt;&lt;li&gt;After you fix any problems from this, you are done. Your change has been included in the repository and everything in the repository is integrated and builds correctly. &lt;/li&gt;&lt;/ul&gt;When every programmer follows this same procedure each time they commit a contribution to the repository -- often resulting in building dozens of times per day -- this is continuous integration.&lt;br /&gt;&lt;br /&gt;Martin Fowler &lt;a href=&quot;http://martinfowler.com/articles/continuousIntegration.html&quot;&gt;writes&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&quot;If you have continuous integration, it removes one of the    biggest barriers to frequent deployment. Frequent deployment is valuable because it allows your users to get new features more rapidly, to give more rapid feedback on those features, and generally become more collaborative in the development cycle. This helps break down the barriers between customers and development - barriers which I believe are the biggest barriers to successful software development.&quot;&lt;br /&gt;&lt;/blockquote&gt;&lt;b&gt;The Feedback Connection&lt;/b&gt;&lt;br /&gt;Again, like with testing, a little automation of this procedure can start to change our understanding of integration. With the help of a continuous integration server, the final step of performing a second build on an integration machine can be automated so that whenever a programmer commits code to the repository, the CI server detects this event and automatically starts a build, without requiring the programmer to manually do this himself. If the build succeeds, no problem; code is submitted to the repository, and everything is fine.  But if the build fails, a report detailing the problem is generated and sent out. This report is essentially a feedback mechanism.&lt;br /&gt;&lt;br /&gt;With this insight, now we can see a deeper similarity between testing and integration. Not only are they following a similar trend, but we can also see that integration is an extension of testing, &lt;i&gt;at the team level&lt;/i&gt;. When a unit test fails, you are getting feedback on the quality of your own code. When a build fails, you are getting feedback on the quality of the whole team&#39;s code. So, unit tests are feedback on programmer-level code quality and builds are feedback on team-level code quality. &#39;Feedback on quality&#39; is one definition of testing. Therefore, by this analogy, integration is team-level testing. A successful integration build means that your contribution is compatible with the other contributions which have been made in the repository. An unsuccessful integration build means you need to fix something.&lt;br /&gt;&lt;br /&gt;This analogy puts things in a new light. For instance, just as we can see that TDD is a progression beyond basic unit-testing, we can also see that CI is a progression beyond the practice of daily builds. This is a useful analogy because it will show us how the factors involved in both TDD and CI will be similar in nature. For example, if more automation opens up a different style of programming with TDD, then more automation may open up a different style of collaboration with CI. Likewise, if TDD is more productive for you, then CI will probably be more productive for you as well, since they are both methods of speeding up feedback on code quality.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Well, by &lt;i&gt;that&lt;/i&gt; analogy...&lt;/b&gt;&lt;br /&gt;If the motivations for adopting TDD are the same motivations for adopting CI, then why aren&#39;t more people using CI? I think the problem is that the available tools do not fully support the ideal continuous integration scenario. When all we had was JUnit and a clunky IDE, unit testing wasn&#39;t widely adopted either, and there was no sign of TDD yet. Now we have IDEs with automated refactorings, advanced code-completion and code-generation, static code analysis with quick-fixes, and built-in support for testing frameworks (like JUnit and TestNG) in both the IDE and in other tools like Ant. All of these combined make productive TDD possible. Perhaps CI is in a similar early stage with its first major tool, the CI server, but not much else in the way of automation. Maybe someday soon we won&#39;t call it simply &#39;Continuous Integration&#39;, but we&#39;ll have a more advanced term for it like &#39;Integration Driven Development&#39;, or combine it with TDD and call it &#39;Feedback Driven Development&#39;.&lt;br /&gt;&lt;br /&gt;What would this ideal version of continuous integration be like? The dream goal is that there is always a complete, up-to-date, working version of the entire software product. Whenever a good change is submitted to the repository, the change is automatically incorporated into the final system -- no programmer interaction should be required except to commit code. Whenever a bad change is submitted, the programmer responsible for the bad change is immediately notified and every effort is made to help the programmer locate and fix the source of the problem. Furthermore, the effect on the other programmers in the team should be minimized as much as possible. Ideally, the code in the repository would never be broken.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Broken Build Syndrome&lt;/b&gt;&lt;br /&gt;Today, the situation is not so rosy. Most CI servers do little more than provide a report (email, IM, web, etc.) when the build fails. They may also provide a web interface to keep track of the status of the builds, which is good, but not yet at the level of tool support that I&#39;m imagining. Don&#39;t get me wrong, the benefits of a CI server are much better than even a Daily Build practice, but they don&#39;t go quite far enough to achieve that &#39;next level&#39;, as TDD is the &#39;next level&#39; beyond basic unit testing.&lt;br /&gt;&lt;br /&gt;One of the biggest problems with today&#39;s CI servers is what happens when things go wrong. I call it broken build syndrome. Somebody broke the build, the build hasn&#39;t been fixed yet, and it holds many other people back, since they can no longer rely on the repository&#39;s codebase. Builds take a long time to run, typically. On a medium or large team, broken build syndrome will happen, even if you have a CI server, because of this time lag. Sure, the CI server sends out a report detailing the problems with the build, but is it always easy to figure out from the report what needs to be done to fix it? Not always. And before you can find the problem, someone else has checked in their own bad code. They get a report too, but they think you broke the build so they don&#39;t realize they also need to fix it. As a result, the build remains broken much longer than necessary, and basically confusion and frustration spread through the whole team. This is just one of the many ways broken build syndrome can happen.&lt;br /&gt;&lt;br /&gt;Should we blame the people involved? Not really. People make mistakes, so our systems should adapt to the people, rather than expecting people to act perfectly. If we draw our inspiration from TDD, we see that the way to solve this problem is to provide better tool support, automating those tedious things that are error-prone, and providing better visibility for those problems that do get through the cracks.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TeamCity&lt;/b&gt;&lt;br /&gt;This is actually one of the primary motivations behind &lt;a href=&quot;http://www.jetbrains.com/teamcity/index.html?java_r&quot; rel=&quot;tag&quot;&gt;TeamCity&lt;/a&gt; -- to bring Continuous Integration to the &#39;next level&#39;, with features aimed at minimizing the problems and time wasted by broken build syndrome. Some of the features we already have are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Remote Run and Delayed Commit - which perform a complete build &lt;b&gt;without&lt;/b&gt; submitting code to the repository, so if the build breaks nobody else will be affected. With Delayed Commit, if the build is successful, the code will be committed to the repository automatically.&lt;/li&gt;&lt;li&gt;A Distributed Build Grid architecture - allowing many machines to run builds simultaneously, making continuous integration more continuous, without slowing down machines that are in use by your team members.&lt;/li&gt;&lt;li&gt;A rich web interface for monitoring and administrating builds - which provides detailed (but well-organized) information about all builds&lt;/li&gt;&lt;li&gt;A team-oriented (rather than tool-oriented) perspective on builds - providing useful metaphors like &#39;taking responsibility&#39; for a broken build so that everyone on the team can instantly know whether or not someone is fixing the build&lt;/li&gt;&lt;li&gt;Tight IDE integration - allowing such things as jumping directly from an error-report to the exact line in your IDE where the test failed, as well as many other features. (Currently supports IntelliJ IDEA and Visual Studio 2005. Eclipse support is expected by the end of March 2007, and NetBeans support is on the way soon after.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Server-side code analysis and code coverage - allowing time-consuming analysis to be performed regularly and all team members to benefit by viewing the results online or by fetching the results right into their IDEs&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;Even though there is a lot of room for improvement in tool support for continuous integration, the benefits of CI over the more-common practice of daily (or weekly) builds is very large. If you have already adopted test-driven development, then you really have no excuse -- CI is a natural extension to TDD, and the same reasons you chose to adopt TDD are the same reasons you should adopt CI.&lt;br /&gt;&lt;br /&gt;If you haven’t taken a look at TeamCity, check it out &lt;a href=&quot;http://www.jetbrains.com/teamcity/index.html?java_r&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Or test drive TeamCity online, without a download, &lt;a href=&quot;http://teamcity.jetbrains.com/login.html?java_r&quot;&gt;here&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/117199656743407059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/117199656743407059' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117199656743407059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117199656743407059'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2007/02/faster-feedback-and-why-you-want-it.html' title='Faster Feedback and Why You Want It: From TDD to CI and Beyond'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-117095798331406031</id><published>2007-02-08T17:37:00.000+01:00</published><updated>2007-02-08T19:06:23.476+01:00</updated><title type='text'>Cool New Demo of Ruby Support in IntelliJ IDEA</title><content type='html'>If you like &lt;a href=&quot;http://www.ruby-lang.org/en/&quot;&gt;Ruby&lt;/a&gt;, you&#39;re going to like this. If you like &lt;a href=&quot;http://jetbrains.com/idea&quot;&gt;IntelliJ IDEA&lt;/a&gt;, you&#39;re going to like this. Check out this &lt;a href=&quot;http://www.jetbrains.com/idea/training/demos/ruby.html&quot;&gt;cool demo of the new Ruby plugin for IntelliJ IDEA&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So far, this is a beta-quality release of the plugin, so don&#39;t be expecting all the bells and whistles... yet. JetBrains is serious about this, though, so expect to see much more coming in the future. The demo shows some of the features that the plugin already supports, like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;On-the-fly syntax and error highlighting&lt;/li&gt;&lt;li&gt;Keyword code completion&lt;/li&gt;&lt;li&gt;Reformat code according to your style settings&lt;/li&gt;&lt;li&gt;TODO comment support&lt;/li&gt;&lt;li&gt;Structure-aware features such as structure view, goto symbol, etc.&lt;/li&gt;&lt;li&gt;RDoc support&lt;/li&gt;&lt;/ul&gt;This is great on so many levels. Combining Ruby and IDEA just makes sense to me, considering they share a lot of similarities in terms of philosophy. Both Ruby and IDEA try to help programmers be more productive by being smart, flexible, and intuitive, and even more so by getting out of the way and letting the programmer do what the programmer needs to do. And although this demo only shows Ruby support, don&#39;t think we&#39;ve forgotten about &lt;a href=&quot;http://www.rubyonrails.org/&quot;&gt;Rails&lt;/a&gt;. Support for Rails already exists in the Ruby plugin and we will be expanding it as we go.&lt;br /&gt;&lt;br /&gt;I think the big advantage IDEA will bring to Ruby developers will be the code-level intelligence and usability that IDEA is famous for in the Java and web languages (Javascript, HTML, XML, CSS, etc.). It will bring not just structure to the project (as any IDE should), but also new capabilities as well. For instance, refactoring, intelligent navigation and code searching, on-the-fly static code analysis (problem/error highlighting in the code), and intention actions (quick fixes). For Ruby/Rails developers who already appreciate productivity, they will surely appreciate how these features will help them to become even more productive than they are now.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/117095798331406031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/117095798331406031' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117095798331406031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/117095798331406031'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2007/02/cool-new-demo-of-ruby-support-in.html' title='Cool New Demo of Ruby Support in IntelliJ IDEA'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-115876136900438144</id><published>2006-09-20T16:09:00.000+02:00</published><updated>2006-10-05T17:59:32.053+02:00</updated><title type='text'>Eclipse FUD: eWeek has no shame</title><content type='html'>Just when you thought the IDE wars were over, irresponsible reporting fans the flames. How can the editors of eWeek even &lt;b&gt;consider&lt;/b&gt; &lt;a href=&quot;http://www.eweek.com/article2/0,1895,2017113,00.asp&quot;&gt;this article&lt;/a&gt; to be worthy of publishing? At &lt;b&gt;best&lt;/b&gt;, the author Daryll Taft has absolutely no clue about the topic he is reporting on. At worst, it is pure FUD (Fear, Uncertainty, and Doubt). Here&#39;s why:&lt;br /&gt;&lt;br /&gt;1) The article doesn&#39;t even link to the survey it quotes, which is a red flag in my opinion. You have to ask yourself, Why? Does the author want to make it difficult for readers to check his sources? Here&#39;s the link to the survey so you can see it for yourself (and participate if you like): &lt;a href=&quot;http://www.tezaa.com/view/Your_favourite_IDE&quot;&gt;http://www.tezaa.com/view/Your_favourite_IDE&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2) The article correctly reports that the survey in question is &#39;grassroots&#39;, or a &#39;straw poll&#39;, which basically means it&#39;s unscientific. I can handle that; sometimes informal polls can still give an interesting picture of general opinion. However, the author fails to mention that at the time he took the numbers from the poll, there were only about &lt;b&gt;350&lt;/b&gt; respondants, even though the poll has been running since June. For an internet poll, that number is really tiny and easily skewed.&lt;br /&gt;&lt;br /&gt;3) Likewise, the author fails to mention that the poll options didn&#39;t even include some of the more popular IDEs in use today. There were only a small smattering of options, not at all representative of the real marketplace. The only recognizable IDEs listed were: Eclipse, NetBeans, Visual Studio, Dreamweaver, and Zend Studio. I had to add my favourite, IntelliJ IDEA (quite popular in the Java world), myself! And this poll has been running since June!!! I&#39;m sure fans of other IDEs (a good example being JDeveloper) will shortly add their options too.&lt;br /&gt;&lt;br /&gt;4) The author goes on to give a heavily one-sided &#39;analysis&#39; of Eclipse&#39;s position in the market, heavily quoting Mike Milinkovich, and NO ONE ELSE. As such, Milinkovich&#39;s snipes at Sun go virtually unanswered. Particularly sinister are the veiled accusations (that a smiley does not excuse) that Sun might &#39;astroturf&#39; the survey, casting unjustifiable suspicion on Sun&#39;s ethics. We should question eWeek&#39;s ethics for posting this article in the first place. Does Mike have your marionette strings, Daryll? This kind of yellow journalism is unacceptable. How about taking some responsibility, please?&lt;br /&gt;&lt;br /&gt;This article is not news, and does not belong in the news section of a supposedly reputable news source. eWeek should be ashamed.&lt;br /&gt;&lt;br /&gt;Yes, Eclipse probably does dominate the IDE market in terms of popularity, and I have no problem with that fact being reported far and wide, as long as it is reported fairly and open-mindedly, based on reputable sources. And you know what? The IDE popularity war is long over. Been there, done that. The much more &lt;b&gt;interesting&lt;/b&gt; story is that there is a &lt;b&gt;lot&lt;/b&gt; of really cool innovation &lt;b&gt;still&lt;/b&gt; going on in the IDE market. Friendly competition is the new thing driving the industry. Real innovation is interesting. Flakey posturing is boring.&lt;br /&gt;&lt;br /&gt;(Full disclosure: I am currently employed at JetBrains, makers of IntelliJ IDEA, which competes with Eclipse. This post is not a diss on Eclipse, it&#39;s a diss on eWeek.)</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/115876136900438144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/115876136900438144' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/115876136900438144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/115876136900438144'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2006/09/eclipse-fud-eweek-has-no-shame.html' title='Eclipse FUD: eWeek has no shame'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-113778754632048108</id><published>2006-01-20T20:53:00.000+01:00</published><updated>2006-01-20T21:05:46.346+01:00</updated><title type='text'>IntelliJuei</title><content type='html'>I thought the caption for &lt;a href=&quot;http://www.flickr.com/photos/bryangreen/69468834/&quot;&gt;this photo&lt;/a&gt; on Flickr was hilarious:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/bryangreen/69468834/&quot;&gt;&lt;img src=&quot;http://static.flickr.com/12/69468834_9ec960ceae_t.jpg&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And then I realized he has &lt;b&gt;dual&lt;/b&gt; widescreen monitors. DROOOL. I don&#39;t even have &lt;b&gt;one&lt;/b&gt; widescreen monitor. I should look into that.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/113778754632048108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/113778754632048108' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/113778754632048108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/113778754632048108'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2006/01/intellijuei.html' title='IntelliJuei'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-113155086970852468</id><published>2005-11-09T16:40:00.000+01:00</published><updated>2005-11-09T16:41:09.733+01:00</updated><title type='text'>Now or Never</title><content type='html'>For several years, I&#39;ve had a particular software product idea in mind, but always figured it would be one of those things where you&#39;re 50 years old and go, &quot;Yep, that was a really good idea. Someone could have taken that idea and built a good solid product out of it and probably have gotten rich. Yep, too bad no one did it.&quot; Man, that would really suck if that was me when I turn 50. Well, it turns out that no one else has run with this idea, and the market window is still open, but closing. I guess it&#39;s now or never, and I decided to take a chance and go for it. So, I recently quit from JetBrains and I&#39;m now working out of my apartment on the new product. (I owe at least some inspiration to Paul Graham&#39;s essays on startups.)&lt;br /&gt;&lt;br /&gt;Working at JetBrains was great and I take away a better understanding of what it takes to make a great software product. It was great to work with such talented people, and to participate in the IntelliJ community with all it&#39;s fantastic people. I&#39;ll still be participating, just in a different way, and maybe a little less often. And I&#39;ll always be a fan of JetBrains and its products.&lt;br /&gt;&lt;br /&gt;It&#39;s funny, almost every single person I tell about this has the exact same question, &quot;So, can you say what product you&#39;re building, or is it a secret?&quot; I think the whole &#39;stealth mode&#39; thing is bogus. If your startup idea is so easy to copy that you have to keep it a secret, then I think you&#39;re in for a rough ride with the competition. I think it&#39;s much more sensible to refine your &#39;pitch&#39; with people who are curious, but don&#39;t really care one way or the other. On the other hand, this blog is quite public, so revealing too much could alert the real competition that they should be wary. On the third hand, if the idea is good enough, the competition is likely to be complacent and scoff at your idea rather than take it seriously. So, with that in mind...&lt;br /&gt;&lt;br /&gt;The product is a software tool for pharmaceutical companies to build dynamic sales presentations with. Kind of like a cross between Powerpoint and Excel. There, that should appease the casually curious without giving away our &#39;secret sauce&#39;. :-)</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/113155086970852468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/113155086970852468' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/113155086970852468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/113155086970852468'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2005/11/now-or-never.html' title='Now or Never'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-113079798476723377</id><published>2005-10-31T22:52:00.000+01:00</published><updated>2006-10-31T20:14:12.643+01:00</updated><title type='text'>Why Are Continuations So Confusing, and What Do They Really Do?</title><content type='html'>I recently watched a video trying to explain, in simple terms, what continuations are. The quick answer was &quot;Continuations are just the remaining work to be done.&quot; WTF?! I had been wondering what the heck continuations were, but this answer gave me absolutely no clue. Oh! Of course! The &lt;i&gt;remaining&lt;/i&gt; &lt;b&gt;work&lt;/b&gt; to be &lt;i&gt;&lt;b&gt;done&lt;/b&gt;&lt;/i&gt;! It makes complete sense now. Unfortunately, this is one of those explanations that only makes sense if you &lt;i&gt;already&lt;/i&gt; understand what is being explained. Kind of like &#39;a Java classpath is just the set of paths where all your classes are&#39;. Completely useless to you if you don&#39;t already get it. Even the examples in the video confused me. I sort of got it, but not really. So I started digging into &lt;a href=&quot;http://ruby-lang.org/&quot;&gt;Ruby&lt;/a&gt; to see if I could figure it out, given the sparse clues I already had, and you know what ... continuations are so freaking simple that it boggles my mind why it was so difficult to understand them. Correction: It doesn&#39;t boggle my mind; I know exactly why continuations are confusing. And so, I hope to once and for all cut through all the confusion and explain what continuations are, and how to use them, in &lt;i&gt;actual&lt;/i&gt; simple terms.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What are continuations?&lt;/b&gt;&lt;br /&gt;That&#39;s actually the &lt;b&gt;wrong&lt;/b&gt; question to ask. The answer will probably confuse you more than necessary. The better question to start with is:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Why are continuations so confusing?&lt;/b&gt;&lt;br /&gt;The answer is quite simple: Wrong metaphor. The word &#39;continuation&#39; provides no clue as to what it does. In fact, it describes its implementation rather than its purpose. So, it is necessary for you to understand the implementation before you can understand the purpose. But for someone new to continuations, this is completely backwards! We want to understand what continuations are for &lt;i&gt;before&lt;/i&gt; we understand how the implementation works. Could you imagine if a class&#39; methods were called &#39;virtual table entries&#39;? Or if floating point numbers were called &#39;exponentiated mantissas&#39;? Of course, the implementation is important to understand to become an expert, but I shouldn&#39;t need to know exactly how an internal combustion engine works just to drive a car.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What do they really do?&lt;/b&gt;&lt;br /&gt;You know, I&#39;m not even going to bother calling them continuations anymore, as that&#39;s a complete red herring. I&#39;m going to explain to you a brand-spanking-new concept called &#39;execution sites&#39;. Execution sites allow you to specify (or mark) a point of execution in your code, and store a representation of that site in a variable so that you can return to the original site later. Not only that, but it allows you to pass information back to the original site, so that it evaluates to a different value. I&#39;ll explain how this works with some simple Ruby code. (Note that the code below will not work in plain old Ruby. It requires some simple definitions which I&#39;ll provide at the end of the article. You can, for now, pretend that this is &#39;wishful&#39; Ruby, or Ruby-as-I-would-like-it. I&#39;ll also use some redundant syntax to make the code more natural to non-Rubyists.)&lt;br /&gt;&lt;br /&gt;I need to be able to mark my execution site and store it in a variable, like this:&lt;br /&gt;&lt;pre&gt;theSite = mark();&lt;/pre&gt;&#39;mark&#39; is a special keyword (again, not in real Ruby, but in wishful-Ruby) that captures the site of execution, wraps it in an object, and returns it. &#39;theSite&#39; is simply a local variable where we store the site. Later on, we can return to the site by using the &#39;return&#39; method of the site object, like this:&lt;br /&gt;&lt;pre&gt;theSite.return();&lt;/pre&gt;Here&#39;s a &#39;hello world&#39; type of program that uses execution site marking:&lt;br /&gt;&lt;pre&gt;theSite = mark();&lt;br /&gt;puts &quot;Hello, World!&quot;&lt;br /&gt;theSite.return();&lt;/pre&gt;This code performs an infinite loop, outputting &quot;Hello, World!&quot; over and over. You may be familiar with labels and gotos from other languages, which allow you to do something very similar to this. Here&#39;s a simple script to demonstrate how gotos and labels work:&lt;br /&gt;&lt;pre&gt;:theSite&lt;br /&gt;echo Hello&lt;br /&gt;goto theSite&lt;/pre&gt;&quot;So, an execution site is like a goto label?&quot; Sort of, but actually more powerful. First, you can store an execution site in a variable, array, object field, or whatever, so it is more like an object than a label. Second, labels typically are limited in scope, depending on the language. For example, you usually can&#39;t goto from one method/function to another. With execution sites, you can return from deep inside some arbitrary code, back to wherever the site was marked:&lt;br /&gt;&lt;pre&gt;# Method definitions&lt;br /&gt;def startloop&lt;br /&gt; startloopSite = mark();&lt;br /&gt; puts &quot;Inside startloop&quot;;&lt;br /&gt; return startloopSite;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def endloop(startloopSite)&lt;br /&gt; puts &quot;Inside endloop&quot;;&lt;br /&gt; startloopSite.return();&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# Main execution path&lt;br /&gt;theSite = startloop();&lt;br /&gt;puts &quot;Middle of the loop&quot;;&lt;br /&gt;endloop(theSite);&lt;/pre&gt;This code will output &quot;Inside startloop&quot;, &quot;Middle of the loop&quot;, and &quot;Inside endloop&quot; over and over again. Notice that the main code execution path goes into startloop, marks the execution site, outputs &quot;Inside startloop&quot;, and then returns the execution site. So, later, when endloop calls &#39;return&#39; on the execution site, code execution goes right back inside startloop and outputs &quot;Inside startloop&quot; again. The site always returns to where it was marked, no matter where that is. Simple, but potentially much more powerful than a plain goto label.&lt;br /&gt;&lt;br /&gt;The third major difference between labels and execution sites is that execution sites remember &lt;i&gt;everything&lt;/i&gt; about where they were marked, whereas goto labels are more &#39;global&#39; in this aspect. A label only knows where it is declared, but when you mark an execution site, it remembers how the execution path got there (such as the method call stack) and also what local variables have been declared up to that point. In essence, it stores the complete execution state in a little object so that you can return to that same state at any point in the future. Here&#39;s an example:&lt;br /&gt;&lt;pre&gt;def remember(aValue)&lt;br /&gt; theSite = mark();&lt;br /&gt; puts &quot;The value is &quot; + aValue.to_s();&lt;br /&gt; return theSite;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;siteToReturnTo = 2;&lt;br /&gt;&lt;br /&gt;# Remember the values and execution state&lt;br /&gt;firstSite = remember(1234);  # Line A&lt;br /&gt;secondSite = remember(&quot;ABCD&quot;);  # Line B&lt;br /&gt;&lt;br /&gt;puts siteToReturnTo;&lt;br /&gt;&lt;br /&gt;# First go back to secondSite, then back to firstSite, then quit&lt;br /&gt;if (siteToReturnTo == 2) then&lt;br /&gt; siteToReturnTo = 1;&lt;br /&gt; secondSite.return();&lt;br /&gt;elsif (siteToReturnTo == 1) then&lt;br /&gt; siteToReturnTo = -1;&lt;br /&gt; firstSite.return();&lt;br /&gt;end&lt;/pre&gt;This code outputs the following:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The value is 1234&lt;br /&gt;The value is ABCD&lt;br /&gt;2&lt;br /&gt;The value is ABCD&lt;br /&gt;1&lt;br /&gt;The value is 1234&lt;br /&gt;The value is ABCD&lt;br /&gt;-1&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;The first two lines of output come from the first time the &#39;remember&#39; lines were executed. Inside the &#39;remember&#39; method, the parameter &#39;aValue&#39; takes on different values depending on what was passed. Note that the execution site is marked &lt;i&gt;inside&lt;/i&gt; the &#39;remember&#39; method, so the site will remember the value assigned to the &#39;aValue&#39; parameter, as each call to the method essentially creates a separate variable called &#39;aValue&#39;. So, essentially, &#39;firstSite&#39; remembers that &#39;aValue&#39; is 1234, and &#39;secondSite&#39; remembers that it is &quot;ABCD&quot;. Not only that, but firstSite remembers that the &#39;remember&#39; method call should return to Line A, and secondSite remembers that it should return to Line B. So local variables, the state of the call stack, and even the exact location in the code are all remembered when an execution site is marked.&lt;br /&gt;&lt;br /&gt;When secondSite.return() is called, execution jumps inside the &#39;remember&#39; method, where &#39;aValue&#39; has the value &quot;ABCD&quot;, and the &#39;remember&#39; method will return to Line B. Hence, we get the fourth line of output, &quot;The value is ABCD&quot;. By this time, our switch variable, &#39;siteToReturnTo&#39; has been updated to cause firstSite.return() to be called. When this happens, execution jumps again into the &#39;remember&#39; method, but this time &#39;aValue&#39; has its original value of 1234, and the method call will return to Line A. (Note that firstSite and secondSite do &lt;i&gt;not&lt;/i&gt; remember that &#39;siteToReturnTo&#39; was initially given the value of 2. Sites remember the variables &lt;i&gt;themselves&lt;/i&gt; not the values of the variables. The fact that &#39;aValue&#39; exists as a local parameter inside the &#39;remember&#39; method makes it act like two distinct variables, one for each method call, which happen to have the same name. It&#39;s a subtle distinction, and important to keep in mind. Those familiar with closures and code blocks in Ruby should have no trouble with this.)&lt;br /&gt;&lt;br /&gt;Now, this is all fine and dandy, but doesn&#39;t this make execution sites seem like glorified gotos? In essence, that is very much what they are. Dijkstra&#39;s advice should be heeded: Goto Considered Harmful. Marking execution sites for the purposes of using them like gotos sounds to me like a recipe for spaghetti. I like spaghetti for a good meal, but not in my code! I really believe that execution sites have the potential to royally mess up your code, so I don&#39;t recommend using them without a very good reason. I would say that it is unlikely that most programmers will code directly with execution sites. Instead, it is more likely that they would be useful for specialized frameworks and services to give concise ways to express complex solutions to problems. However, that shouldn&#39;t stop you from playing around with them to get a solid feel for what they do. Hey, maybe you&#39;ll be the one writing that cool framework or service that uses execution sites.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What&#39;s the big deal?&lt;/b&gt;&lt;br /&gt;There is one last capability of execution sites which I&#39;ve been holding up my sleeve. I think this is what makes them truly powerful and useful, and worthy of taking the time to understand them. I&#39;ll be honest and admit that I personally can not think of very many practical uses for execution sites, although some &lt;a href=&quot;http://www.seaside.st/&quot;&gt;very practical examples exist&lt;/a&gt;. I imagine that I&#39;ll start to see practical uses as my understanding improves and my imagination catches up with me (as happened to me with closures and macros). In any case, the final capability:&lt;br /&gt;&lt;br /&gt;So far, you&#39;ve seen that execution sites can mark a place in code execution that can be returned to at some later time. Wouldn&#39;t it be great if they could also return some useful information back to the original site? Then they could be used as a way to &#39;hold&#39; a calculation until future information is available that can allow the calculation to &#39;continue&#39; (&lt;i&gt;Hmm, there&#39;s that word &#39;continue&#39;.... I wonder if there&#39;s a connection to continuations? Patience, please.&lt;/i&gt; :-)&lt;br /&gt;&lt;br /&gt;Maybe, in wishful-Ruby, it could look like this:&lt;br /&gt;&lt;pre&gt;tryForBetter = true;&lt;br /&gt;theSite = nil;&lt;br /&gt;theCalculation = mark() { |site|&lt;br /&gt; theSite = site;&lt;br /&gt; # Do some work to get an initial value for the calculation&lt;br /&gt; initialCalculation = 3;&lt;br /&gt; theSite.return(initialCalculation);  # Line A&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;puts &quot;The calculation is &quot; + theCalculation.to_s();&lt;br /&gt;&lt;br /&gt;if (tryForBetter) then&lt;br /&gt; tryForBetter = false;&lt;br /&gt; # We discover a better value for the calculation&lt;br /&gt; betterValue = 3.1415;&lt;br /&gt; theSite.return(betterValue);  # Line B&lt;br /&gt;end&lt;/pre&gt;This usage of &#39;mark&#39; is significantly different than the simple usage of &#39;mark&#39;. In the simple usage, &#39;mark&#39; returns the execution site itself:&lt;br /&gt;&lt;pre&gt;theSite = mark();&lt;/pre&gt;In the new version, &#39;mark&#39; returns a &lt;i&gt;value&lt;/i&gt;, and the execution site is provided as a parameter to the accompanying code block. This syntax structure allows us to return &lt;i&gt;different&lt;/i&gt; values in the future. The execution site is merely a book-keeping tool that we use to provide this capability.&lt;br /&gt;&lt;br /&gt;The first time through the code, &#39;mark&#39; captures the execution site, and then executes the code block. The code block is given the site object as a parameter, called &#39;site&#39; in this example. We store the site object in the local variable &#39;theSite&#39; so we can use it later. Then we return an initial value. This initial value becomes the value of the &#39;mark&#39; expression. Note that the code block is only executed &lt;i&gt;once&lt;/i&gt;, when the &#39;mark&#39; expression is first evaluated. You can think of the code block as the initializer which performs book-keeping (storing the execution site object for future use), as well as producing an initial value for the &#39;mark&#39; expression.&lt;br /&gt;&lt;br /&gt;Thus, the initial value of &#39;theCalculation&#39; is 3, because that&#39;s the value determined by the block, specifically by the expression theSite.return(initialCalculation) on Line A. So the first line of output is &quot;The calculation is 3&quot;.&lt;br /&gt;&lt;br /&gt;Since the site object is stored in &#39;theSite&#39;, we can essentially go back and &lt;i&gt;change&lt;/i&gt; the value of &#39;theCalculation&#39; by passing in a different value to return on Line B. Now &#39;theCalculation&#39; gets the value 3.1415, and the second line of output is &quot;The calculation is 3.1415&quot;. If we wanted to, we could keep using the site object to return successively better approximations of pi. This is admittedly a trivial example, but hopefully it will give you a spark to let your imagination consider the possibilities.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So that&#39;s it. An execution site provides three things: A way to mark a specific point in execution, including all the important context; an object which represents the execution site so you can store it, use it, abuse it, or what have you; and a mechanism to return back to the site mark, optionally returning some useful information.&lt;br /&gt;&lt;br /&gt;&quot;Wait a second, you&#39;ve just told me about &#39;execution sites&#39;. You just made that crap up. I want to know what &lt;i&gt;continuations&lt;/i&gt; are, you jerk!&quot;&lt;br /&gt;&lt;br /&gt;Whoah, whoah, no need to be upset. It&#39;s very simple, really. A &#39;continuation&#39; is an &#39;execution site&#39;. You create continuations using a special command named &#39;callcc&#39;, which works &lt;i&gt;exactly&lt;/i&gt; like the value-returning version of the &#39;mark&#39; command, and you can return to the location of the &#39;callcc&#39; by invoking the &#39;call&#39; method on the continuation object. All I&#39;ve really done is give better names to the concepts, &#39;callcc&#39; becomes &#39;mark&#39;, &#39;continuation&#39; becomes &#39;execution site&#39;, and the &#39;call&#39; method becomes &#39;return&#39;. Oh, and I also provide a simplified way to mark sites where you don&#39;t care about the return value and only want to capture a continuation (oops, I mean execution site). In fact, it&#39;s so simple there are only a few lines of Ruby code which will transform Ruby into wishful-Ruby:&lt;br /&gt;&lt;pre&gt;class Continuation&lt;br /&gt; alias_method :return, :call&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def mark &amp;block&lt;br /&gt; if block != nil then return callcc(&amp;amp;block) end&lt;br /&gt; theSite = nil&lt;br /&gt; callcc{|s| theSite = s}&lt;br /&gt; return theSite&lt;br /&gt;end&lt;/pre&gt;So, wishful-Ruby code that looks like this:&lt;br /&gt;&lt;pre&gt;theSite = nil;&lt;br /&gt;aValue = mark { | site |&lt;br /&gt; theSite = site;&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;site.return(someValue)&lt;/pre&gt;Looks like this in normal Ruby:&lt;br /&gt;&lt;pre&gt;theContinuation = nil;&lt;br /&gt;aValue = callcc { | cc |&lt;br /&gt; theContinuation = cc;&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;cc.call(someValue)&lt;/pre&gt;In other words, continuations are cryptic and nearly incomprehensible. Still not satisfied? Okay. Fine. A continuation is just a reification of execution context. Or, in &#39;simple terms&#39;, a continuation is just the remaining work to be done. But you already know that now, don&#39;t you?&lt;br /&gt;&lt;br /&gt;Now if someone could just explain to me what monads are....</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/113079798476723377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/113079798476723377' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/113079798476723377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/113079798476723377'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2005/10/why-are-continuations-so-confusing-and.html' title='Why Are Continuations So Confusing, and What Do They Really Do?'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-112784260746559270</id><published>2005-09-27T19:36:00.000+02:00</published><updated>2007-02-23T16:11:20.756+01:00</updated><title type='text'>IntelliJ IDEA interview transcript</title><content type='html'>By request, here&#39;s the transcript of &lt;a href=&quot;http://javaposse.com/index.php?post_id=22795&quot;&gt;my interview on the Java Posse&lt;/a&gt; podcast, about &lt;a href=&quot;http://www.jetbrains.com/idea/&quot;&gt;IntelliJ IDEA&lt;/a&gt; and the Java IDE market in general (Eclipse, NetBeans, etc.):&lt;br /&gt;&lt;br /&gt;Java Posse: Hi, and this is Dick Wall, for the Javacast, interviewing Rob Harwood of JetBrains. Today we&#39;re going to be talking about IntelliJ IDEA, an alternative IDE to the big boys that are out there, in particular Eclipse and NetBeans, right now. Hello, Rob.&lt;br /&gt;&lt;br /&gt;Rob Harwood: Hi there.&lt;br /&gt;&lt;br /&gt;JP: Can you tell us a little bit about your background and experience? Are you, or have you been a developer, and what do you do at JetBrains?&lt;br /&gt;&lt;br /&gt;RH: Yep. I&#39;ve been a developer for six years. I had a computer science degree. Around three years ago, I was looking for a better Java IDE, because I was using -- I think it was -- JBuilder at the time, and I wasn&#39;t happy with it, and discovered IntelliJ IDEA by JetBrains, and I liked it so much I bought my own copy. Another thing that I should mention is that I was a fan of agile methodologies, and so when I saw IntelliJ IDEA, I was very impressed by it, and I wanted to find the company that made it and try to get a job with them. So that&#39;s what I did, and I joined JetBrains as a programmer. I did a little bit of work on IDEA itself, but I mostly did internal projects. And so, then I moved on -- just recently actually, I just moved on to what I would call technical marketing, which is I&#39;m actually more of like an expert user, and I use that knowledge to help educate about IDEA.&lt;br /&gt;&lt;br /&gt;JP: You sound like an American, but you&#39;re --&lt;br /&gt;&lt;br /&gt;RH: No, I&#39;m Canadian.&lt;br /&gt;&lt;br /&gt;JP: Oh, Canadian, I apologize. But, you&#39;re living out in Prague right now, is that correct?&lt;br /&gt;&lt;br /&gt;RH: That&#39;s right. Yeah.&lt;br /&gt;&lt;br /&gt;JP: Okay, how do you like it out there?&lt;br /&gt;&lt;br /&gt;RH: It&#39;s great, I like it here. It&#39;s a nice change from North America, I&#39;ll tell you that. It&#39;s a lot more relaxing out here, I would say.&lt;br /&gt;&lt;br /&gt;JP: Yeah, I&#39;ve heard that it&#39;s a very beautiful city, actually.&lt;br /&gt;&lt;br /&gt;RH: It is, yeah.&lt;br /&gt;&lt;br /&gt;JP: So, can you sum up IntelliJ IDEA? Tell us a little bit about what sets it apart from the competition, like Eclipse and NetBeans.&lt;br /&gt;&lt;br /&gt;RH: Okay, well, it&#39;s a Java IDE. But I think I should give a little bit of history, to kind of set the stage, in case some of your listeners aren&#39;t familiar with it. So, around 2000 or 2001, Java IDEs were kind of standard, and Sergey Dmitriev, who is one of the three founders of the company, decided that he wasn&#39;t quite happy with the situation. He had previously worked at TogetherJ. And so he wanted to create a new IDE that had much better code search, code navigation, and also something called refactoring, which I hope most of your listeners know about. It&#39;s being able to modify code without changing its behaviour, to improve its design. So, in fact, Sergey and two other founders joined together and they finished writing this IDE, and it was the first IDE with the Extract Method refactoring, which is what Martin Fowler calls &#39;crossing the refactoring Rubicon&#39;. So, it had a little gathering of, kind of, fans, I would say. And in fact it won a Jolt Award one year, and then the next year, I think, it won the Jolt Productivity Award. And so, based on this and its success, other IDEs started to add refactoring and all these other productivity features. So the thing that sets IDEA apart is that it&#39;s focused specifically on developer productivity. And I usually say that productivity is achieved, in this case, with intelligent features and usability. And the difference is that IDEs like NetBeans and Eclipse, they actually start out as application platforms, plug-in platforms, and the IDE is kind of like the showcase application for it. So they start out as platforms and build an IDE on top of that, whereas IDEA is the other way around. It starts with the IDE, a heavily integrated IDE, and it builds out modular parts of it as we find ways to do that. So, the motivation is different, and also the architecture is different. Eclipse and NetBeans start from the basis of modularity, and IDEA starts from the basis of integration and adds modularity as it&#39;s needed. For instance, for adding plugins for version control systems, and now we have a new Language API for adding support for different scripting languages, and that kind of thing. So we have a modular architecture, but it&#39;s not from the modular side. It&#39;s not starting from modularity.&lt;br /&gt;&lt;br /&gt;JP: Okay. Do you think there are any other major strengths of IDEA worth mentioning at this point at well?&lt;br /&gt;&lt;br /&gt;RH: Well, definitely. I haven&#39;t really gone into much detail yet. So, I would say the primary things are based around usability and intelligence -- and again this goes back to productivity. We add features when we see that it will add to developer productivity. So, good examples of that are: Code navigation, for navigating your Java classes and XML files, and all that; code assistance, like code completion and generating code like constructors and getters and setters, and things like that; also, especially refactoring, which IDEA has very complete refactoring. There is also a fairly new feature in the last couple of years, is static code analysis, primarily the code inspections and on-the-fly error highlighting, which is something that is not really well known yet, but I think in the coming year or two, people will start to see the advantages of this feature. And also IDEA is heavily integrated for J2EE and web applications, as well as other things, but I mean I could just go on forever, so I think I&#39;ll leave that.&lt;br /&gt;&lt;br /&gt;JP: Right. What do you think, if anything, the weaknesses are in IDEA?&lt;br /&gt;&lt;br /&gt;RH: Well, it depends on your perspective, so I&#39;ll pick a couple of perspectives. One is, let&#39;s say, performance. It&#39;s not a text editor. It&#39;s a full-blown IDE. So, in some ways we trade off performance for things like building caches of information so we can do intelligent code searches, and highlighting of errors and potential errors, and that kind of thing. So, in some ways we&#39;re trading off raw performance for usability and intelligence. But, on the other hand, we treat performance as a usability feature, so if performance is not good enough, we definitely address that. So what you end up with is a well-performant IDE, but it&#39;s not going to be able to handle huge files, like 5 megabyte files, or something like that. It&#39;s not a raw text editor.&lt;br /&gt;&lt;br /&gt;JP: Okay.&lt;br /&gt;&lt;br /&gt;RH: And also the other one that I should mention is extensibility. As I said, we start from integration and we build in modularity as we go along. So, IDEA doesn&#39;t have as many plugins as other IDEs, but it does have a lot of built-in features. The other thing is that, because we&#39;re building in modularity piece-by-piece as we go, I would have to admit that sometimes the documentation is not that great for the Open API that we have. It can be difficult for someone to get started. However, we&#39;re looking into that. We have someone dedicated to working on the documentation, and we have already built -- it&#39;s a plugin development kit to help you kick-start your plugin development for IDEA.&lt;br /&gt;&lt;br /&gt;JP: Yeah, as a developer, I would say that the documentation is never good enough for anything.&lt;br /&gt;&lt;br /&gt;RH: One more thing, just to be fair, I think I should mention, to compare to NetBeans and Eclipse, the two obvious ones are: It&#39;s not open source, and it&#39;s not free. That would be a weakness, but, you know, it&#39;s a trade-off, right?&lt;br /&gt;&lt;br /&gt;JP: Right. I think we&#39;re going to hit that a little bit later in the interview a little more anyway. Okay, so heading back to the main topic here. I guess the big gorilla in Java IDE space right now has to be Eclipse. Many people seem to think NetBeans is the main competitor to that, albeit somewhat smaller in terms of market share, right now. Why do you think that is, and why do you think that IDEA is not a bigger force in the marketplace right now?&lt;br /&gt;&lt;br /&gt;RH: Yeah. So, Eclipse is definitely the gorilla. And by gorilla I&#39;m using the terms coming straight out of Geoffrey Moore&#39;s popular books Crossing the Chasm and Inside the Tornado. You can see this in pretty much any industry. You get kind of a breakdown of who&#39;s the big heavyweight, and who are the two or three competitors who are providing alternative choices. Usually, the main one is called the gorilla, which is the most popular, the default choice, the one that has the most support from the community. But there&#39;s always competitive choices, and these are actually called chimpanzees, in Geoffrey Moore&#39;s terminology, or chimps. So, I would have to say, we are the adaptable and intelligent chimp in competition with the 800 pound gorilla. And the reason for that is pretty much that we started out as -- it&#39;s like the two guys in the garage kind of story, except this time it was three people in Prague. We started out from pretty much nothing, and all of our marketing, up until recently, let&#39;s say, a year or two ago, has been through word of mouth. So, people telling other people that they like it, and get their friends on it, and show it to their friends, and that kind of thing. Whereas, something like Eclipse or NetBeans, which is backed by a large company, they have the capabilities to provide a lot of extra support like extra websites and marketing money and ads in various magazines, and whatever. So, that would be one of the main reasons. The other one obviously is cost. And the third one is obviously open source, the fact that NetBeans and Eclipse are open source. So they have the kind of default attraction to most programmers.&lt;br /&gt;&lt;br /&gt;JP: Okay. I think one more possibility, certainly one that I hear spoken about a lot, is a lot of people like Eclipse because of SWT. Now, I&#39;m not going to go into my own views on this particular one, but that does seem to be a draw to the Eclipse platform, is the SWT IDE construction toolkit. Does IDEA have any kind of SWT compatibility, and what do you think of SWT compared to Swing?&lt;br /&gt;&lt;br /&gt;RH: Well, I gotta say, this is somewhat of a religious topic, and to be honest, I don&#39;t have a lot of experience in GUI development, so I won&#39;t really provide my opinion on SWT or Swing. What I can say is what I see from the marketplace. I see SWT as kind of like the C# versus Java. So C# made a big appearance, and had a lot of interesting features, and for a while it was a little bit embarrassing for Java. But the thing is, Java didn&#39;t really stand still. Sun updated it to cover the big differences. You know, it&#39;s like competition; when you have no competition, things kind of stagnate, right? So, C# is providing competition for Java, and in the same way, SWT is providing competition for Swing. And I think that -- Personally, I think that Swing is so deeply embedded all over the world, and in so many projects, and so deeply embedded in the core JDK that I don&#39;t see SWT as -- I think it&#39;s probably going to slow down in its popularity, and I think Sun will update Swing to compete more with SWT. For me personally, the advantages of SWT that are promoted, like for instance operating system fidelity, and speed, and all that kind of thing. For me, those aren&#39;t that important because it&#39;s possible to build good interfaces in both of them. And I think both NetBeans and also IntelliJ IDEA are good examples of that. They both have good interfaces, and, you know, I&#39;m biased, but IntelliJ IDEA blew me away when I first saw it, and it&#39;s written entirely in Swing. So, for me the most important thing is usability. Can you build a usable interface with it? And the answer is yes to both of them. So, that&#39;s what I think, basically. In terms of IDEA&#39;s support for SWT, it&#39;s basically a class library, so you can definitely write SWT applications in it, but there&#39;s no specific support like a GUI builder or anything like that. We have a GUI builder, but it currently only works with Swing.&lt;br /&gt;&lt;br /&gt;JP: Okay. Staying on the UI for a minute, the upcoming -- I don&#39;t know if you&#39;ve seen this, but the upcoming NetBeans 4.2 has a UI builder in it called Matisse, and that&#39;s based on something called the Natural Layout Manager. Have you looked at these at all, and do you think that Natural Layout Manager support, similar to NetBeans will be included in a future release of IDEA?&lt;br /&gt;&lt;br /&gt;RH: Yeah, in fact, I had heard about it, but I hadn&#39;t looked at it until you sent me the questions. So, I did, I looked at the demo. I didn&#39;t download it, I didn&#39;t try it myself, because again, I&#39;m not really experienced enough to evaluate a GUI builder type of thing. But it appears to me that Matisse seems to be targeting ease of use compared to hand coding code. And I think that&#39;s a good idea, because the weakness of Swing, and probably even SWT, again I might not be accurate there but -- I&#39;ll just say with Swing then -- the weakness of Swing is that to get a decent UI requires a lot of work, you know, hand coding. That&#39;s why people use GUI builders, but the GUI builders recently have mostly been kind of just adjuncts to hand-coding, whereas Matisse seems to be targeting more like a quick, usable GUI builder, in comparison to say VB or some form builder from Microsoft. I think that&#39;s good, and I think it&#39;s needed. I was quite impressed by the demo. I would say that when we add support for third-party tools, we do it in a pragmatic manner. So, if there&#39;s a good use case for adding some feature to IDEA, we add it. And usually that means that there&#39;s some customers who are asking for it, and some special integration would significantly increase developer productivity. Also, the tool should be fairly stable, and kind of like a de facto standard, usually. So, if something, some tool, meets those criteria, we&#39;ll definitely add it to IDEA. If it doesn&#39;t, then we do have an Open API, and someone else, some third party, could add it as well, as a plugin. For example, IDEA comes with JUnit support, because JUnit is the de facto standard for unit testing. We don&#39;t have built-in TestNG support, but a few IntelliJ community members, Mark Derricutt and Hani Suleiman, they wrote a plugin for TestNG, which is a competing unit testing framework. Also, IDEA comes with Ant, because that&#39;s the de facto standard build tool, but say Maven requires third-party plugins. So, basically what I&#39;m saying is, if there&#39;s sufficient support for Matisse from the community and it&#39;s a solid tool, et cetera -- I think right now it&#39;s a pretty early tool. So, I can&#39;t see in the short term that we&#39;ll be directly adding support for it. But, you know in the long term, we might. Also, we do have our own GUI builder, and we&#39;ll probably be taking &#39;lessons learned&#39; from Matisse and applying it to our own GUI builder, as well. But I mean, there&#39;s nothing stopping us from adding support for Matisse, whether or not that is just the Natural Layout, or whether it&#39;s the actual GUI tool itself, it&#39;s hard to say.&lt;br /&gt;&lt;br /&gt;JP: Okay. As listeners will know, we&#39;ve had -- in the course of the previous Javacast episodes, we&#39;ve had some pretty extensive discussions on component-based development versus, I guess, traditional, more editing-based development. I just wondered what yours and JetBrains&#39; stance on the component based development model is. And is it a focus in IDEA? Is it likely to become a focus in IDEA?&lt;br /&gt;&lt;br /&gt;RH: I think when I originally heard the Javacast that I had responded to, I was probably a little bit confused about what you meant by component-based development and I think I took the wrong interpretation. What I think, actually, is that, when Brandon says &#39;component-based development&#39;, I think he means a couple of things. I think he means -- there&#39;s basically three things. One is pluggability. What&#39;s a component? It&#39;s almost like a plugin, right? The other one is kind of like the wizard-like functionality or the usability -- you know, providing a tool to help you get past the set-up configuration. The other one is kind of like the big tool that does it all for you. For instance, Sun Java Creator Studio, which is a tool for getting beginners, and experienced folks as well, but basically to provide all this support for you. So, in terms of that, I&#39;ll answer three different questions. What is IDEA&#39;s focus on all three of those situations? So, again, it comes back to the pluggability, where, yes, we do have an Open API, but that&#39;s not our number one priority. Our number one priority is being the best tool for Java and J2EE development. And in that sense, we are not really component-based, and that&#39;s what I originally had thought Brandon meant when he was talking about that.&lt;br /&gt;&lt;br /&gt;JP: Right.&lt;br /&gt;&lt;br /&gt;RH: But, in terms of the other two, which is the usability, you know, being able to click Next, Next, Next, like Brandon was talking about. That is basically a major feature of IDEA, being able to quickly and easily do things like creating a new class, or you know, just anything. We try to build in as much usability as possible in our tool. However it is more for like hand coding, right? So, in terms of the big tool that does everything for you, that&#39;s not what IDEA is about. So, our wizards -- I think we only have one or two. We have a project creation wizard, and I think there&#39;s another one, but I can&#39;t think of what it is. So, we don&#39;t really have wizards so much as like dialog panels that help you quickly do something, and it&#39;s all keyboard supported, so you quickly do something like extracting a method, or adding a parameter to the method, or something like that. So, in terms of the big tool, that does everything for you, IDEA&#39;s not going to become that. But we do have another product called Fabrique, which we&#39;re working on, and it&#39;s idea is similar to the Sun Java Creator Studio for helping to make web application development easier to do by using a tool, as opposed to something like a framework like Rails or Struts, or something like that, which is supposed to help you in terms of productivity by providing tools for hand-coders. But this one is more for quickly developing using a GUI tool to help you do websites.&lt;br /&gt;&lt;br /&gt;JP: Okay. Alright, let&#39;s move into some of the more fun stuff, architecture in particular. IDEA has strong support for J2EE and EJBs. Can you talk a little bit about that?&lt;br /&gt;&lt;br /&gt;RH: So, in fact, IDEA 4, I believe it was 4, started to introduce support for J2EE, and IDEA 5 has really made that its major focus -- this is the latest version of IDEA. First of all, in IDEA 4, we had EJB configuration tools to help you with that. There was support for some refactoring, for renaming things. There was some support for JSP, and HTML and XML, but it wasn&#39;t quite integrated. So what we did was -- IDEA 5 has a lot more support, especially on the web development side, especially with JSPs and embedded CSS and JavaScript and HTML and the JSP 2 expression language. What we did to do that is we introduced a Language API, which allows anyone to develop plugins for any language, and you can add support for some refactoring, code navigation, finding usages, and highlighting usages, and syntax highlighting, and all sorts of stuff -- and inspections, and that kind of thing. We did that, that was a major undertaking for IDEA 5, and that will be the foundation for our future J2EE development support. We also have support for WebLogic and Tomcat integration built-in, and there are others available, and you can add support for any generic web app server. I think there&#39;s some JSR to cover the compatibility there, and we follow that spec. And I think that&#39;s about it.&lt;br /&gt;&lt;br /&gt;JP: Great. What do you have now, and what do you have planned for EJB 3.0, the upcoming EJB spec, in IDEA?&lt;br /&gt;&lt;br /&gt;RH: Well, we haven&#39;t decided yet. A lot of our developers are on vacation right now. But we will definitely support the EJB 3 spec. And the question is really, what exactly, how exactly we&#39;ll support it. I would have to say, or guess, that it will include some EJB-aware refactorings and navigation and configuration, helping you with the different annotation, and providing inspections about the proper usage of EJBs, and that kind of thing. So, this is a work in progress, and I don&#39;t know, is the spec even finished yet? I&#39;m not aware of that.&lt;br /&gt;&lt;br /&gt;JP: It&#39;s getting pretty close. It&#39;s in the final draft stages and stuff like that. JBoss and Oracle both have preview editions out there to mess with right now, but it&#39;s not finished yet.&lt;br /&gt;&lt;br /&gt;RH: Well, when it solidifies, we&#39;ll definitely look into how we can support that. It will definitely be part of IDEA.&lt;br /&gt;&lt;br /&gt;JP: We also had Bruce Tate on for a really fun interview in the last episode, and he was pushing alternate simplified frameworks like Spring and Hibernate, in that. I wonder, does IDEA have any support for that? Are there any plugins that allow you to do Spring and Hibernate and alternative frameworks in IDEA?&lt;br /&gt;&lt;br /&gt;RH: This has currently not been a primary focus of IDEA. We do have some small support for Spring, which I can&#39;t recall exactly what it is, but we do have some small support for Spring. I think it&#39;s some sort of reference linking, being able to navigate, or something. I&#39;m not sure exactly. But there are third-party plugins. All of them are free, that I can think of. For instance, there&#39;s Live Templates for Hibernate, for writing your XDoclet tags. There&#39;s a couple of plugins for Spring. One is Spring Console, which I think works in any IDE. The other one is called IdeaSpring, which can be downloaded directly from IDEA&#39;s plugin manager, and that offers some features like configuration and navigation like jumping to declarations and for ref and alias tags, and that kind of thing, and auto-scroll from source. And that&#39;s being developed, also I think that&#39;s from someone in our IntelliJ community, has developed that.&lt;br /&gt;&lt;br /&gt;JP: Great. Actually Bruce spoke very highly of IDEA. That&#39;s his IDE of choice. I just thought I&#39;d throw that in. We had a brief conversation prior to the interview about that, and he really likes what you guys are doing.&lt;br /&gt;&lt;br /&gt;RH: Oh, I should mention that I met Bruce Tate at JavaOne 2004. He was there, he had his book, Better Faster Lighter Java, and he signed a copy for me. So that was fun.&lt;br /&gt;&lt;br /&gt;JP: Oh great. He&#39;s a nice guy, great guy to talk to actually.&lt;br /&gt;&lt;br /&gt;RH: Yeah, he&#39;s great.&lt;br /&gt;&lt;br /&gt;JP: Okay, so you&#39;ve mentioned a couple of times that IDEA does refactoring very well. Can you give a couple of brief examples of refactorings that are possible in IDEA, but not in other IDEs like Eclipse.&lt;br /&gt;&lt;br /&gt;RH: Okay. It&#39;s kind of a case of, you know, if you compare feature by feature, then in most cases, Eclipse has many of the features IDEA has. But that&#39;s not what keeps people coming back to IDEA. It&#39;s not a feature list thing. I really believe that it&#39;s not so much about feature lists anymore. It&#39;s more about usability, and productivity. There are a couple IDEA-only refactorings, but I&#39;ll just briefly mention them, because I don&#39;t think that&#39;s the key to understanding what IDEA&#39;s about. So a couple are: Change Class Signature, if you have a generic class and you want to change the type parameters, the order of the parameters, or how many there are, et cetera. There&#39;s Safe Delete, which is being able to delete any class or any file you want to delete, without -- it checks first if there&#39;s references. There&#39;s being able to Replace Method Code Duplicates, so if there&#39;s a method existing in your class, and then many parts of the class also duplicate the functionality of that method, you just call this refactoring and it will replace all of those parts with a call to the method instead. There&#39;s Extract Superclass, which allows you to create a class in between two classes in a hierarchy very quickly. But I think that&#39;s not really the important difference here. The difference that I think is most important is how usable and how productive are these refactorings. So, the major differences there that I see is in, say, Eclipse, that if you have errors in your code, let&#39;s say you have a minor syntax error in some method, you can&#39;t rename that method. If you have a missing semicolon or something. You have to fix all the errors and then you can do your refactoring. For me, that is a major difference. You really have to try it to see what I mean, because if I just talk to you about it, it doesn&#39;t seem to sound very important, but so many times I&#39;ve tried to use Eclipse, and I just get completely frustrated when there&#39;s some minor error somewhere, that I forgot to finish typing a name, but I want to extract some variable or method or something, and it won&#39;t let me do it. It says you have to fix the errors first. It completely gets me out of my flow, and I have to think in a different context, I have to switch contexts. Also, Eclipse is a little bit more unsafe than IDEA. For instance, you can&#39;t always undo refactorings, and when you can, sometimes it requires you to undo in every file the refactoring that was effected. Often times, you need to manually fix code after refactoring in Eclipse. We have some examples of that, but I can&#39;t think of them off the top of my head. We have more mature refactorings, like for instance Move Method. Move Method will handle cases such as inner classes in IDEA, where that is not handled properly in Eclipse.&lt;br /&gt;&lt;br /&gt;JP: Okay.&lt;br /&gt;&lt;br /&gt;RH: So, basically what I&#39;m saying is that, it&#39;s not a matter of, you know, checking off, feature by feature and saying &quot;Oh, this feature list is longer than that one,&quot; because that&#39;s not what&#39;s really important. What&#39;s important is, when you&#39;re developing in your day-to-day, you know, everyday programming time, that you want it to be as productive as possible. You don&#39;t want to be wasting time trying to fix the IDE&#39;s problems. The IDE should be fixing your problems. So, what else is there? Yeah, there&#39;s some other minor differences, but really it&#39;s the productivity that I think should be emphasized.&lt;br /&gt;&lt;br /&gt;JP: Okay. I think that probably covers the majority of the next question I had, which was the question about the difference between -- or the benefits of static code analysis versus the automatic compilation on save that Eclipse has, and I think that probably rounds that off, unless you&#39;ve got anything you want to add to that.&lt;br /&gt;&lt;br /&gt;RH: Actually, I don&#39;t think it covers it at all, really.&lt;br /&gt;&lt;br /&gt;JP: Oh, okay.&lt;br /&gt;&lt;br /&gt;RH: This is one of these, kind of -- what do you call it? Like a &#39;diamond in the rough&#39; feature. Unless you&#39;ve seen it, it&#39;s really hard to explain what&#39;s going on. But I&#39;ll try to explain as best as I can. So, IDEA has 500 static code analysis, let&#39;s call them modules, or features. So, compiler errors are one thing. Eclipse, when you save, it automatically compiles, it lists certain errors. Most of those are compiler errors. Eclipse has about 30 other errors that it will -- not necessarily errors, but problems, that it will show up. But IDEA has 500, and these cover such a wide range of topics. It&#39;s not just possible errors, but it&#39;s things like internationalization issues, JUnit issues, J2ME issues, performance issues, serialization, threading, all sorts of stuff. And on top of that, it has some really great stuff, like there&#39;s a new inspection for highlighting in your code possible NullPointerErrors. We use a special annotation for that, for Java 5. It does things like code style issues. So it helps you highlight instantly in your code if you&#39;re violating some naming convention. Or say you&#39;re in one package, and you accidentally use a class in another package, and your project design has been set up by your team in such a way that you&#39;re not supposed access that package from the other package. That&#39;s a package dependency violation. So we have an inspection that will highlight that automatically. You just configure the package dependency rules that you want to set, and it will highlight that. Also it will show you a lot of redundant code things, like redundant if statements. This loop doesn&#39;t do anything, or redundant assignments of variables. So if you say like, a = a;, which sometimes happens when you intended to assign a field the value of some parameter, and you say &#39;field a equals a&#39;, but you forgot to put this.a, so it&#39;ll highlight that problem. And there&#39;s so many others, that it&#39;s just really -- this is one of the killer features of IDEA, and you really have to try it and see it to understand how it helps. What the basic benefits of this is that it drastically reduces common errors. It won&#39;t find major design errors, but it will find some design errors, like I said with the dependency violations, but also some class abstraction issues, or if you have encapsulation problems, like if you&#39;re exposing too many fields or something like that. It also helps you with things like migrating to Java 5. For instance it&#39;ll highlight for loops that are using the old style for loop and show you that you can replace this for loop with the new type of for loop. And in fact you can do it just by hitting one key and pressing Enter and it will automatically replace it for you. So a lot of these inspections are also attached with what&#39;s called a Quick Fix, which is different than the Eclipse Quick Fix. First of all it highlights in your code, and the Quick Fix will let you quickly apply whatever solution is suggested. First of all you reduce common errors, second you help improve your design, and the great thing about this is you do it as you go. So, you&#39;re working on your class, and you see all these things highlighted, you just clean up as you go. It&#39;s kind of like refactoring as you go. It&#39;s just something you should do as a continuous process. So, instead of waiting once a week and having a code review, you can have an 80% code review all the time, and then once a week you can have a code review to cover the rest of the 20% that automated code inspections can&#39;t handle. So, it saves you time, saves your time in code reviews, saves you time dealing with errors. I would say this is IDEA&#39;s killer feature, at this point.&lt;br /&gt;&lt;br /&gt;JP: Okay. I have seen some capabilities from PMD analysis plugins available for other IDEs, but I do think, from the sound of the description you just gave, it does go a fair bit further than those. That&#39;s good.&lt;br /&gt;&lt;br /&gt;RH: Yeah. The difference is, PMD does have more checks than Eclipse, but IDEA&#39;s is more complete, and PMD I don&#39;t believe it has quick fixes. It certainly doesn&#39;t have as many as IDEA&#39;s has. And IDEA&#39;s, it&#39;s all built into the editor, so these things work with all sorts of various things that PMD only, I think, only works on Java classes. For instance, IDEA&#39;s works in HTML files, and JSPs. You get all your same inspections in all your JSPs, if you have any scriptlet code in there. Also, it has CSS inspections. I could go on and on.&lt;br /&gt;&lt;br /&gt;JP: Okay. Now we&#39;re going to move into the section of the interview where I&#39;ve written some questions down that I kind of want to get some answers to as well.&lt;br /&gt;&lt;br /&gt;RH: Sure.&lt;br /&gt;&lt;br /&gt;JP: These will be a little more off the wall. But first of all, a particular interest of mine right now is scripting languages for the JVM. This is something I&#39;ve found to be really very productive in recent projects. Particularly, Groovy is one that I&#39;ve latched onto for its excellent XML and SQL support. I know there&#39;s a Groovy plugin for IDEA, because I was looking around recently to see what kind of capabilities it had, but at the moment it seems like it&#39;s limited mainly to syntax colouring and basically invoking the Groovy compiler. Are there any plans, do you know, to beef up scripting support for Groovy or other scripting languages? In particular, one of the things that I&#39;m still waiting for from any IDE is a really good debugging solution for Groovy. So, any plans to do anything like that?&lt;br /&gt;&lt;br /&gt;RH: Yeah. Our current plans are to support JavaScript as much as possible. And we provide this Language API, as I mentioned before, to allow other people to write plugins for other languages, and someone in our community has written the GroovyJ plugin, and it&#39;s more than just highlighting. I believe it also has code completion, and brace highlighting, and navigating between references, and this kind of thing.&lt;br /&gt;&lt;br /&gt;JP: Oh, it may have moved on a little bit, since last I last looked at it. That&#39;s great.&lt;br /&gt;&lt;br /&gt;RH: I think it has. It&#39;s using quite a lot of the Language API. And we&#39;re going to open up more of the Language API as we go, as we&#39;re able to make it more modular. Definitely, Groovy is going to be a big upcoming -- it&#39;s kind of like the competitor to Ruby on the Java side. So I think it&#39;s going to become pretty popular, and this will definitely be a major thing that we&#39;ll support. Basically, we&#39;ll be looking for people to write language plugins and have them give us feedback and tell us what problems they&#39;re having with the Language API, and what capabilities they need, and this kind of thing. So, we&#39;ll be developing the Open API, and other people will be using it. And we&#39;ll be using JavaScript as our internal test case for that. So, in terms of Groovy itself, as far as I understand it, Groovy classes are transformed into Java classes.&lt;br /&gt;&lt;br /&gt;JP: Basically, the thing that really attracts me about Groovy is you can take virtually unmodified Java code and execute it under Groovy. But then you can start dropping out a lot of the type safety and using more of the dynamicism and stuff like that. But it also compiles up to Java classes. That, coupled with the good XML and SQL, are kind of the reasons I really like that particular scripting language right now.&lt;br /&gt;&lt;br /&gt;RH: Right. So, in terms of that, I think there&#39;s the possibility -- and I was talking to Eugene Zhuravlev, who is one of our main developers, and he was telling me -- that if Groovy can generate debug info that meets the JSR 45 specification, then we can definitely add debug support to it. Now, it might not be possible right away in version 5, but we&#39;ll be definitely looking into this. It&#39;s something pretty important, I think, to this kind of support for these languages. So, you&#39;d be able to set breakpoints and step over Groovy code, just like you would in JSP, for instance. We&#39;re definitely looking into that -- other languages. We&#39;re also looking into supporting XML-specific languages. There are so many different dialects of XML. I don&#39;t know if we&#39;ve planned this specifically, but we&#39;re thinking of planning support specifically for XML languages to make it easier to create your own XML languages and provide IDE support: Refactoring, navigation, highlighting, and all that stuff, code folding, everything --&lt;br /&gt;&lt;br /&gt;JP: Great.&lt;br /&gt;&lt;br /&gt;RH: Reformatting. Other language that are possible are Python, Ruby. Regular expressions, I think we already have a plugin for that. XPath, we already have a plugin for that. And your own custom languages.&lt;br /&gt;&lt;br /&gt;JP: Excellent. I look forward to that, seeing what happens there. Okay, we&#39;re going to get into an area where I&#39;ve gotten myself into a little bit of trouble recently -- not just with you, a number of people have emailed me on this one. As a hobbyist developer, I work on the occasional small side project, and generally whatever I create -- saying I release it under the GPL is probably a bit grandiose, I usually push it out, let&#39;s see if anybody&#39;s interested, and it&#39;s GPL&#39;d. It doesn&#39;t usually release as much as whimper and die. Anyway, given that, what options are open to me for using IDEA? Could I use the non-commercial license, and what would I have to do in order to use it?&lt;br /&gt;&lt;br /&gt;RH: Okay. We do have an open source license, and there are some restrictions on it. First of all it has to be non-commercial open source, meaning it&#39;s not for profit, and also it has to meet the open source definition, it has to have a dedicated website, and an active community. As a hobbyist, it&#39;s not likely you&#39;re going to have a dedicated community if you just start right away.&lt;br /&gt;&lt;br /&gt;JP: Right.&lt;br /&gt;&lt;br /&gt;RH: It&#39;s not as broad as it could be, but it is available. I think at least 60% of the Apache -- is it Apache projects? I&#39;m pretty sure. You can check our website. We have a page dedicated to that. Approximately 60% of the Apache projects using Java are using this open source license. And hundreds of other projects as well. And it&#39;s easy to apply, you just go to the website, you provide some information, and you get a one year renewable license for all the members of your project. But in terms of a hobbyist, we currently do not have a simple non-commercial license yet. I have considered that, and I&#39;m kind of torn between the two possibilities as to whether or not it would be a good idea for our company in the long run to have a cheap, or a free. non-commercial license for everybody. But anyway, we&#39;re looking into that. In fact, I just read the other day an editorial by Rick Ross from Javalobby, who talks pretty closely about this subject. It was interesting to read his opinion, which was basically that it would be bad to do that, but I don&#39;t know, I&#39;m torn. In my opinion, it could be a good idea, but we have to look into that.&lt;br /&gt;&lt;br /&gt;JP: Okay. So basically the other option here is to actually -- for my hobbies, is to stump up the full price of $500. Given that, let&#39;s say I&#39;ve got $500 and strictly this is, you know, for my own use, it&#39;s for messing around within my spare time. I have the choice of buying some hardware -- I actually went through this recently. Both my AMD 64 bare-bones kit and the Mac Mini I purchased recently came to about that amount. Can you make a case for me buying IDEA instead of one of those? Can you lay it out for me?&lt;br /&gt;&lt;br /&gt;RH: Okay. So, in my personal opinion, that&#39;s really not an issue. $500? Yeah, it&#39;s a lot of money, but I mean, I enjoy programming and I want to use the best tools possible. So, in my personal opinion -- in fact, I did this when I was working at my previous company, I bought a copy of IDEA because my boss wouldn&#39;t buy it. I bought it with my own money, and I used it because I didn&#39;t want to use the other tools that were out there at the time. So finally my boss comes along and says, &quot;You&#39;re using this? Isn&#39;t your evaluation expired?&quot; I said, &quot;No, I bought my own copy.&quot; And he&#39;s like, &quot;Oh really? It&#39;s that good?&quot; And I said, &quot;Yeah, it&#39;s really that good.&quot; And so, he ended up pitching for licenses for the rest of the team. But anyway, that&#39;s my own personal experience. In terms of the general population, I would say that -- well, first of all there&#39;s one thing I should mention. It&#39;s not always $500, because we do occasionally, I think twice a year, we have a promotion for a Personal License, basically exactly what you&#39;re talking about, for half the price, so it&#39;s about $250, which, I don&#39;t know, that&#39;s really not a lot of money. And anyway, even if that is a lot of money for you, you can think of this analogy, which I mentioned to you in the email before. If you&#39;re a hobby bicyclist, and you decide -- you have a choice, you can ride in the city on a simple, cheap city bike, or you ride rough and fast on a mountain bike in the wilderness. You have a choice, what do you want to do? Some people are content riding in the city. They don&#39;t have a need to go on rough and fast terrain, right? So, that&#39;s an option, you can go for that. But, you know, you shouldn&#39;t expect -- just because there are city bikes that are out there that are cheap, or even used, you shouldn&#39;t expect bike makers, who make high-performance mountain bikes to make them cheap, just because there&#39;s cheap competition out there. What I would say is that, you have an option with IDEA. You have an option to try it for 30 days, see if you like it. And if you don&#39;t like it, you don&#39;t have to buy it. Or if you don&#39;t have the money, you don&#39;t have to buy it. It&#39;s kind of like, if you&#39;re happy with your city bike, and somebody says, &quot;Here, you can try this mountain bike for 30 days for free. You don&#39;t have to buy it.&quot; Now the choice is, are you going to take that offer, or turn it down just because it has a price tag on it if you decide to buy. Personally, it would be a no-brainer for me. I would try it, because I like riding bikes -- or I like programming, and I want to see what the best tools out there are. Even if it&#39;s just to do some research for my professional job. I want to at least know what&#39;s out there. I try NetBeans, I try Eclipse, I try JBuilder, I try the other IDEs, and then from that knowledge I can pick the one that I like the best, and the one that suits me the best. So, that&#39;s how I would council people who are deciding. Try the IDEs, you can try them all free, and pick the one that you like the best. The other thing is that it&#39;s kind of like buying a Mac versus buying a Windows PC. People pay a little bit of extra money for a Mac. Why do they do that? It&#39;s because they enjoy using it. Even if you are just buying it for your own personal use, a lot of people they choose to buy a Mac because they prefer it. That&#39;s my opinion. I think that usability is a feature worth paying for, even if it&#39;s only for your own personal use. This is not a $5000 thing, it&#39;s not a $10,000 thing. It&#39;s only $500 and if you catch the yearly specials then you can get it for cheap for $250. And the last thing I&#39;d like to say about this is that I think the reason I enjoy programming is because of something called flow, the mental state called flow. Your listeners can look it up on the C2 wiki, that&#39;s the original WikiWiki. It talks about this mental state you get in when you&#39;re highly focused, and even athletes have a thing called &#39;in the zone&#39;, which is very similar. You know, when you&#39;re deep in a problem in programming, and you&#39;re just chugging along, and you&#39;re just churning out code. It really is an enjoyable experience, and I think that&#39;s worth a little bit of my money to get that. And this is one of the things that IDEA focuses on, making programming so fluid and productive that you can get in flow, and you can stay in flow. It doesn&#39;t get in your way. It provides simple features that you can use at your whim. It gives you more control over the code. The more control you have, the more you can get into flow. It&#39;s like a programmer high. It&#39;s like a drug, in a way. It think this is why we have such loyal fans, because this is what it focuses on. It doesn&#39;t focus on being some platform for everything but nothing in particular, it focuses on being a Java IDE so you can get right in there and do your coding.&lt;br /&gt;&lt;br /&gt;JP: I would just very gently offer a slight counterpoint on this one, my own personal feelings on it. Being the kind of developer that I am within the company I am, I always have a list of things as long as my arm that I&#39;ve got to sit down and research at some point. And just knowing that if I do decide to use it, I am going to have to pay this fee, it just shuffles it down the list there a bit. I&#39;m constantly searching for more time to learn new frameworks and new things that can help my job. This is one of those, it&#39;s not the only one. It just kind of shuffles it down the list. I think for me, something for personal use, and I am talking about personal non-commercial use -- I don&#39;t think $500 is out of line at all for anything that is corporate-used. In fact most frameworks, or most tools, cost a lot more than that. But for personal use, I&#39;ve probably got a cut-off of about $100 maximum. I kind of look for the $50 to $100 -- it doesn&#39;t matter if it lacks things like full team capabilities, or stuff like that, for personal use. It&#39;s just I want to be able to get into it at a slightly more comfortable level. Personally, I find $500, I can get some pretty good hardware with that. Maybe it&#39;s just me, but I don&#39;t think I&#39;m the only one out there. That&#39;s what I guess I&#39;m trying to get across there.&lt;br /&gt;&lt;br /&gt;RH: No, I agree. For some people it&#39;s not worth it, because that&#39;s their own personal feelings about it. And the only thing that I would say is, make that an informed decision. Try it, because it&#39;s free to try it. And while you&#39;re trying it, there&#39;s no obligations. There&#39;s nothing stopping you from trying it.&lt;br /&gt;&lt;br /&gt;JP: Okay. Moving on, is there any kind of direct customer, or potential customer, feedback or forum, where developers can come and talk to you about what&#39;s available and maybe ask for stuff that they&#39;d like to see in IDEA?&lt;br /&gt;&lt;br /&gt;RH: Yeah there is, and in fact this is actually one of the big things that makes IDEA what it is today. We have a fairly large community. It&#39;s not as big as Eclipse, or -- I&#39;m not sure about the NetBeans size -- but it&#39;s a fairly large community, it&#39;s customers, people who are just trying IDEA. And we have two websites. One is called intellij.net, and the other one is intellij.org. I would suggest, if anyone is interested, to go to intellij.net first. There&#39;s also, of course, for our customers we have full support. We have a dedicated support page for that, and a dedicated team for that. But the community is really the big factor here, that I would like to talk about. We have an interesting development process. Remember I mentioned I was a fan of -- I still am a fan of agile methodologies, like Scrum and Extreme Programming, and you know, I wanted to know how does this company develop this product, because it was developing features really super-fast, and they were good features, and it was very impressive. And I think to a large extent we are able to maintain that kind of turnaround. So I wanted to know, how does this company develop its software. So that&#39;s one of the reasons I joined the company. As it turns out, the method we use is called the Early Access Program, and we have a dedicated website for that, it&#39;s under the intellij.net website. We have forums and newsgroups that go along with this. Anyway, the Early Access Program -- basically what you do is, as we&#39;re developing the next version, you can get free licenses. Anyone can get a free license, as we&#39;re developing the next version. There&#39;s no strings attached. We do ask that you try to submit bugs and everything. We do tell you that it&#39;s not going to be perfect. It&#39;s not going to be fast, because we sacrifice performance while we&#39;re developing new features; we tune up the performance near the end. But what we end up with is a large community of people who are trying IDEA everyday, trying the new versions, and submitting reports, not just bug reports but feature requests, and we listen to them. So, if there&#39;s enough support for a feature request, we&#39;ll put it in. And in fact, a lot of the time it can happen very quickly, within a couple of weeks sometimes -- or within a few days sometimes. So, this is a very important -- I can&#39;t stress it enough -- it&#39;s a very important factor in why IDEA is what it is today, because we have a lot of people who use it all the time, and are really testing it, pounding it, trying it, and giving us feedback. And the important thing is that we listen to the feedback, and we make the changes, and post new builds every week or two, or sometimes every few days depending on the situation. So, yeah, we do have ways that you can get in touch with other people who are using IDEA, ask questions, get support. I would say go to the website and you can find it from there, jetbrains.com or intellij.net.&lt;br /&gt;&lt;br /&gt;JP: Great. Thank you. Okay, well that&#39;s really the end of the questions I&#39;ve got. Is there anything else you want to talk about, concerning anything, Java development in general, or IDEA, or anything like that?&lt;br /&gt;&lt;br /&gt;RH: Yeah. This is a thread that&#39;s been going through my mind for quite a while. I listened to Bruce Tate&#39;s interview and, you know, he&#39;s talking about &#39;beyond Java&#39;, what&#39;s coming up. His attitude is that you shouldn&#39;t settle for the status quo. Just because the J2EE and EJB is &quot;the way you should do it&quot; doesn&#39;t mean that&#39;s the way you should do it. You should look for other alternatives out there. So, there&#39;s a lot of really interesting, exciting stuff coming up. Not just in the Java space, but in the entire development space. Things like Ruby on Rails, Groovy, even C# and .Net. There&#39;s so many new things that are coming up. We&#39;re working on something called Language Oriented Programming; I won&#39;t go into that, but it&#39;s an interesting thing. So, I&#39;d just like to say that I think that people should not settle for the status quo. Raise your expectations. See what&#39;s out there. Just because you&#39;re doing something a particular way right now, you know, there might be a better way of doing it. So, you know, go out and look for alternatives. You might be pleasantly surprised.&lt;br /&gt;&lt;br /&gt;JP: Actually, one more question has occurred to me here. I thought about writing this one down, never put it in there. I noticed that both you guys and the NetBeans team are based in Prague. It just seems an unusual coincidence, that. Do you guys have food fights and lob things at one another, or is there any kind of story behind that, or is it just coincidence?&lt;br /&gt;&lt;br /&gt;RH: Hmm, I&#39;m trying to think of the history now. I believe it&#39;s a coincidence, because Sergey Dmitriev was in Prague, he was working for TogetherJ, and he split off and started JetBrains, or IntelliJ at the time. And I think the NetBeans guys were independent. And the funny thing is -- oh no, I&#39;m sorry, I&#39;m thinking of something else. Yeah, the NetBeans guys are independent, and I&#39;m not sure how their history -- like how they started and everything, but apparently some guy started it, and Sun picked it up. It&#39;s just independent.&lt;br /&gt;&lt;br /&gt;JP: Okay.&lt;br /&gt;&lt;br /&gt;RH: But, you know what, I&#39;ve never met any of them. In fact, most of our development goes on in St. Petersburg now. It started here, but most of the development is in St. Petersburg, Russia.&lt;br /&gt;&lt;br /&gt;JP: Okay. Well, thank you very much, Rob. That was an excellent interview, and hopefully it will be up fairly shortly, certainly in the next week.&lt;br /&gt;&lt;br /&gt;RH: Thanks a lot, Dick.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/112784260746559270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/112784260746559270' title='37 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/112784260746559270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/112784260746559270'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2005/09/intellij-idea-interview-transcript.html' title='IntelliJ IDEA interview transcript'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>37</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-112740508234384816</id><published>2005-09-22T18:02:00.000+02:00</published><updated>2005-09-22T18:04:42.350+02:00</updated><title type='text'>Java Posse Interview: IntelliJ IDEA</title><content type='html'>In this &lt;a href=&quot;http://javaposse.com/index.php?post_id=22795&quot;&gt;interview with Dick Wall&lt;/a&gt; of the &lt;a href=&quot;http://javaposse.com/&quot;&gt;Java Posse&lt;/a&gt;, I discuss the IDE marketplace and how &lt;a href=&quot;http://www.jetbrains.com/idea/&quot;&gt;IntelliJ IDEA&lt;/a&gt; competes versus Eclipse, NetBeans, and JBuilder.&lt;br /&gt;&lt;br /&gt;Other topics include SWT vs. Swing, component-based development, and new features of IDEA 5.0 such as web development support, the Language API, code inspections and highlighting, etc.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/112740508234384816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/112740508234384816' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/112740508234384816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/112740508234384816'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2005/09/java-posse-interview-intellij-idea.html' title='Java Posse Interview: IntelliJ IDEA'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-112731481247063559</id><published>2005-09-21T17:00:00.000+02:00</published><updated>2005-09-21T17:00:12.490+02:00</updated><title type='text'>New Java podcast! The Java Posse</title><content type='html'>&lt;a href=&quot;http://www.voiceoftheresistance.com/&quot;&gt;Dick Wall&lt;/a&gt;, who co-hosted JavaCast, has started a new podcast all about Java. &lt;a href=&quot;http://www.javaposse.com/&quot;&gt;The Java Posse&lt;/a&gt; plans to avoid the catastrophic fate of JavaCast by raising the &lt;a href=&quot;http://c2.com/cgi/wiki?BusNumber&quot;&gt;Bus Number&lt;/a&gt; from 1 to 3. Dick is joined by co-hosts Tor Norbye (Sun), and Carl Quinn (Google), all of whom have access to keep the show going without any problems.&lt;br /&gt;&lt;br /&gt;Assuming everything goes well, &lt;a href=&quot;http://idea-log.blogspot.com/2005/09/javacast-growth-phenomenal.html&quot;&gt;this is going to be huge&lt;/a&gt; for the mainstream Java community. Podcasts are a great way to keep up with all the news in the industry, and the Java industry is quite big. JavaCast went from nothing to 40,000 subscribers in a month. I predict the same or better for the Java Posse. As the guy in charge of content for JavaCast, Dick has shown that he&#39;s got his finger on the pulse of the Java world. And I like the way he&#39;s willing to express his opinions without simply echoing the hype and buzz phrases that can dominate many other Java-related sites and news sources.&lt;br /&gt;&lt;br /&gt;The interview segments on JavaCast were great, too, and Dick plans to keep that going in the Java Posse, with the difference that interviews will be separate mp3 files from the news segments. When I had my interview with Dick about &lt;a href=&quot;http://www.jetbrains.com/idea&quot;&gt;IntelliJ IDEA 5.0&lt;/a&gt;, I was very impressed with his questions. He wasn&#39;t afraid to ask the tough questions about IDEA versus Eclipse and NetBeans, and about the whole IDE industry, and where IDEA stands there. &lt;br /&gt;&lt;br /&gt;I can&#39;t wait for the first episode. With (at least tacit) support from Sun and Google, this is &lt;i&gt;the&lt;/i&gt; Java podcast to listen for.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/112731481247063559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/112731481247063559' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/112731481247063559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/112731481247063559'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2005/09/new-java-podcast-java-posse.html' title='New Java podcast! The Java Posse'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-112559143317270224</id><published>2005-09-01T18:18:00.000+02:00</published><updated>2005-09-13T16:39:57.236+02:00</updated><title type='text'>JavaCast Growth Phenomenal</title><content type='html'>&lt;i&gt;&lt;b&gt;Important update:&lt;/b&gt; In one of those ironic twists, shortly after I posted this, Brandon Werner completely lost interest in the JavaCast and took down the whole site, so many of the links below won&#39;t work. Dick Wall, the co-host, has contacted me and is in the process of starting his own podcast about the Java world. Assuming he keeps at it (which I think he will, based on his enthusiasm), my prediction simply transfers over to his podcast, since &lt;b&gt;it&lt;/b&gt; will be the only Java-based podcast at this time. I expect that within about one month, he will have 20,000 to 60,000 subscribers, depending on how well he can manage promotion and infrastructure. Finally, the interview I had with Dick will appear on his show instead.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I never really understood podcasting until I found &lt;a href=&quot;http://javacast.thepostmodern.net/&quot;&gt;The JavaCast&lt;/a&gt;. How could this show come out of nowhere to reach over 40,000 subscribers in a barely more than a month? The more I think about it, the more it makes sense to me.&lt;br /&gt;&lt;br /&gt;Basically it comes down to this: Newspapers are about broad audiences, blogging is about narrow audiences. Similarly, radio is about broad audiences, podcasting is about narrow audiences. (I guess that leaves then next logical step as vidcasting vs. television? Can&#39;t wait till the technology gets easy enough to just throw together a video interview. That would be wickedly cool.)&lt;br /&gt;&lt;br /&gt;I heard an &lt;a href=&quot;http://www.itconversations.com/shows/detail619.html&quot;&gt;interview with Robert Scoble&lt;/a&gt;, on the awesome &lt;a href=&quot;http://www.itconversations.com/index.html&quot;&gt;IT Conversations&lt;/a&gt; site, and he crystalized the idea in my head. People are itching to hear information relevant to their own personal interests in a timely manner.&lt;br /&gt;&lt;br /&gt;Also, there&#39;s the issue of costs. Instead of requiring a hugely expensive studio and broadcasting license, which forces you to seek a large audience to make up the costs, you can just set up some free software on your own personal machine and do informal interviews and discussions with whoever the hell you want. There&#39;s no need to justify any costs, except perhaps the time it takes to edit the recordings. Almost anyone can do their own podcast for any particular interest they may have.&lt;br /&gt;&lt;br /&gt;So, while podcasting as a phenomenon will be huge, the podcasts themselves will not likely have huge audiences. Well then, how do you explain JavaCast&#39;s huge audience? The answer is simply that there is currently no other podcast dedicated to Java, and the Java &#39;niche&#39; is quite huge. I expect JavaCast&#39;s audience will continue to grow at a huge rate until some competitors appear, at which point, the audience will segment further into specific Java topics like Java EE, client side, security, or whatever.&lt;br /&gt;&lt;br /&gt;In the mean time, I recommend checking out the JavaCast. The latest episode has a great &lt;a href=&quot;http://javacast.thepostmodern.net/2005/08/javacast-bruce-tate-beyond-java.html&quot;&gt;interview with Bruce Tate&lt;/a&gt; about web development technologies, and what&#39;s possible &#39;beyond Java&#39;, which is the topic of &lt;a href=&quot;http://www.amazon.com/exec/obidos/tg/detail/-/0596100949/&quot;&gt;his upcoming book&lt;/a&gt;. I met Bruce briefly at JavaOne 2004, and he signed my copy of &lt;i&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/tg/detail/-/0596006764/&quot;&gt;Better, Faster, Lighter Java&lt;/a&gt;&lt;/i&gt;. Cool guy. &lt;br /&gt;&lt;br /&gt;I just finished recording an interview with Dick Wall of the JavaCast, about &lt;a href=&quot;http://www.jetbrains.com/idea/&quot;&gt;IntelliJ IDEA 5.0&lt;/a&gt;, and how it compares to &lt;a href=&quot;http://www.eclipse.org/&quot;&gt;Eclipse&lt;/a&gt; and &lt;a href=&quot;http://www.netbeans.org/&quot;&gt;NetBeans&lt;/a&gt;. That should be coming up in one of the next episodes.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/112559143317270224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/112559143317270224' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/112559143317270224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/112559143317270224'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2005/09/javacast-growth-phenomenal.html' title='JavaCast Growth Phenomenal'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-112179507072556642</id><published>2005-07-19T19:45:00.000+02:00</published><updated>2005-07-19T19:44:30.730+02:00</updated><title type='text'>IntelliJ IDEA 5.0 RC1 Released: Get a Free Taste!</title><content type='html'>The countdown has begun. The &lt;a href=&quot;http://www.jetbrains.com/idea/features/newfeatures.html&quot;&gt;features&lt;/a&gt; are frozen. All that&#39;s left are bug fixes and performance tuning. Check out IntelliJ IDEA 5.0 for yourself in the &lt;a href=&quot;http://intellij.net/eap/&quot;&gt;Early Access Program&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;(Note: The &quot;What is the Irida project?&quot; page is out of date. The official list of new features is &lt;a href=&quot;http://www.jetbrains.com/idea/features/newfeatures.html&quot;&gt;here&lt;/a&gt;.)</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/112179507072556642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/112179507072556642' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/112179507072556642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/112179507072556642'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2005/07/intellij-idea-50-rc1-released-get-free.html' title='IntelliJ IDEA 5.0 RC1 Released: Get a Free Taste!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-111895156937363424</id><published>2005-06-16T21:55:00.000+02:00</published><updated>2005-06-17T14:30:54.906+02:00</updated><title type='text'>JetBrains sparks a new era of programming with the first public EAP of MPS</title><content type='html'>From JetBrains:&lt;br /&gt;&lt;br /&gt;&quot;After months of intense development, it&#39;s finally here! The new language workbench code-named the &lt;a href=&quot;http://www.jetbrains.com/mps/index.html&quot;&gt;Meta-Programming System&lt;/a&gt; (MPS) has been &lt;a href=&quot;http://jetbrains.net/confluence/display/MPS/Welcome+to+JetBrains+MPS+Early+Access+Program&quot;&gt;opened to public review&lt;/a&gt;, in JetBrains&#39; renowned Early Access Program (EAP).&lt;br /&gt;&lt;br /&gt;This new tool represents the future of software development, as expressed by Sergey Dmitriev&#39;s vision of &lt;a href=&quot;http://www.onboard.jetbrains.com/is1/articles/04/10/lop/&quot;&gt;Language Oriented Programming&lt;/a&gt;. Language Oriented Programming (LOP) is a style of programming in which specialized programming languages and environments are developed in conjunction with programs, giving more freedom and power to the programmer, ultimately making programming easier, more fun, and more productive.&lt;br /&gt;&lt;br /&gt;Language Oriented Programming, and related initiatives, has been gaining momentum in recent months, with interesting developments by Microsoft, Intentional Software, Xactium, and several others. It is now clear that this is the right direction for software development to head into the future.&quot;&lt;br /&gt;&lt;br /&gt;I&#39;ve posted an &lt;a href=&quot;http://www.javalobby.org/java/forums/t19155.html&quot;&gt;article on JavaLobby&lt;/a&gt;, so you can join the discussion there.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/111895156937363424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/111895156937363424' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/111895156937363424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/111895156937363424'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2005/06/jetbrains-sparks-new-era-of.html' title='JetBrains sparks a new era of programming with the first public EAP of MPS'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-111875221134848440</id><published>2005-06-14T14:30:00.000+02:00</published><updated>2005-06-14T14:30:11.353+02:00</updated><title type='text'>Language Workbenches: The Killer-App for Domain Specific Languages?</title><content type='html'>Martin Fowler gives an excellent pragmatic view of Language Oriented Programming and what he calls &#39;language workbenches&#39; in his &lt;a href=&quot;http://martinfowler.com/articles/languageWorkbench.html&quot;&gt;latest article&lt;/a&gt;. As usual, Fowler is somehow able to put big ideas into plain language.&lt;br /&gt;&lt;br /&gt;The article is actually a collection of related articles, &lt;a href=&quot;http://martinfowler.com/articles/mpsAgree.html&quot;&gt;one of which&lt;/a&gt; shows an example of using JetBrains&#39; research project, the &lt;a href=&quot;http://www.jetbrains.com/mps/&quot;&gt;Meta Programming System&lt;/a&gt;. For the &#39;big vision&#39; of Language Oriented Programming, be sure to read &lt;a href=&quot;http://www.onboard.jetbrains.com/is1/articles/04/10/lop/&quot;&gt;Sergey Dmitriev&#39;s article&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/111875221134848440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/111875221134848440' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/111875221134848440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/111875221134848440'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2005/06/language-workbenches-killer-app-for.html' title='Language Workbenches: The Killer-App for Domain Specific Languages?'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-111697660394424489</id><published>2005-05-25T01:00:00.000+02:00</published><updated>2005-05-25T01:19:41.230+02:00</updated><title type='text'>Geoffrey Moore: Firefox is crossing the chasm</title><content type='html'>Geoffrey Moore, author of &lt;a href=&quot;http://www.amazon.com/exec/obidos/tg/detail/-/0060517123/&quot;&gt;Crossing the Chasm: Marketing and Selling Technology Products to Mainstream Customers&lt;/a&gt;, presented at the Open Source Business Conference 2005, titled &lt;a href=&quot;http://itconversations.com/shows/detail494.html&quot;&gt;Open Source Has Crossed the Chasm...Now What?&lt;/a&gt; (you can download or stream the talk for free, no registration  required). In this talk, he briefly mentions Firefox:&lt;br /&gt;&lt;blockquote&gt;Firefox, I think is in the chasm. You say, &quot;Well, how is that possible? It&#39;s the hottest thing in the place.&quot; But it&#39;s hot with all the early adopters and I don&#39;t think it&#39;s crossed the chasm. ... By the way, getting to the chasm is progress. It really is. You know, people are into chasm denial, but the truth of the matter is, getting to the chasm means you have achieved a constituency in the early market that worked, but now the problem is you&#39;ve got to make a transition, and what appealed to that first group of people will not be what appeals to the people on the other side of the chasm.&lt;/blockquote&gt;&lt;br /&gt;First of all, I think it says a lot about Geoffrey Moore that he&#39;s been thinking about Firefox and the rest of the open source world, to the extent that he put together such a talk for the Open Source Business Conference.&lt;br /&gt;&lt;br /&gt;Secondly, this has important effects on &lt;a href=&quot;http://www.spreadfirefox.com/&quot;&gt;Firefox&#39;s marketing efforts&lt;/a&gt;. They need to focus their message to the mainstream person. Find the pains they are feeling in web browsing and explain how Firefox eases those pains. &quot;All gain, no pain.&quot; That&#39;s what mainstream people want to hear when they are considering adopting some new technology like Firefox. The cool features are still cool (like fast rendering, extensions, themes, etc.), but they need to remember that those features won&#39;t influence mainstream people nearly as much as the &#39;pain killer&#39; features will (pop-up blocking, rapid security patches, no Active-X, etc.). Instead of leaving people thinking &quot;Firefox may be slightly better than IE, but I&#39;m happy with IE. It&#39;s good enough,&quot; they need to get people to see that &quot;IE is painful, I need something better.&quot;&lt;br /&gt;&lt;br /&gt;The talk is also quite interesting from the open source perspective. I highly recommend it. &lt;a href=&quot;http://www.osbc.com/dev/images/13/presentation_dwn/GeoffreyMoore_OSBC2005.pdf&quot;&gt;Slides are available&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/111697660394424489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/111697660394424489' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/111697660394424489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/111697660394424489'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2005/05/geoffrey-moore-firefox-is-crossing.html' title='Geoffrey Moore: Firefox is crossing the chasm'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-111410691785006507</id><published>2005-04-21T20:08:00.000+02:00</published><updated>2005-04-21T20:08:37.850+02:00</updated><title type='text'>Hello, IDEA!</title><content type='html'>From the recent Java IDE discussions, it seems like there&#39;s a good portion of Java programmers who don&#39;t know &lt;a href=&quot;http://www.jetbrains.com/idea&quot;&gt;IntelliJ IDEA&lt;/a&gt;, or simply haven&#39;t tried it yet. In this short screencast, I cover all the basics you&#39;ll need to get started using IDEA in about 10 minutes. Watch &lt;a href=&quot;http://www.rapid-programming.com/hello_idea/hello_idea.html&quot;&gt;&quot;Hello, IDEA!&quot;&lt;/a&gt; No fancy tricks like my &lt;a href=&quot;http://idea-log.blogspot.com/2005/02/hello-in-60-seconds.html&quot;&gt;last screencast&lt;/a&gt;, this demo is simple and easy.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.rapid-programming.com/hello_idea/hello_idea.html&quot;&gt;&lt;img src=&quot;http://www.rapid-programming.com/hello_idea/hello_idea.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Do you have a friend or colleague who hasn&#39;t tried IDEA? Send them a link. I&#39;ll be posting more advanced feature-specific screencasts soon. Stay tuned.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/111410691785006507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/111410691785006507' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/111410691785006507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/111410691785006507'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2005/04/hello-idea.html' title='Hello, IDEA!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-111322143445547438</id><published>2005-04-11T14:20:00.000+02:00</published><updated>2005-04-14T02:28:12.813+02:00</updated><title type='text'>Language Oriented Programming: Everything is a Language</title><content type='html'>Some people don&#39;t &#39;get&#39; &lt;a href=&quot;http://www.onboard.jetbrains.com/is1/articles/04/10/lop/&quot;&gt;Language Oriented Programming&lt;/a&gt;. It&#39;s a different perspective. Once you make the mental shift, everything starts to fall into place. Over the past few months, I&#39;ve been looking at the software development world with LOP-coloured glasses, and I&#39;ve come up with a quick &lt;a href=&quot;http://c2.com/cgi/wiki?ZenSlap&quot;&gt;zen-slap&lt;/a&gt; phrase which I hope will help shift your paradigm.&lt;br /&gt;&lt;br /&gt;(If that last sentence made you think, &quot;I &lt;b&gt;hate&lt;/b&gt; the word &#39;paradigm&#39;! It&#39;s a meaningless marketing buzzword,&quot; then &lt;a href=&quot;http://idea-log.blogspot.com/2005/04/paradigm-schmaradigm.html&quot;&gt;read this&lt;/a&gt; before reading on below.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Everything is a Language&lt;/b&gt;&lt;br /&gt;Just as OOP introduced &#39;everything is an object&#39;, I propose for LOP that &lt;b&gt;&#39;everything is a language&#39;&lt;/b&gt;. Keep this in mind as you read about and discuss software, and suddenly things will look very different to you. But what the heck do I mean?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Programming is Communication&lt;/b&gt;&lt;br /&gt;When you want to communicate an idea to someone, how do you do that? You use the tool that &lt;a href=&quot;http://channel9.msdn.com/ShowPost.aspx?PostID=114&quot;&gt;Homo Sapiens 1.0&lt;/a&gt; has evolved over millions of years: Language. You&#39;ll speak, you&#39;ll make gestures. If you want the communication to last over time, you&#39;ll write it down in symbols. These days you can use fancy tools like keyboard, mouse, digital memory, and graphic display to write these symbols.&lt;br /&gt;&lt;br /&gt;Now, when you want to instruct a computer, how do you do that? You write symbols using keyboard, mouse, digital memory, and graphic display. You&#39;re doing the same things, but instead of communicating ideas to people, you are communicating ideas to the computer. Now, of course, there are a couple of important differences, such as the fact that there are strict rules on which symbols are used and how they are arranged, and also the fact that the symbols have a very precise, concrete meaning (e.g. &#39;2 + 2&#39; actually performs a physical action in the computer to produce the symbol &#39;4&#39;). However, at the end of the day, a programmer&#39;s work primarily involves communicating to the computer via &lt;b&gt;language&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Editor is the Medium&lt;/b&gt;&lt;br /&gt;Before I go into the examples, there is one important thing to know. Language does not exist without a &lt;b&gt;medium&lt;/b&gt;. Spoken words require a mouth to speak, air to propagate sound waves, and an ear to listen. Sign language requires hands to make the signs, light to carry the image, and eyes to read the signs. Writing requires a pen, paper, and eyes. Programming requires a keyboard to type, an editor to accept the input, and a compiler or interpreter to execute the program. Take away any of these things, and communication is much more difficult.&lt;br /&gt;&lt;br /&gt;Marshall McLuhan tried to emphasize this fact by saying that &quot;the medium is the message&quot;. He, perhaps, overstated his case for emphasis. But the fact remains that the medium of language is an important, indispensable part of the language. So I will now put &#39;2 + 2&#39; together to state something that will likely bother some hard-core programmers: The editor is an important, indispensable part of the programming language. The editor is the medium of the programming language.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Examples&lt;/b&gt;&lt;br /&gt;When you start to think &#39;everything is a language&#39;, you will start to see computer languages everywhere.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;JUnit and TestNG&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;http://junit.org/&quot;&gt;JUnit&lt;/a&gt; is the most popular unit testing framework, but there are many clones and variations. They are all &lt;b&gt;languages&lt;/b&gt;. With a unit test, you attempt to communicate to your system that, when the environment is set up in this way, this is what you expect, and this is what actually occurs. But have you noticed how ugly it is to write a test that says &quot;this method should throw this exception&quot;? That is because JUnit is written in Java, and the only way to do this in Java is to wrap the method in a try/catch statement. JUnit is a language &lt;i&gt;on top of&lt;/i&gt; Java. Notice how new frameworks such as &lt;a href=&quot;http://www.beust.com/testng/&quot;&gt;TestNG&lt;/a&gt; try to modify Java (with annotations) to make writing tests more natural? That is because they want to be true languages.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EasyMock and jMock&lt;/b&gt;&lt;br /&gt;The &lt;a href=&quot;http://c2.com/cgi/wiki?MockObject&quot;&gt;Mock Objects&lt;/a&gt; pattern is another language, and two popular frameworks again try to adapt Java into a mock-object language. &lt;a href=&quot;http://www.easymock.org/&quot;&gt;EasyMock&lt;/a&gt; uses dynamic proxies to generate mock objects on the fly. But notice how you have to have this clumsy MockControl object to specify return values and exceptions? &lt;a href=&quot;http://jmock.codehaus.org/&quot;&gt;jMock&lt;/a&gt; goes further than EasyMock, allowing you to specify in a fairly natural way the expected inputs and outputs. But notice how you lose Java&#39;s language support for interfaces; instead you have to specify method names with Strings, making refactoring method signatures with an IDE more difficult. And while writing mock expectations may be &lt;i&gt;fairly&lt;/i&gt; natural, it&#39;s actually not very natural at all; it doesn&#39;t look like a normal Java method call as it would with EasyMock. That&#39;s because both of these frameworks are &lt;b&gt;languages&lt;/b&gt; on top of Java. I think it would be great if my editor allowed me to write out the expectations using special notation that isn&#39;t possible in Java, like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;myObj.myMethod(obj equals expectedObj, date between startDate .. endDate) returns expectedResult;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;XML this and XML that&lt;/b&gt;&lt;br /&gt;Have you noticed the proliferation of all these XML dialects? Why is that? It&#39;s because XML gives you a standard and relatively easy way to invent your own languages. The parser is already built, all you need is a DTD for your syntax and to wire up the grammar to your Java (or other language) objects for your semantics. &lt;a href=&quot;http://ant.apache.org/&quot;&gt;Ant&lt;/a&gt; is one example, but there are zillions more. Obviously, there is a need for the ability to easily create specialized languages. This is one of the primary forces behind Language Oriented Programming.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Struts, Spring, and Rails&lt;/b&gt;&lt;br /&gt;Web frameworks are yet another kind of language we are seeing a lot of these days. Notice how &lt;a href=&quot;http://struts.apache.org/&quot;&gt;Struts&lt;/a&gt; defines page navigation using XML, extends JSP with tag libraries, and provides special facilities with its class framework? I wonder why such a project as &lt;a href=&quot;http://www.jamesholmes.com/struts/console/&quot;&gt;Struts Console&lt;/a&gt; exists, or the various IDE plugins. Could it be because Struts is a language? &lt;a href=&quot;http://www.springframework.org/&quot;&gt;Spring&lt;/a&gt; wires up your application with a configuration script (hint: in its own specialized XML language). &lt;a href=&quot;http://www.rubyonrails.org/&quot;&gt;Rails&lt;/a&gt; rewrites entire classes, re-interprets method calls, and has dozens of other meta-programming tricks just to make your life easier. These frameworks are all attempts to work around the deficiencies of their host languages. Imagine the power that would be possible if they could be languages in their own right, with things like IDE support, refactoring, and whatnot. (I&#39;m talking about LOP, people.) &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Aspect Oriented Programming&lt;/b&gt;&lt;br /&gt;Why isn&#39;t it popular? No IDE support. &#39;Nuff said.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ruby, Python, PHP, and even JSP&lt;/b&gt;&lt;br /&gt;Dynamic languages are &lt;a href=&quot;http://www.mcqueeney.com/roller/page/tom/20050319&quot;&gt;on the rise&lt;/a&gt;. Why is that? Let&#39;s put on our LOP glasses. Static languages are great because you get lots of support from your tools. The compiler gives you lots of hints, and can do things like optimize your code. A smart IDE like &lt;a href=&quot;http://www.jetbrains.com/idea/&quot;&gt;IntelliJ IDEA&lt;/a&gt; can make judgments about code, allowing static analysis, refactoring, code completion, and navigation. But static languages also have some downsides. Every little detail has to be specified, sometimes more than once. Little errors can blow up in your face if you&#39;re not disciplined in your coding practices.&lt;br /&gt;&lt;br /&gt;Dynamic languages make a trade-off. They try to be more flexible, and get out of the programmer&#39;s way, at the expense of losing some of the features of a static language. Sometimes, this trade-off is in the interests of the programmer. With more mature languages like &lt;a href=&quot;http://ruby-lang.org/&quot;&gt;Ruby&lt;/a&gt; and &lt;a href=&quot;http://www.python.org/&quot;&gt;Python&lt;/a&gt;, the advantage is slowly tipping more and more in favour of dynamic languages. Wouldn&#39;t it be cool if you could have the power and flexibility of a dynamic language, with all the extra cool features of a static language, and a kick-ass editor to boot? Hmmm.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So...&lt;/b&gt;&lt;br /&gt;Keep your eye out for this stuff. It&#39;s going to become more and more obvious to you. All you have to remember is that everything is a language.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/111322143445547438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/111322143445547438' title='28 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/111322143445547438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/111322143445547438'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2005/04/language-oriented-programming.html' title='Language Oriented Programming: Everything is a Language'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>28</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-111288980902266510</id><published>2005-04-07T17:56:00.000+02:00</published><updated>2005-04-07T18:15:29.960+02:00</updated><title type='text'>Paradigm, Schmaradigm</title><content type='html'>Let&#39;s clear something up. Yes, &#39;paradigm&#39; has been hijacked by evil marketing forces. No, it is not a meaningless word. The problem is &lt;b&gt;most people don&#39;t know what &#39;paradigm&#39; means&lt;/b&gt;, so marketers are able to twist it and turn it and slap it onto any old crappy idea. If everybody knew what it meant, it would lose all its mysterious power, and marketers would give it up for some more fuzzy, vacuous word, like &#39;folksonomy&#39;. So with that goal in mind, I&#39;m going to briefly educate you on the real meaning of paradigm and immunize you against the marketing buzzword of the same name.&lt;br /&gt;&lt;br /&gt;The meaning of paradigm I&#39;m using here comes from &lt;a href=&quot; http://en.wikipedia.org/wiki/Thomas_Kuhn&quot;&gt;Thomas Kuhn&lt;/a&gt; in his famous book &lt;i&gt;&lt;a href=&quot; http://en.wikipedia.org/wiki/The_Structure_of_Scientific_Revolutions&quot;&gt;The Structure of Scientific Revolutions&lt;/a&gt;&lt;/i&gt;. A paradigm is a set of assumptions that cause you to think about things in a specific way. For example, assuming that &lt;a href=&quot;http://en.wikipedia.org/wiki/Geocentric_model&quot;&gt;the Earth is the centre of the universe&lt;/a&gt; might cause you to think that there is inherent order in the universe, with everything in its place, and with Earth holding a special, exalted position. The four elements, earth, water, air, and fire naturally seek their proper place. The sun, moon, planets, and stars revolve in perfect circles around the Earth. This paradigm, for two thousand years, helped people &lt;i&gt;understand&lt;/i&gt; the world.&lt;br /&gt;&lt;br /&gt;No paradigm is perfect, and there will be anomalies that the paradigm cannot explain. In the beginning, the anomalies won&#39;t seem important, and people will ignore them, or make small exceptions or corrections in the paradigm to account for them. But over time, as understanding deepens, the anomalies will gain significance until they are too problematic to ignore any more. For example, astronomers observed that the planets &lt;i&gt;didn&#39;t&lt;/i&gt; move in perfect circles, so they invented the concept of &lt;a href=&quot;http://en.wikipedia.org/wiki/Epicycle&quot;&gt;epicycles&lt;/a&gt; to try to correct their model. Eventually, the required epicycles became so messy that the geocentric cosmology reached a crisis.&lt;br /&gt;&lt;br /&gt;When a crisis is reached, new paradigms arise to compete against the prevailing paradigm, and eventually a new, usually better one wins out by eliminating the anomalies of the old paradigm. This process is called a &lt;a href=&quot; http://en.wikipedia.org/wiki/Paradigm_shift &quot;&gt;paradigm shift&lt;/a&gt;. For example, by considering that &lt;a href=&quot;http://en.wikipedia.org/wiki/Heliocentrism&quot;&gt;the Sun is the centre of the universe&lt;/a&gt;, and that orbits are elliptical instead of circular, the need for epicycles vanishes. (Some people use the term &#39;paradigm shift&#39; to refer to an individual person&#39;s internal shift in viewpoint from one belief system to another. I confess I also use the term that way, but I only apply it to genuine paradigms, not just any viewpoint shift.)&lt;br /&gt;&lt;br /&gt;There&#39;s another important aspect to paradigm shifts, which is the historical fact that paradigm shifts tend to be nasty, with the old-guard staunchly defending their tried-and-true paradigm, and the new generation brazenly promoting their new-and-better paradigm. Sometimes, the only way to complete the paradigm shift is to wait for the old-guard to literally die off! For example, the Catholic church had so much invested in the geocentric paradigm that it took two generations of scientists (first Copernicus, later Galileo and Kepler) to establish the heliocentric paradigm among the mainstream scientific community. And we all know &lt;a href=&quot;http://en.wikipedia.org/wiki/Galileo_Galilei#Church_controversy&quot;&gt;what happened to Galileo&lt;/a&gt;. Thomas Kuhn called such messy scientific paradigm shifts &#39;scientific revolutions&#39;, and in fact, the Copernican paradigm shift is considered &lt;b&gt;the&lt;/b&gt; Scientific Revolution since it is one of the major events of the Renaissance.&lt;br /&gt;&lt;br /&gt;One last important feature of paradigms is that they are often mutually unintelligible, and trying to explain something in the context of one paradigm, when the other person holds a radically different paradigm, can cause huge misunderstandings and pointless arguments. People talk right past each other, saying things that make perfect sense to themselves, but are completely meaningless to the other person. You can imagine the different answers you would get from a geocentrist versus a heliocentrist when asked the question, &quot;Why are we here?&quot;&lt;br /&gt;&lt;br /&gt;The word paradigm, when used in the sense of Kuhnian paradigm shifts and scientific revolutions, is a very powerful and useful concept. It can help you understand major events in the world, and to see the recurring structure in them. So, now that you understand the real meaning of &#39;paradigm&#39;, you can just ignore the clueless marketing drones who babble about &#39;optimizing your paradigm&#39;, and not get so worked up over this perfectly good and useful word.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/111288980902266510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/111288980902266510' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/111288980902266510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/111288980902266510'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2005/04/paradigm-schmaradigm.html' title='Paradigm, Schmaradigm'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10728539.post-111270456144683590</id><published>2005-04-05T14:31:00.000+02:00</published><updated>2005-04-05T14:36:01.446+02:00</updated><title type='text'>IntelliJ IDEA Skeptic Learns to &quot;Develop with Pleasure!&quot;</title><content type='html'>I couldn&#39;t pass on this classic. Blogger Doug reluctantly discovers &lt;a href=&quot;http://testdriven.com/&quot;&gt;TDD&lt;/a&gt; and &lt;a href=&quot;http://www.jetbrains.com/idea/&quot;&gt;IntelliJ IDEA&lt;/a&gt;. From &lt;a href=&quot;http://www.trontos.com/dsouth/blog/2005/04/intellij.html&quot;&gt;&quot;how do I create a new class?&quot;&lt;/a&gt; to &lt;a href=&quot;http://www.trontos.com/dsouth/blog/2005/04/tdd-progress.html&quot;&gt;&quot;living without it may be hard to do&quot;&lt;/a&gt; in 4 days. Nice! My favourite part is the initial hard-core skepticism when he says &quot;30 days is not long enough for me to evaluate&quot; IDEA, followed by a somewhat unrealistic evaluation scenario: &quot;It is resource hungry,&quot; he claims, &quot;The box I&#39;m using at the moment is a bit low on memory, only 256Mb... It&#39;s an HP e-Vectra I picked up at a computer auction for &lt; $150 about a year ago.&quot; I mean, seriously! You can&#39;t expect to run a power drill on AA batteries. ;-)&lt;br /&gt;&lt;br /&gt;Overall, I think Doug&#39;s experience is actually quite common. Switching IDEs can be time-consuming and mind-bending, especially if you&#39;ve gotten deep into your previous IDE&#39;s habits and quirks. Each IDE has its own personality, and will take some getting used to. The most pragmatic approach is to keep your expectations realistic, have enough time and resources to give each IDE a fair shake, and then pick the best tool for the job. Different tools work better on different jobs, so it&#39;s good professional practice to know how to use multiple tools from your toolbox.&lt;br /&gt;&lt;br /&gt;You download IDEA &lt;a href=&quot;http://www.jetbrains.com/idea/download&quot;&gt;here&lt;/a&gt;, and &lt;a href=&quot;http://www.jetbrains.com/&quot;&gt;JetBrains&lt;/a&gt; is currently offering a special &lt;a href=&quot;http://www.jetbrains.com/idea/buy/personal.html&quot;&gt;personal license&lt;/a&gt; for half the regular price. Don&#39;t miss out.</content><link rel='replies' type='application/atom+xml' href='http://idea-log.blogspot.com/feeds/111270456144683590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10728539/111270456144683590' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/111270456144683590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10728539/posts/default/111270456144683590'/><link rel='alternate' type='text/html' href='http://idea-log.blogspot.com/2005/04/intellij-idea-skeptic-learns-to.html' title='IntelliJ IDEA Skeptic Learns to &quot;Develop with Pleasure!&quot;'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>