The first part in my recent interview series: "The Heroes of Java".
Who are you?
"I'm a software guy who lives in Stockholm, Sweden. I've been working with runtimes for more than ten years, but try to find time to do hobby hacks so I can understand all modern trends in computer science. I enjoy all areas of programming, and I'm not afraid to get my hands dirty with low level programming - kids these day seems to be afraid of that, which may in the long term doom us all. ;) As one of the guys who designed the JRockit JVM, I co-authored a book about JVM internals in 2010, which generated some attention."
Your offical job title at your company?
"Consulting member of technical staff"
Do you care about it?
"To the extent of the name - not at all. I can hardly even tell what it means - I am, for instance, not a consultant. I care about it to the extent that it defines a couple of responsibilities and how independent I can be and so on. And benefits. Probably. I'm not sure it matters. I've never really sat at my desk one morning and not having known what to do, regardless of title. The thing to do has usually turned out the be the right thing and people have rarely complained ;-)
I'm slightly skeptical to the whole thing of having titles and "contributor levels", the way it is implemented in any large corporation. People are not exactly World of Warcraft characters and titles in general convey little meaning to an outsider.
At BEA Systems I was a "Staff Engineer" but my business cards said "Senior Wizard"."
Do you speak foreign languages? Which ones?
"I am a native Swedish speaker. I speak English fluently and decent German. My German is great grammatically, but sadly lacking in nouns, slang and modern expressions. I need to get a German dictionary for my Kindle and start working my way through it from A to Z. (A Swedish dictionary would of course go from A to Ö, but Germans treat the umlauts as modifiers and not as separate letters ;-))
I'm quite good with languages, so I can usually figure out what stuff means in most latin based languages."
How long is your daily "bootstrap" process? (Coffee, news, email)
"It used to be pretty short. Coffee, read (but don't answer) new e-mail, done. Then social networks like Twitter appeared. I convince myself that they actually give me targeted and relevant information instead of just being time wasters. ;-)
Then the kids arrived. They are definitely the worst planning obstacle of all. (Yes let's just objectify them as time sinks in the Gantt chart for the sake of this discussion, I'm really a lovely father. I promise). Now my bootstrap process is interleaved with waking the kids up and getting them to school. This means rising at 06.30 and getting to work at 09.30. My most productive hacking time is in the mornings, so this is a bit of a handicap. I usually solve this with my wife so I can pick up the kids from school some days and leave them other days. If I have a "pick them up" day, I just swallow some coffee and leave the house at 07.00 and do the rest of the bootstrap at my desk.
Working at home is not possible with children at home, but once they are out of the house it saves the commute. As I'm going to be on a distributed team now for a while I suspect I'll be doing more work from home. The main problem there is that I have such a nice espresso machine so I usually turn into Cornholio at about 10.30 any given day at home.
I've experimented a bit with my bootstrapping - for example not doing any "catching up" as the first thing in the morning. For a period of time I tried getting up at 05.00, gulping down some coffee, hacking like a maniac for 2 hours and then getting the kids to school. Interestingly enough I was quite productive, but I don't think that's something any man should go through."
You have a twitter handle? Why?
"I started using Twitter just by adding people so I could get a customized stream of news. This mostly contained work related topics at first, but now I'm including anyone that is fun or interesting. Twitter has provided me with links to interesting stuff I wouldn't had found in a wider search domain and has also let me get to know people who proved to be really important to talk to. I've used Twitter for job purposes, to exchange information with people I've not met in "real life", with useful results. Twitter is also a great news medium, such as when people tweet from the scene of an accident or similar event.
I had my Twitter account for about a year until I actually started posting stuff myself. I post tweets mostly about programming, but not exclusively."
Whom are you following in general?
"I follow people in the IT business, people in politics and people who make me laugh. These are not disjoint sets."
Do you have a personal "policy" for twitter?
"I try to keep my tweets in line with "my public character" and to be (mostly) polite. I keep more personal stuff in closed social networks instead, but of course there are always exceptions. For example: the world needed to know about my fight with the flesh eating bacteria in my arm this summer. THEY NEEDED TO KNOW! ;-)"
Does your company restrict or encourage you with your twitter usage?
"I'm encouraged to do things like tech evangelism, where appropriate, but it's not an explicit part of my role description.
There is a social networking policy, which involves inside information and stuff. To be honest I'm not 100% up to date with it, but in general on Twitter, regardless of corporate policy, if you've got nothing good to say, it might be better to say nothing at all. The whole world and all its search engines are listening. "
What's your daily development setup? (OS/IDE/VC/other Tools)
"I tend to work mostly on Ubuntu and Windows on my workstation, depending on what is required. I use Mac OS on my MacBook. The MacBook is my own and not company property. My work-at-home setup is a fully loaded 27" iMac with lots of VMWare images.
My preferred IDE for C/C++ is Microsoft Visual Studio. When we developed JRockit we used Windows as the development platform because the IDE was so much more efficient than anything available on Linux. Visual Studio is truly excellent, both for development and debugging, with a compiler that produces tight code.
On Linux I do most things (except Java) in plain old Emacs with etags, old school style. GDB is the debugger.
For Java development I used to be an Eclipse guy, but I've recently been trying out the new Netbeans and find that I quite like it.
For native Mac/iOS projects I have little choice but Xcode, which is actually useable and not so painful after the release of 4.0, but it's still nowhere near Visual Studio.
The other tools I need are usually available from the prompt on any UNIX based system."
Which is the tool providing most productivity to your work?
"Hmm... Emacs? I don't think I ever close it."
Your prefered way of interacting with co-workers?
"Definitely face to face in a room with maybe four people working on the same thing. I have nothing against distributed work but it has a tendency to slow things down if you aren't careful. I guess I'm not the most patient guy in the world.
If you have to work in a distributed setting, e-mail lists is a horrible way of communicating information. Instant messaging is a little better. Video messaging, screen sharing over Skype etc, is quite good. But nothing beats being in the same room and having whiteboard discussions about things. When I was compiler lead for JRockit, we were all in one room and things like "all in favor of rewriting this complex subsystem from scratch - raise your hands" were totally possible. Doing things like that over a mailing list in six different time zones naturally gets a lot more complex, especially since you lose subtle nuances of the communication.
When working on a tightly coupled system you can also infer a lot more from the "convection currents" of information with people doing the same thing in the same room. You pick up a stray word in a conversation about some technical topic and your brain synthesizes this into part of the big picture without you having to think too much about it. To clarify, these kinds of work setups are not endless cubicle farms, but largish offices where 4-5 people share a room. I like that a lot."
The above should in no way imply that I think distributed projects suck, they are just harder to synchronize and you get less for free."
What's your favorite way of managing your todo's?
"Make a list. Prioritize it. Do the TODOs one after another. Always minimize context switches. They kill. I don't think anyone can juggle many tasks at the same time and be at their maximum level of productivity. For me "multitasking" usually just means figuring out in which order to execute the TODOs and not jumping back and forth between them.
Have your e-mail program check for mail every half hour. Not every two minutes. Half an hour is a pretty good time unit to concentrate on one problem."
If you could make a wish for a job at your favorite company: What would that be?
"I find runtimes and operating systems fascinating. I want some architectural say in where they go next and have discussions with industry and academia about technology. At the same time, a day without looking at assembly code is a bad day. I'm lucky to have a lot of this already in my job description.
Alternatively I'd like to be on the founding team of another startup. That's how I've spent some of the happiest time in my life. Naturally, it's harder with mortgage and kids. The startup would still have to involve some assembly language ;-)"
You're still programming in Java. Why?
"I'm not just programming in Java. I'm programming in everything. I use the most appropriate tools that get the job done for any given situation. Why am I still programming in C? Because it gets the job done for certain problem sets. Why am I still programming in Haskell? OK - that one has more to do with personal sexual deviancy I guess.
When it comes to Java as a language it is not going to go away. It is ingrained in a lot of critical infrastructure in the world. The runtime is also definitely not going to go away - quite the opposite. If I may inject a blatant commercial plug here, my book " Oracle JRockit the definitive guide" talks a bit about how Java and the JVM became such a ubiquitous platform, and what the intrinsics of any such platform should be."
What's least fun with Java?
"Java code is extremely voluminous - it takes up so much space compared to Scala or Ruby or Clojure. Any line of Java that I write seems to want to break the 80 character boundary. Really simple things are missing as well, for example, there are no implicit ways of initializing a map or a collection, boilerplate getter and setter code for every field needs to be in place and so on.
My main language feature frustration is lack of lambdas. Also, religiously, I've always been strictly against camel case in any setting. This goes back to Smalltalk ;)
Type erasure can also be irritating. I guess one of the design rationales behind generics was that the implementation only needed to change the compiler. Surprisingly enough it also turns out that compiling certain type relationships in Java is undecidable. As someone who majored in theoretical computer science this is sort of like an itch in my brain that won't go away."
If you could change one thing with Java, what would that be?
"For the language: lambdas and more compactness a la project Coin. We are on the way there and I think Java 8 will get rid of a significant part of the frustrations.
For the JVM specification: replace bytecode with something that works better as a generic intermediate language for a multi language JVM. I think bytecode will, even despite invokedynamic, soon turn out to be a bottleneck between the program and the runtime. I rant a bit about it in my book. "
What's your personal favorite in dynamic languages?
Which programming technique has moved you forwards most and why?
"Being the nightmare of anyone who wants to define a "process" or "technique" in software, I must ask you to define "programming technique" better.
I'll give it a shot anyway - how do I quickly write code that works and is robust?
Any code that contains sanity checks turns out to be good code: get into the habit of doing things like putting assertions absolutely everywhere without thinking about it.
Make sure new features have tests. If you consider something "untestable" you are doing it wrong. Make it testable! You might even have to write some kind of whitebox API that exposes system internals for the test framework to get a test written. In that case, so be it. Do it!
If you fix a bug by painstakingly whittling a reproducer down to a small deterministic bit of code - make sure to turn it into a unit test, tag it with a bug number and get it into the test suite so you'll never have to do this again.
When programming, avoid explicit parallelism. Things like actors, the fork/join framework or NSOperationQueue:s in Cocoa help out.
Understand memory management.
Measure and understand where your application spends its time and why.
Finally, whenever you can: be stateless or use functional programming. This saves debugging time and produces fewer bugs."
What was the biggest project you've ever worked on?
"The JRockit Java virtual machine."
Which was the worst programming mistake you did?
"I've done my share of evil over the years, so it's hard to single out any one mistake. I've caused buffer overruns that crashed production systems, non deterministic function behavior and what not. However, one particular thing that had long term consequences comes to mind. At some point we decided that memory allocation in the JRockit compiler code should have no return value checks and just automatically bail on failure. I can't even remember why - reducing code mass, maybe, or a misguided attempt to trap malloc/free bugs in a global framework that was never written. Anyway, it sucked and turned into a maintenance nightmare. Always check your return values, kids. Always. That's another good thing in languages like Java - try/catch/finally. If you don't have them there is no shortcut. If the thing can return NULL, you must handle it."