Tomorrow, 22nd December 2021, is my last day at JetBrains.
I can't believe I've been here a whole seven years! I've never stayed anywhere even half that amount of time, I usually jump jobs every 1-2 years. I spent 4 years at LMAX, but I did have a tiny break in the middle to go and work for ThoughtWorks for 3 months.
I've been playing with NIO for network stuff to see if/how I want to update the code for Head First Java 3rd Edition. The original code used Sockets and Readers/Writers, and I thought there must be a more "modern" way to do this so I've tried updating it a few different ways. I got it working using SocketChannel and ByteBuffer (eventually!), but the ByteBuffer stuff is just too fiddly to use to teach people basic network IO in Java. After turning to Twitter for the answers (Twitter Driven Development) I had what looked like a promising hybrid approach.
As an #OpenJDK NIO Contributor I can tell you that NIO, even without async, is never simple. In most cases, using Channels.* factory methods for streams should be sufficient for most cases -- unless you write heavily I/O-bound code. They allow you to do NIO but it feels like IO.
Dalia and I (and a number of others!) had a conversation on our first Twitter Spaces session about "Comments: Good or Bad?". I argued for minimising the comments we have in our code, and in this blog post I want to explore how to do this in more detail.
OK so here we go, my almost-regular annual roundup. Of 2020. Deep breath.
Right so first things first, obviously 2020 SUCKED. For everyone. Anything I say that's negative is not meant to be "oh poor me I had it worse than anyone" and anything positive is all about focusing on the positives, I hope I don't make anyone feel weird about good shit happening in a horrible year.
So caveats and disclaimers up-front:
None of my close circle of friends or family died or was hospitalised with Covid. Yes, friends of friends, family of friends, and some people in my much wider circle of acquaintances and friends. I consider myself extremely lucky.
I also got very lucky with how old my kids currently are - old enough to be fairly independent (compared to a baby), young enough that school is not mandatory for them.
I'm also very fortunate in my working situation. I've been working remotely for 8 years already, and my company is a) extremely caring about its employees and b) in a financial situation to be able to support them.
I've been migrating all my JavaFX applications to Java 15 / JavaFX 15.0.1 to see if there are any pain points or gotchas to be aware of. I particularly wanted to understand how Maven and Gradle handle JavaFX, and how to successfully build and run the applications in IntelliJ IDEA.
In this blog post I explore the steps taking to upgrade a Spring Boot/Maven/JavaFX application.
You might think, particularly given the order in which I have posted these blog posts, that I tackled the easiest application first when I decided to upgrade my JavaFX applications. But no. Because I like to live life on Hard Mode.
I spent two full days last week once again tackling the on-going tech debt I had with a Modular JavaFX application. And I won! Yay! So here's my experience report.
I'm helping out a bit with an IntelliJ IDEA Live Stream on JavaFX, and I used that as an excuse to refresh my JavaFX knowledge. One of the things I did was make sure I upgraded all my existing applications to the latest versions of everything and make sure they work as expected.
I have what is now quite an old demo application, originally designed to showcase Java 8 features (watch the live demo and find out more). Since JavaFX was moved into the JDK in Java 8, I decided to use JavaFX as the UI. In fact, it's this demo that was the basis for all my later JavaFX applications, including the Spring Boot one.
I haven't done much with this for a loooong time, but it turns out I have been periodically updating dependencies and trying to make sure it all compiles. I highly recommend taking the time to do this at least once a year! It turns out that because I've been updating dependencies for the last 3-4 years that it wasn't that painful to bring it right up to date. In fact, I did it in less than 30 minutes!
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.