2015 Retrospective
Our family almost doubled in size in 2015: we took a pug puppy in May and our daughter was born in July (events are ordered chronologically and not by importance). This was a wonderful experience which completely changed the way we perceive life, spend days and nights. As a side effect, time became a very limited commodity for us, continuous sleep - a fairy tale from a long ago.
Time constraints influenced my approach to software development and continuous learning - there was much less coding in spare time, but more reading, learning and improving existing skills.
SkuVault
At SkuVault we are gradually maturing V2 project branch. It is in closed beta right now (full release of its features is expected in Q1'16). However, some ideas that proved themselves in V2 are already being taken back into V1.
While working on V2 we also have to maintain V1 and all systems in between. So I had to learn bits of:
- InfluxDB time-series database (which felt like a more robust alternative to Carbon/Graphite for real-time metrics at a scale);
- R and plenty of libraries in the ecosystem - for performing data-driven research for devops, development and marketing;
- JavaScript with ES6, ReactJS, Webpack and all the joy of building interactive frontends without ASP.NET and IIS;
- even more Linux (mostly Ubuntu) for managing devops infrastructure.
In the long term, I look forward to the slow (because we have to be extra careful) process of scaling SkuVault, while adding more features and unhooking it from Azure.
Plus, there is a lot of work to be done with capturing data coming from SkuVault, analyzing it and leveraging to improve the product further.
Cooking
I think, I perfected our cheese cake recipe (using ingredients still available in Russian stores despite the sanctions) and got hang of making reasonable steaks in our electrical oven.
I'd love to try making some cured meat in 2016.
Erlang
I invested time in learning me some more Erlang. It is a very nice language with a lot of value in OTP libraries.
I don't think, I'll get to apply Erlang practically any time soon, however lessons already affected they way I think, reason and design distributed systems in the other languages.
Emacs and Org-mode
I believe, I became slightly better at managing everyday flows of tasks, problems and information in an unpredictable environment. All credit goes to Time Management for System Administrators by Limoncelli, Moleskine notebook and awesome org-mode in Emacs. Here's the layout:
- A bunch of org-mode files contains all my notes, tasks, projects and calendar entries (including recurring events and routines). I try to review and rectify them on a regular basis.
- All work hours are tracked in org-mode as well, they are used for invoicing.
- I use outstanding org-mode agenda to get a high-level overview of current projects and planned tasks, while planning my next day in Moleskine.
- Things are crossed out from the Moleskine list as I complete them.
- Unfinished tasks are moved to the next day or scheduled further down the road via org-mode.
- Any new information coming in (e.g. "buy diapers tomorrow" or "plan driving school next month") is logged immediately either to voice recorder app or in notebook, to get them out of my mind. As a part of my daily routine (I'm still trying to make it a routine), I incorporate them into my digital notes and agenda.
- Stand-alone projects get their own org files. They are also added to the global agenda list. This way, if any of the files contains tasks or scheduled entries, they would show up in the agenda views.
org-mode has also a great support for literate programming, making it trivial to intermix executable code with prose. This affected the way I write about programming and learn. My Emacs config and Erlang Basics are both examples of the literate programming. I also use Emacs Speaks Statistics with org-mode and R to perform documented and reproducible data research.
As you can, I'm spending a lot of time in Emacs. Almost all of the development (except for .NET) happens in there as well. Mastering this environment and tuning it, makes me a better developer, so I'm definitely going to continue this trend in 2016.
JVM and Clojure
.NET is a nice runtime with a decent ecosystem. It currently is the development tool I'm most familiar with. However, it misses some features and libraries which are available in Java world (e.g. Apache Kafka consumer library, proper bindings for LevelDB/RocksDB, libraries for sending real-time tagged metrics etc). Besides, managing servers at scale is more pleasant with Linux than with Windows (and Java is a first-class citizen there).
My previous attempts to get into Java world were spoiled by C# and F#, which are nice .NET languages, one with strong support for object-oriented programming, the other with an emphasis on functional programming style.
Compared to these primary .NET languages, it felt that Java 8 is too verbose, while Scala felt too complex and slow to compile (even with background compilation daemon).
However, this year I finally paid attention to Clojure, which is a dialect of Lisp developed for JVM and JS by Rich Hickey. Clojure places a strong emphasis on simplicity, functional programming, immutability and interoperability with existing Java ecosystem.
There is also a version of Clojure for CLR which isn't as popular as JVM or JS versions.
In fact, if you look beyond the funny lisp syntax with tons of brackets, you could encounter simplicity of golang (with go-like channels and light-weight processes), backed up by JVM ecosystem and templating capabilities of LISP.
(defn old? [blob period]
(let [
date (c/from-date (.getLastModified (.getProperties blob)))
limit (t/minus (t/now) period)
] (t/before? date limit)))
Yes, the syntax is very funny and unusual. This is because code is data in Lisp (and I'm still grasping all implications of that).
I'm not sure if I will end up using Clojure in my everyday work, however learning it will make me a better developer. I'm sure of it.
It is a nice coincidence that Emacs itself is an interpreter for a different flavor of Lisp: ELisp. Mastering Clojure would make it easier to customize Emacs itself.
There are a few tricks with Clojure macros and evolving neural networks that I want to give a shot to :)
Internet of Things
When Maya was born, we realized that we need to measure temperature and humidity around her crib. This became especially important during the winter period. "Thanks" to the central heating and cold winters, humidity could easily drop to 10% (very bad for the health of the family).
I started playing with DHT22 temperature/humidity sensor and Arduino/ATTiny controllers to capture the data. However, it turned out that reading data from OLED display in an inconvenient location is no fun.
A few iterations down the road I discovered EP8266 controller - a tiny chip smaller than a quarter. It has a Wi-Fi module and a programmable micro-controller. That baby has everything needed to grab temperature/humidity from the sensor and dump it to InfluxDB time-series database via our Wi-Fi network. Then it all gets charted on a Grafana dashboard.
Obviously, this is just a start. There are a few other things I could do to improve our home IT infrastructure (e.g. a better control of the music player daemon, better tracking of sleep patterns of our baby etc).
I believe, this year could see a few more hardware projects, more related to everyday programming.
The End
I didn't achieve much in the area of software development in 2015, rather just discovered things I want to learn more about in 2016. This already makes 2016 a more interesting year :)
Unfortunately, some areas of my life were sacrificed in 2015 to free up room for work: writing, blogging and sports. I hope to bring them back to life in the upcoming year.
Published: January 02, 2016.
🤗 Check out my newsletter! It is about building products with ChatGPT and LLMs: latest news, technical insights and my journey. Check out it out