to be open

to connect

to discover

to report

to keep in touch

Always [write documentation] as if the [person] who ends up maintaining your code will be a violent psychopath who knows where you live.

— John Woods (source)

The " Heroes of Java " series took a long break. Honestly, I thought it might end in the middle of nowhere, even if there are still so many people I would love to include here. One of them is Dan. The first time I asked him to contribute is almost one and a half year back and with everything which happened in the meantime, I made my peace with not getting an answer anymore. But the following arrived in my inbox during JavaOne and was basically a birthday present for me. So, I open the Heroes of Java book again today and add another chapter to it! Thank you Dan! It is very good to call you a friend!Dan Allen is an open source and standards advocate and innovator. He worked at Red Hat as a Principal Software Engineer. In that role, he served as the Arquillian community manager, contributed to various open source projects (including Arquillian, Asciidoctor, Awestruct and JBoss Forge) and participated in the JCP. He helped a variety of open source projects become wildly successful. He's also the author of Seam in Action (Manning, 2008), has written technical articles for various publications and is an internationally recognized speaker.I’m an open source advocate and developer, community catalyst, author, speaker and business owner. Currently, I’m working to improve the state of documentation by leading the Asciidoctor project, advocating for better software quality by advocating for Arquillian, and, generally, doing whatever I can to make the open source projects to which I contribute, and their communities, wildly successful. After a long conference day, you’ll likely find me geeking out with fellow community members over a Trappist beer.Vice President, Open Source Hacker and Community Strategist at OpenDevise, a consulting firm I founded with Sarah White.I care more about this title, compared to titles I’ve had in the past, primarily because I got to define it.In general, though, titles can be pretty meaningless. Take my previous title, Middleware Principal Software Engineer. All titles like this really manage to accomplish is to communicate an employee’s pay grade. The honorary that follows “Principal” is “Senior Principal”. Then, what next? “Principal Principal?” What was I before? A Junior Insignificant Engineer? We might as well just use number grades like in the US government (e.g. GS-10). At least that’s a logical system.Like many of my peers, I’ve always sought to define my own title for my role. To me, the purpose of a title is to help others know your specialty and focus. That way, they know when you’re the one they need to seek out. That’s why I chose the title “Open Source Hacker and Community Strategist”I live and breathe open source, so the “Open Source” part of the title fits. If you want to discuss anything about open source, I’m always game.I also love community, especially passionate ones. I’m always thinking about it and how to make it work better. That’s where the term “community strategist” comes in.I enjoy getting people excited about a technology and then being there to help get them going when they find their passion to improve or innovate on it. It’s such a thrilling and proud experience for both sides. To me, that feeling is called open source. I simply work to reproduce it over and over as an “Open Source Hacker and Community Strategist”. Maybe one day people will recognize me as a “Serial Community Creator” ;)Those of us in open source also identify ourselves by the projects we lead or help manage, if any. Currently, I’m the Asciidoctor project lead—​and it’s about as much as I can handle.I wish. I studied French in high school, but consider that experience purely academic. I’m challenging myself to read tweets in French to brush up on what I once knew.My real life experience with foreign languages comes from interacting with open source community members from around the globe and spending time in other countries. Even though I cannot understand other languages, I enjoy taking in the sounds and rhythms like music. There’s a certain amount of enjoyment I get from listening without the distraction of comprehension.My favorite foreign language experience was working with the translations—​and their translators—​of the Arquillian User Guides. Not only did it expose me to a lot of languages (over a dozen), it gave me a first-hand appreciation for how much language plays into a person’s identity and the feeling of pride for one’s country.The experience also pushed me to understand Unicode and fonts. I’m proud to say that I get the whole point of Unicode and how it works (at least from a programming standpoint).I look forward to working more with translations, rethinking how translations are managed and continuing to take in the sounds and rhythms of languages. One day, perhaps, I will be fluent in at least one of them.A more interesting question might be “when?” since I keep some pretty odd hours. My daily goal is usually to get to bed before the sun comes up. That makes my breakfast and bootstrap process your lunch. That all depends on timezone, of course. As one of my colleagues pointed out, I’m surprisingly non-Vampirish at conferences.You may be wondering what’s with the crazy schedule. The thing about managing an open source project is that you never know when someone is going to be ready to participate. When someone shows up ready to participate, you need to jump on the opportunity. It could be a while (if ever) before they have time again. And that person could be in any time zone in the world.Truth be told, I like the night just as much as the day anyway. There’s a solitude at night that I enjoy and I often do some of my best work then. Other times, I just enjoy the silence. I look forward to the day too, especially when the view of the Colorado Rockies is clear. I do some of my best work against the backdrop of their purple or white peaks. You might say that I draw inspiration from both the day and night to feed my creativity.I only do coffee first thing in my “morning”, but I do the other bootstrap activities (like Twitter) several times a day. It takes me about an hour or two to sift through my e-mail and Twitter, with a pit stop at Google+.For sure. It’s @mojavelinux I have a Twitter account:When I first started using Twitter (over 6 years ago), many people thought it was ridiculous and pointless. I was drawn to it because it offered a way to communicate without any prior arrangements. It’s sort of like a global IRC channel with a contextual filter applied to it.Twitter has changed the way I do business, and the way I interact with my colleagues and community. Rather try to explain it, I’ll give two examples.When we were growing the Seam 3 community, we didn’t just wait for people to come join the mailinglist. We looked for people talking about JSF and Java EE on Twitter. One of the more vocal people at that time was Brian Leathem. When he posted feedback or a complaint about JSF, we would engage him by responding to him directly. That turned his post into the start of a conversation or design session. When it came time to hire someone for a related position, he was already a top candidate, and has since become a top employee. There are stories like Brian’s.It’s easy to conclude that we “hired someone we met on Twitter”. That misses the whole point. Twitter’s public channel gave us an opportunity to find someone who has deep interest and experience with a particular technology or platform. So public that we don’t even have to know where to look for each other (except on Twitter). The meetup is inevitable.Twitter has also eliminated the overhead of communicating with associates in your own company or even other companies. You just put out a broadcast on Twitter, usually planting a few trigger words or tags, and that person will see it, or someone will pass it on to that person. Either way, you cut out the whole hassle of an employee directory. There’s a global conversation happening on Twitter and we’re all a part of it. Now that’s open.First and foremost, my fellow community members. As I mentioned, Twitter is how I keep the pulse on my community and communicate with them throughout the day. I follow a few company and project feeds, such as GitHub and Java EE, but mostly I like to know there is a person behind the account.I’m hesitant about following anyone I haven’t met, either in person or through a conversation online. I follow the same policy for LinkedIn and Google+ as well.One policy is to stay dialed in. I plow thorough my timeline at least once a day and try to respond to any questions I’m asked. As a community leader, it’s important to be present and participate in the global conversation. Some days, I iron out my agenda only after consulting my stream.I do make sure to not let it take over (sort of). When I find myself only reading or retweeting, but not sharing, I realize I need to get back to creating so that I have something to share (or just take a break).I’m very careful to post and retweet useful information. That’s an important part of my personal policy. I use tools like Klout, the Twitter mentions tab and the new Twitter analytics to learn what people consider useful or interesting and focus on expanding on those topics. I dialing down topics that get little response because I respect the time of my followers.The company policy is, use your own judgment.Public social networks have had a tremendously positive impact on open source, primarily because open source is both public and social. That makes Twitter pretty central to my position. We often discover new contributors (and vice-versa) on Twitter. We also use it as a 140 character limit mailing list at times (which, trust me, is a relief from the essays that are often found on real mailing lists).Simply put, I couldn’t do my job (in this day and age) without Twitter (or something like it).A tabbed terminal with lots of Vim and a web browser. Nearly all the work I do happens in these environments. Since I’ve been heavily involved in AsciiDoc and writing content in general, many of my Vim sessions have an AsciiDoc document queued up.I do all my Ruby development in Vim. I rely on syntax highlighting and my own intuition as my Ruby IDE. If you saw the number of times I split the window, it would frighten you. Don’t mimic what I do, it’s probably terribly inefficient, but somehow it works for me.When I need to do some Java hacking, I absolutely must fire up an IDE. Editing Java in Vim (without any additional plugins) is just a waste of time. I’m most comfortable in Eclipse because that’s what I used first in my career. However, I’m been firing up IntelliJ IDEA more often lately and I do like Netbeans on occasion. When I have to edit XML in the project, I flip back to Vim because copy-paste is much more efficient :)The development tools in the browser are a life and time saver when editing CSS. I like to work out the CSS rules I want in a live session, then transfer them to the stylesheet in the project. It all begins with “Inspect element”.Vim. I’ve used Vim every single day I’ve been at a computer for the last decade. I couldn’t imagine life without it. Vim is my hammer.Your prefered way of interacting with co-workers?Primarily async communication, with a few face-to-face meetups a year.The async communication is a mix of mailinglists, social networks, emails and (on and off) IRC. Most personal emails with my close colleagues have been replaced by Google+ and Twitter private messages, since we all have too much email. You’d be amazed how much more effective those private messages are. Something certainly worth noting.We usually get face time at conferences like Devoxx and JavaOne. This time is so important because it’s when we form the impression of the person behind the screenname. After you’ve met someone, and heard their voice, you’ll never read an email from them the same again. You’ll hear it coming from them, with their voice and expressions. Those impression, and the bonds you form when in person, is what make the virtual relationships work. You also discover some other things to talk about besides tech (or your tech in particular).Occasionally, I get put on these teams that like to do phone meetings. First, will someone please kill conference lines? They are horrible and a buzz kill. Besides that, phone calls in a global company simply don’t work. No time is a good time for someone. When we finally do manage to get (most) everyone on the phone, no one knows when to talk (or shut up). It’s a circus. Return me to my async communication.If I do need to be “on the phone”, I prefer Google Hangout (when it works). I’m not exaggerating when I say it’s almost as good as being in person.I did a lot of research in this area and decided on an online application named Nirvana. It adheres to David Allen’s GTD method more faithfully than any other one I evaluated. When I’m good about sticking to it, it serves me well.When I’m not so good, I fall back to my two anchors, a text file named WORKLOG and my email inbox.One trick I’ve used for years, which works great for context switching, is maintaining a WORKLOG file in each project that I work on. The tasks in this file aren’t perk pressing, but do remind me of what I want to do next when I have time to work on the project. It’s especially useful when you return to a project after a long break.I’m at the point now where my ideal job isn’t at someone else’s company, but at my own. One of the main reasons I love open source is the autonomy it grants. I don’t have problems finding ways to create value, but I do sometimes have problems convincing my employer to pursue that value creation.In my ideal job, which I’m now pursuing, I can create value anyway I want, I can judge when I’ve succeeded and when I’ve failed for myself, I can decide when growth is necessary and when it isn’t and I can defend the principles important to me. That’s why my wife and I took the step to create our own business. Our goals are pretty simple: survive, be happy & healthy, create value, work in open source and help clients be wildly successful.I’m a strong believer in portability and choice. And I believe the JVM provides us that freedom. The fact it’s one of the most optimized and efficient runtimes is just icing on the cake.I use Java because it’s the default language on the JVM. If another language replaced it as the default, I’d probably use that instead. Java is a means to and end to run and integrate code on the common runtime of the JVM. There are some compelling features that have made Java enjoyable, such as annotations and now lambdas and streams. However, if I have my choice, I prefer other languages, such as Ruby, Groovy and Clojure…​as long as the language runs well on the JVM :)The ceremony and verbosity. It’s too much to type. I like code that can get a lot done in a little amount of space, but still be readable and intuitive. Java requires a lot of space.Java is also missing some really key features from the standard library that you find in most other languages. A good example is a single function that can read all the content from a file or URL. It’s a simple concept. It should have a simple function. Not so with Java.Also, getters and setters are dumb.Less ceremony for imports. I know, that’s not the first thing that comes to a lot of people’s minds…​that is unless you’ve done a lot of work in a dynamic language.One of the biggest differences between Java and dynamic languages not often mentioned is the number of types in the default language set and the number of import statements you need to get more.It may not seem such a big deal, especially since IDEs help manage the import statements, but you’d be surprised how much they still slow you down, and outright paralyze development without the help of an IDE. In Ruby (and to some extent, Groovy), you can write most simple programs without a single import (require) statement. That means you can just keep plugging away.Ruby also let’s you import a whole library so it’s accessible to all the files in your application with a single statement (a RubyGem). In Java, you have to import every single type you use (or at least every package that contains them) in every single file. That’s a huge number of extra lines to manage.My hope is that this improvement comes along with Java modularity. You can import a module into your application, then use the types from it anywhere. That would be game changing for me. Combined with the language improvements in Java 8, my efficiency in Java just might be able to catch up to my efficiency in Ruby.Ruby. I’ve now written more code in Ruby than in any other programming language ( https://www.openhub.net/accounts/mojavelinux/languages ). (I’ve also explored the Ruby and Java interop extensively). I can attest that Ruby is very natural, just as the language designer intended it to be.I’m also a fan of Groovy and Clojure. I like Groovy for the reasons I like Ruby, with the added benefit that it integrates seamlessly with Java.Clojure is my “challenge yourself language”. I wouldn’t say it feels natural to me yet, but it pushes me to write better code. It’s true what they say about a LISP. It does expand your thinking.Functional programming, no doubt. This is a popular response, but for good reason. It’s more than just a trend.From my experience working with Java EE, Seam and CDI, I believe I’m qualified to say that managing state in a shared context is difficult in the best cases and usually fallible or impossible. As isolated processes become increasingly rare, we must change our approach to development.Functional programming gives us the necessary tools. Higher order functions allow us to compose logic without having to rely on class hierarchy and the temptation of relying on shared state. Persistent collections and no side effects let’s us write code that is thread safe by default and, better yet, prepared to be optimized for multi-core and even distributed.Don’t take my word for it, though. Just listen to a few of Rich Hickey’s talks, then grab a book or tutorial on Clojure and start studying it. Your mind will convince you.It was a J2EE web application that facilitated mortgage lending and automated appraisal services. The application was written in a somewhat obscure component-based framework that predated JSF that talked to an EJB2 backend and webMethods services. It had to be loaded on the bootclasspath of Weblogic in order for it to run for reasons I’ll never understand. In my time working there, the test suite never completed successfully and no one could figure out how to fix the behemoth. Debugging was a nightmare. It wasn’t pretty. Let’s just say I appreciated the need for a lightweight framework like Spring and changed my career path once I lost the stomach to work on this system.The nice part about that job was that I got experience using the XP development methodology (story cards, pair programming, continuously failing integration, etc). It’s probably the only reason the application was staying afloat and moving forward at all.Not documenting (and not testing).I’m always getting on myself for not documenting. We think of programming mistakes as logic or syntax errors, but the worst crimes we can commit are not passing on knowledge and stability. It’s like spreading land mines around a property, forgetting about them and then turning the property into a park. The mistakes are going to be made by the next person who isn’t aware of all those things you need to know to keep the system running securely.I’ll end with a variation on the most popular Tweet at this year’s OSCON to help encourage you to be a more disciplined programmer.