What a fucked up year! Forget David Bowie, Prince, Muhammed Ali, and Willy Wonka, even Carrie Fisher - that was just bad luck. But the rest is on us! Jo Cox, Brexit, Trump, AfD. Zika. Nice, Berlin, Aleppo, the humanitarian crisis around the Mediterranean. So many horrible affairs and I'm sure I've forgotten a lot more of them. How could we let this happen?
I know how I could - I was busy with my oh-so-important life. So instead of doing something helpful, I wrote code, or posts, I read Twitter and the Jigsaw mailing list. Bleh! In a world with so much anguish it's flat out sociopathic to invest so much energy into learning stupid shit but exactly zero into changing something that really matters. God damn it, an entire generation reading blogs, writing code; slaves with white collars. We are chasing "skills" and fads, writing code we love so we can ignore shit we can't bear. But that shit is hurting people!
We write code we love so we can ignore shit we can't bear
Not us, though, so we're in the clear. Forget what I said, let's continue the circle-jerk. Let me tell you about whether my perfect little plan for 2016 worked, about conference visits, favorite posts, visitor stats, and other things that are terribly important.
▚Plans For 2016
This part is tightly coupled to the goals I set at the beginning of the year. It's interesting that I never wrote that down explicitly but I gave 2016 the motto expansion - I wanted to try new things and see where it gets me. Time to go through them one by one, checking what worked and what didn't.
▚What?
▚Blog
My plans for the blog were simple:
- continue publishing regularly; ideally around once every ten days
- maybe tweak the theme to be less cluttered
- maybe, maybe move to a static site generator like Jekyll
Writing posts worked well until June but broke down in the second half of the year. There were good reasons for that (more on that later), so I'm not beating myself up over it. Sometime in November I realized how little I published and started to more aggressively cross-post what I published elsewhere. That's better than nothing but I have a huge list of interesting things to write about and would love to do that here. Let's see whether I can get back on the horse next year...
I did the tweaks, though! The blog used to have two columns but only one of them contained valuable content. I liked the cleaner look of other blogs, like Disy's, and decided to go for something similar. I can hardly remember how it looked before but I like how it does now and that's all that matters.
I obviously didn't go all the way and moved to Jekyll - that would just take too much time. Ironically it will take more, the longer I wait because there will be more content to check. Technical liabilities at their best...
▚Branching Out
Just twelve months ago I wrote this:
I would love to write for high-profile outlets, speak at conferences, create an online course, write a book.
Or something. Or all of it!
It's crazy how many of these things became reality or are at in the works:
High-profile outlets : I wrote for InfoQ, Oracle's JavaMagazine, SitePoint of course, and some smaller sites. All of these gigs pay, some more and some less, but it tells me that my insight and writing is valued, which is a great feeling. Definitely a "check!"
Speak at conferences : Such conferences. So much check! Just wow. This was and is an awesome experience! I'm terribly thankful to the conference and community organizers who gave me the opportunity to wise-ass on stage and to the people people who have sat through it. Thank you so very much, you are amazing!
Online course : Nope.
Write a book : I'm actually doing this, I'm writing a book about the Java Module System! This is crazy! I'm currently having trouble investing enough time, though, but more on that below.
I consider this a great success! I completely remade my work life and made these things my main occupation (more on that below). Basically everything I invest energy into these days ends up being publicly available sooner or later, much of it for free. That is a great feeling and I am happy to be in this position. I worked hard for it but I'm not fooling myself - a lot of luck was involved, too.
▚Open Source
I knew I would have little time to make a real contribution, so I didn't even try to worm my way into any particular project. Instead, I wanted to take care of my own two ventures, LibFX and JDeps Mvn. But even that didn't happen! I guess you could say that I failed to reach even the puny goals I set for myself.
On top of that I started three other projects, that I can not exactly call successes as none of them is ready to use:
WorkflowyFX : This should one day become a Chrome / Firefox plugin that makes using the awesome Workflowy even awesomer. At the moment it does almost nothing and must be installed locally. Mpf.
JUnit Io : Here I want to collect JUnit 5 extensions. The project is almost set up, including publishing nightly snapshots, and ready to gather features. If you have any idea that you think would be a good extension for JUnit 5, open an issue. But as with WorkflowyFX, nothing usable was published yet.
ReRe : I don't even know whether the third thingy is worth mentioning. It's hardly a project and more of a learning exercise. I thought it would be nice to have a tool that lists recent releases of the biggest open source projects so I wrote something in Kotlin (my first time) that asynchronously (my first time) connects to GitHub (you can guess). Not least thanks to a friend I made good progress just yesterday and it may become usable soon. Ish.
But life is interesting and ever hard to predict. In the end I might have found a project that I really want to stick around: JUnit 5. I wrote a lot about it, presented it at half a dozen conferences, and even contributed some thoughts and a few lines of code. That was fun and I hope to find some time to do more here.
▚Linux
About a year ago I switched to Gentoo to get to know Linux a little better. I have to say I am surprised by how little trouble I had with it. Granted, my webcam doesn't work; the volume settings across built-in speakers, external speakers, and USB headphones are somehow connected but opaquely so, which means sometimes I hear nothing, sometimes I'm afraid the laptop or my ears explode; I have no lower case Ä (as you can see, upper case works, though); since recently Firefox often freezes when I attach an external monitor; and KDE sometimes fucks up the rendering pipeline which leaves some windows and pop-ups entirely black. (I'm sure most or even all of those are fixable problems - I just didn't try hard enough yet.) But other than that everything works!
You might think I'm being sarcastic here but I'm not. The joy alone of being able to obtain just about all the things I need in very recent versions from the package manager is totally worth it. Just to pick a random example from a more volatile project, I'm on NodeJS 7.2.0, which was released three weeks ago (I have no idea since when I'm on that version, though). The last time I had to install something besides JDK early access builds from outside the Gentoo package sources was Atom (in March) but it has since been added as well. So, yeah, totally worth it.
I have no lower case Ä... Totally worth it.
▚Haskell
Nope. But a little JavaScript - does that count? :)
▚When?
The other interesting part of my 2016 plans were how I set out to achieve my goals. I wrote:
You might have noticed that the goals are pretty lax.
There are few clear requirements to achieve anything in particular: no minimum number of posts, no list of projects I would like to contribute to, no level of Haskell knowledge I would like to achieve. I made the scope intentionally flexible to be able to fix the budget.
So I prioritized my goals and boxed how much time I would spent on each. This went pretty well and is all in all a much more relaxing work style than the goal-oriented one. With concrete goals it's easy to be disappointed for not reaching them for reasons that are outside of your control. That can not happen if you simply sit down to work on something for two hours.
In accordance with the prioritization, the goals I didn't reach indeed show up lower on the list with the exception of writing posts for this blog, which I considered important. But as I wrote above, I managed to do that for the first half of the year - coincidentally, that was also the time that I managed to keep up the time boxing. Because in August 2016 everything changed...
▚Thieves Of Time And Ravagers Of Routines
The biggest change was undoubtedly my decision to quit working as a full-time developer and instead become a part-time editor. The new position at SitePoint is awesome! I get to read stuff I didn't know about before, interact with lots of different authors around the world, and immerse myself into the Java community. And all of that during work hours!
It also pays enough for the 15 hours a week to prevent starvation and including the articles I sell, I can even buy clothes! Yay for me. This leaves me with a lot of time (at least compared to a full-time employee) to do other stuff that interests me: research, work on my book, conferences visits, random coding...
Or so I thought... After a while I realized that I didn't get a lot of things done besides editing for SitePoint and writing for other sites. Where did my time go?
A big part were conferences. I may write about this another time in more detail but suffice it to say that visiting conferences to actually attend the talks takes a lot of time. Surprise! But the time is not everything - it also makes it really hard to settle into a routine, which I consider an important step towards efficiency.
Routine is an important step towards efficiency
Then, setting up a new channel took a little more time than planned and my editing borders on obsessive –compulsive disorder, which is good for quality but bad for efficiency. Turns out that I overshot my weekly target by a couple of hours. And like with conferences, communicating with authors in many different time zones who answer or inquire throughout my whole work day makes it harder to develop a routine. I was continually interrupting myself by replying to them.
But that only explained parts of it. There was still a lot of time unaccounted for. Where did it go? You won't believe the answer: I spent it on random surfing and other shit! Quelle surprise! Turns out that I waste somewhere between 20% and 30% of my time with ... well, I don't actually know. Fuck me, that's stupid! One part is the lacking urgency. When I only had two hours to work on something before going to work I would sit down and just do it. Now, with the illusion of having the entire day, I am much less focused.
Another thief of time is private Nicolai (at least work Nicolai thinks like that), who currently leaves only about 40 to 45 hours for work per week (that's at least ten less than the previous years). Together with the overhead this meant I mainly did just three things: editing SitePoint, writing stuff for money, visiting conferences. Not bad in and of itself but not enough either. I have to improve here and soon!
Fuck me, that's stupid!
▚Reflection
I'm still furious about how the year as a whole turned and what little I did to better it. But professionally I am very content. A lot of opportunities revealed themselves and I was in the lucky position to take many of them. Now I have to continue working hard on turning them into successes.
And there's the rub, I really have to sit down and focus on what matters! I have to stop wasting time with projects that I do not finish (because then they have no value) and and with hanging out on Twitter. During the last days of December I tried something to improve and it looks promising - more on that in my next post.
▚CodeFX
Time to take a closer look at the core of my public persona's identity - this blog.
▚Syndication
Until up to two years ago I have been reading a lot on sites that are mainly syndicating content, which means they are republishing content other people wrote with the author's permission. This was, in fact, how I discovered many authors that I hold in high esteem today.
So when I started blogging two and a half years ago I wanted to cut the same deal and was happy when sites like JavaCodeGeeks, DZone, JAXEnter, and Voxxed started publishing my content. I guess it was a good deal when I started out and helped grow my readership but as time went by, more and more things started to annoy me.
▚What I Didn't Like About It
First of all, every now and then the syndication would screw up a post's style, making it look very goofy. If I were to read something like that (and didn't know how exactly syndication works) I would blame it on the author. Stupid muppet, can't even use WordPress correctly! What's irking me even more than the bad rep is that sites that allow such posts to go live obviously spend exactly zero time on them!
Then there was the way the content was promoted on Twitter. For some sites, it grew more and more sensationalist, which I really didn't like because I didn't want people to connect the gimmicky tone with me. After all I neither wrote those tweets nor did I directly benefit from the traffic.
Sometimes I also wondered about the bigger picture. These sites slurp up a lot of traffic by recklessly publishing whatever they can find. Assuming content creators would find a good way to spread their links around, and there are plenty of places to do that, they could see that traffic and maybe monetize it. Because the sites I mentioned above as well as other, similar ones do exactly that! They monetize content that they didn't spend an iota of energy on. And their only value proposition is that they spread content and allow commenting in one place. I mean, even Reddit does that!
Syndicators slurp up a lot of traffic that would otherwise go to the content creators
But in the end, the search traffic argument was the straw that broke the camel's back. If content is duplicated across several URLs, Google has to pick one as the original. How exactly it does that is pretty opaque but there is a considerable chance that it is picking the syndicated variant, especially if your blog is rather small like mine. Google is of course only showing one variant of each post so in such cases the original is effectively invisible.
Now, there is a way to tell Google which variant is the original. The syndicator can include a canonical URL that points to the original in his copy. But by default few syndicating sites do that. Why? Because they want the traffic!
▚What I Did About It
After I realized that this was happening to me as well, I decided to at least get that part of my traffic back. So in April I talked to the sites and most of them agreed to include canonical URLs in all posts they published from me. Exceptions were JavaCodeGeeks, who did not do it retroactively (immutability of syndicated content was in line with our initial agreement) but only for future posts, and DZone, who didn't use canonical URLs at all, so I consequently stopped cooperating with them for syndication.
Since then Google traffic has skyrocketed (see below)! So if you're a blogger, I'd recommend to only allow syndication of your posts if a canonical URL is included.
Insist on canonical URLs!
▚My Favorite Posts
▚1. Rebutting 5 Common Stream Tropes
I didn't rant since Comment Your Fucking Code! and it was fun to do it again! But while it was nice to present an argument with force it came out a little harsh - which wouldn't be a problem, did I not directly reply to another guy's post. This made it hurtful, which isn't cool. But what happened next, surprised me to no end.
First of all a few people called me out. They told me that while they agreed with my message they didn't like the delivery. This is awesome feedback considering that we're on the internet where yelling is the common way to criticize. So kudos to those people, I really appreciate it and took it to heart.
Before publishing I contacted Simon Ritter, the author of the post I was replying to. He didn't have time to look at my text right then but told me he's sure that it's fine. (Err, sorry.) After the post made the rounds I heard back from him and understandably he was not amused.
But, and this is the cool thing, we argued it out. We wrote a couple of mails back and forth, each as long as the posts we wrote in the first place, and came to a shared understanding of where and why we disagree. Not only did we part amicably, we also had a beer together at Devoxx Belgium and he even wrote a post for SitePoint. I must credit Simon for reacting so professionally to my ruthless opening post.
Last but not least, I also like the post because I think it presents valuable content. I just read it again and still stand by every technical detail. If you want to improve your stream pipelines, check it out!
▚2. Beware Of findFirst()
And findAny()
I consider the judicious use of findFirst()
and findAny()
an important detail when using streams and my thoughts sparked a few interesting discussions.
Some of them quite heated along the lines of "RTFM, they do exactly what the docs say!", which I of course never disputed.
But the real reason why I like this post so much is that it became the symbol for my quest for traffic ownership. The article was published in January when it got 739 views. It languished around 200 in February and March before making a steep climb to about 3.5k per month since September - virtually all of it from Google. That's just awesome!
▚3. JUnit 5 – Architecture and the other posts about JUnit 5
JUnit 5 is becoming important to me on many different levels: I write about it, it gets me invited as a speaker, I started contributing a little, and it sparked my newest side project, JUnit Io. It will hopefully be the open source project that I will finally start making meaningful contributions to.
The series of posts stands for all that. As a representative, I picked the one about architecture because I find that the most glorious thing about JUnit 5.
▚4. Java 9 Additions To Stream and the other posts about Java 9
I'm so looking forward to Java 9! I'm obviously heavily invested into the module system but I also look forward to the other features. And if you don't care about them, listen to what a friend of mine recently said:
I'll do anything to get value types!
Yes, even update to Java 9, with all the pain that entails, in the hope that value types make it into Java 10...
▚5. Seven Reasons Against Blogging
Everybody and his dog tells you to get a blog but there are serious downsides and they get a lot less publicity than "you'll get invited to conferences!". Here's my take on them.
▚No Jigsaw?
Interestingly enough, there is no post about Jigsaw in this list. The reason is that I wrote so little about it on CodeFX, in fact there is just one article about it, Implied Readability, and that's in dire need of an update because the keywords changed. Let's see whether I can do better in 2017.
▚Visitor Stats
With all of that out of the way, let's finally have a look at some analytics data. Although, after reading Traffic Is Fake, Audience Numbers Are Garbage, And Nobody Knows How Many People See Anything, I'm not sure how much sense exactly that makes. Still I'm gonna do it and compare them to last year's numbers.
(The statistics were taken with Piwik and the numbers are unique page views. The declaration of will to not be tracked is respected.)
The blog had 153,676 unique page views in 2016 (up 40% from 110,355 in 2015) with a healthy monthly baseline of about 15k in the second half (up ~70% from 9k in the second half of 2015) and a peak of 18,463 in June (16,836 in July 2015). (In case you're checking with last year's post, there I accidentally published page views instead of unique page views.) Not bad given the fact that the second half of the year did not really see much original content.
Most popular blog posts:
- Beware Of findFirst() And findAny() (23,988)
- Java 9 Additions To Stream (7,842)
- Casting In Java 8 (And Beyond?) (7,205)
- How Java 9 and Project Jigsaw May Break Your Code (6,987)
- Java 9 Additions To Optional (6,642)
First place is insane! (At least for me.) That was one of the posts I freed from the oppression of other sites and look how it payed off. I really hope the people find what they are looking for but judging from the bounce of rate of "only" 80% (I think that's high but lower than most other posts on CodeFX) I'd guess they do. The other hot topic is obviously Java 9. I started a series on it and this looks like I should really continue working on it.
Most effective referrers:
- Google (61,801; +330%)
- Reddit (7,150; -65%)
- Baeldung (3,794; +5%)
- Twitter (2,721; -3%)
- HackerNews (2,409)
Wohoo, Google! Since my push for canonical URLs the curve became steeper and went from about 2k in January to 7.5k in November. Baeldung and Twitter are ok for me - I would have liked to improve these numbers but, again, what can I expect with only six months of full steam?
As I wrote last year, I'm not really sure what to think of Reddit. I hung around there a little more recently, though, and saw few of the nasty things for which I am critical of the platform. From what I saw it looks like /r/java is an ok channel. Still, I don't mind that I had less exposure there.
▚Reflection
Last year I concluded the review of my blogging activity with these words:
At times I wonder whether a more Wiki-like approach would be better (like Martin Fowler's Bliki, which he describes in Evolving Publication).
I could just update existing content and keep it more relevant. More to think about...
Let's turn to the hard numbers.
In short: I am very happy with my visitor stats! They developed so well that I basically stopped to forcefully promote my content. I will tweet about it, post to G+ and send the newsletter - everything else happens pretty much by itself, which is cool.
They are still true.
Another thought that came up was how I was going to split my writing activity between this blog, SitePoint and other sites. I had some ideas but didn't come to a conclusion yet. I better do that soon, though, because if I really want to start posting here regularly again, I better have a plan what to publish where. Something to think about during the next days.
▚Goodbye 2016
I will always remember 2016 as the year when I made my hobby my work and that's an awesome thing to say! I am incredibly thankful to the many people that helped and continue to help me on that ongoing voyage into the unknown. Thank you so very much! Now I have to hang on tight and focus on what lies ahead of me to make sure I don't fall off the wagon.
Have a happy new year’s eve! I hope to see you again in 2017.