<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>functional-programming on Senior Software Engineer Reads</title><link>https://llcawthorne.github.io/tags/functional-programming/</link><description>Recent content in functional-programming on Senior Software Engineer Reads</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 16 Oct 2026 06:00:00 -0400</lastBuildDate><atom:link href="https://llcawthorne.github.io/tags/functional-programming/index.xml" rel="self" type="application/rss+xml"/><item><title>Grokking Simplicity</title><link>https://llcawthorne.github.io/posts/grokking-simplicity/</link><pubDate>Fri, 16 Oct 2026 06:00:00 -0400</pubDate><guid>https://llcawthorne.github.io/posts/grokking-simplicity/</guid><description>&lt;p&gt;&lt;img alt="Grokking Simplicity cover" loading="lazy" src="https://llcawthorne.github.io/posts/grokking-simplicity/images/cover.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Grokking Simplicity&lt;/em&gt; by Eric Normand teaches the difference between actions,
calculations, and data as a way to reason about mutation and side effects, and
it works better as a vocabulary book than a technique book. If you&amp;rsquo;ve already
internalized what &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, and &lt;code&gt;reduce&lt;/code&gt; are for, and I mean really
internalized it and not just being able to write the syntax, most of the core
material is going to read as confirmation of things you already believe instead
of new information. The higher-order function chapters and the copy-on-write
chapters fall right into that bucket. They&amp;rsquo;re clearly and patiently explained,
and useful for someone who&amp;rsquo;s never had the difference between mutating and
copying spelled out, but they&amp;rsquo;re slow going if you&amp;rsquo;ve been burned by shared
mutable state enough times to already distrust it on instinct.&lt;/p&gt;</description><content:encoded><![CDATA[<p><img alt="Grokking Simplicity cover" loading="lazy" src="/posts/grokking-simplicity/images/cover.jpg"></p>
<p><em>Grokking Simplicity</em> by Eric Normand teaches the difference between actions,
calculations, and data as a way to reason about mutation and side effects, and
it works better as a vocabulary book than a technique book. If you&rsquo;ve already
internalized what <code>map</code>, <code>filter</code>, and <code>reduce</code> are for, and I mean really
internalized it and not just being able to write the syntax, most of the core
material is going to read as confirmation of things you already believe instead
of new information. The higher-order function chapters and the copy-on-write
chapters fall right into that bucket. They&rsquo;re clearly and patiently explained,
and useful for someone who&rsquo;s never had the difference between mutating and
copying spelled out, but they&rsquo;re slow going if you&rsquo;ve been burned by shared
mutable state enough times to already distrust it on instinct.</p>
<p>The best material is outside that core. The architecture chapters cover both
stratified design and the onion model, and they were solid and worth having
read, though not so revelatory that I&rsquo;m in a hurry to go through them again. The
concurrency chapters were the standout. They introduce a diagramming technique
for reasoning about timelines and ordering that I hadn&rsquo;t run into before and
thought was really creative, and it&rsquo;s a lot different from the usual &ldquo;just use
locks or actors and hope&rdquo; approach most books take. Those are the chapters I&rsquo;d
go back to if a project involving concurrency comes up, since it&rsquo;s the kind of
technique you have to actually apply before it sticks.</p>
<p>The biggest miss for me was the immutable data chapters. I went in hoping for
advice on using immutable data structures in single-binding languages, the
discipline of writing code where a name, once bound, stays bound. What I got was
mostly copy-on-write technique, demonstrated with JavaScript objects that get
rebound on every update. That&rsquo;s a reasonable way to teach it in a language like
Elixir where rebinding is idiomatic, but it doesn&rsquo;t really carry over to the
habit I was actually after, which is reaching for <code>val</code> by default in Kotlin, or
treating a Haskell declaration as a one-time mathematical definition instead of
a variable that just happens not to change. The chapter shows you how to build
the immutable structure, but it doesn&rsquo;t really show you how to live in a
codebase that treats bindings as permanent.</p>
<p>Overall, it&rsquo;s a fast, well-explained, easy read that&rsquo;s clearly aimed at someone
running into these ideas for the first time. If that&rsquo;s not you, you&rsquo;ll skim more
than you expect, but the concurrency material deserves a second look, and the
architecture chapters were worth reading once, even if they weren&rsquo;t essential.</p>
]]></content:encoded></item><item><title>Advanced Functional Programming with Elixir</title><link>https://llcawthorne.github.io/posts/advanced-functional-programming-with-elixir/</link><pubDate>Fri, 09 Oct 2026 06:00:00 -0400</pubDate><guid>https://llcawthorne.github.io/posts/advanced-functional-programming-with-elixir/</guid><description>&lt;p&gt;&lt;img alt="Advanced Functional Programming with Elixir cover" loading="lazy" src="https://llcawthorne.github.io/posts/advanced-functional-programming-with-elixir/images/cover.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Advanced Functional Programming with Elixir&lt;/em&gt; turned out to be a pretty good,
easy introduction to functional programming concepts, and it uses good domain
examples instead of math. It walks through Elixir&amp;rsquo;s protocol system with a DDD
slant, using a theme park domain with rides, patrons, and Fast Passes instead of
the numbers-only examples you get in most Haskell books. The code is built
around a companion library called &lt;code&gt;FunPark&lt;/code&gt;, a teaching-scale version of Koski&amp;rsquo;s
real production package, &lt;code&gt;Funx&lt;/code&gt;. The theme park was a good choice, and it paid
off most in the &lt;code&gt;Eq&lt;/code&gt;/&lt;code&gt;FastPass&lt;/code&gt; chapter, where a real business rule (two Fast
Passes with the same datetime conflict, but should still be equal by &lt;code&gt;id&lt;/code&gt;)
motivated &lt;code&gt;contramap&lt;/code&gt; far better than an abstract definition ever could have.&lt;/p&gt;</description><content:encoded><![CDATA[<p><img alt="Advanced Functional Programming with Elixir cover" loading="lazy" src="/posts/advanced-functional-programming-with-elixir/images/cover.jpg"></p>
<p><em>Advanced Functional Programming with Elixir</em> turned out to be a pretty good,
easy introduction to functional programming concepts, and it uses good domain
examples instead of math. It walks through Elixir&rsquo;s protocol system with a DDD
slant, using a theme park domain with rides, patrons, and Fast Passes instead of
the numbers-only examples you get in most Haskell books. The code is built
around a companion library called <code>FunPark</code>, a teaching-scale version of Koski&rsquo;s
real production package, <code>Funx</code>. The theme park was a good choice, and it paid
off most in the <code>Eq</code>/<code>FastPass</code> chapter, where a real business rule (two Fast
Passes with the same datetime conflict, but should still be equal by <code>id</code>)
motivated <code>contramap</code> far better than an abstract definition ever could have.</p>
<p>The quality was uneven, but in a predictable way. Eq, Ord, and Predicates were a
low bar that the book cleared easily. Monoid was the standout chapter, and the
one place where all the abstract machinery (<code>Eq.All</code>, comparators built with
<code>contramap</code>) paid off concretely enough to justify the ceremony. The monad
theory was thin and abstract on its own and only came together once Maybe and
Either gave it somewhere to land. The one real gap was motivation for Reader and
Effect, which never quite sold me. The mechanics were fine, but no example was
compelling enough to answer &ldquo;why bother wrapping this?&rdquo;</p>
<p>The Eq and Ord chapters are straightforward once you accept that Elixir
protocols dispatch on struct type only, which forces workarounds like
<code>contramap</code> and <code>to_eq_map</code> (comparators as plain maps, not just protocol
implementations) the moment your domain needs more than one valid notion of
equality for a type. That ties into DDD nicely, since equality isn&rsquo;t structural,
it depends on the bounded context, so the same type can have different valid
comparators depending on which part of the domain is asking.</p>
<p>The Predicates and Foldable chapter introduced <code>Foldable</code> for <code>Function</code> (a
predicate as a fold, with zero-arity thunk dispatch) with almost no explanation,
and I had to do some real reconstruction before it landed. It turned out to be a
catamorphism (one function per fixed shape) hiding under a name that sounds like
list reduction. I also caught a bug in the protocol declaration there.
<code>defprotocol</code> declared <code>fold_l(structure, transform_fn, base)</code>, but every real
implementation and call site used <code>(structure, acc, func)</code>, so the protocol&rsquo;s
own docs had the argument names reversed. It&rsquo;s harmless, since protocol callback
names aren&rsquo;t enforced, but it&rsquo;s misleading on a cold read.</p>
<p>Monoid was the best chapter. <code>Sum</code> is the toy case, and <code>Eq.All</code> and <code>Eq.Any</code>
are the real payoff, equality combinators as monoids, with <code>&amp;&amp;</code> and <code>||</code> doing
the combining. I caught one real typo there too (<code>default_not_eq</code> vs.
<code>default_not_eq?</code>), and it confirmed a design tension worth remembering: this
machinery is worth it once you have multiple domain-meaningful comparators that
need combining and reusing, but not for a one-off comparison you could write
with <code>&amp;&amp;</code> directly.</p>
<p>The monad theory chapter is careful to say it&rsquo;s &ldquo;inspired by category theory,
not a direct implementation.&rdquo; The laws (left identity, right identity, and
associativity) landed fine once I reverse-engineered <code>pure</code>, which shows up
without explanation, as the same idea as <code>Monoid</code>&rsquo;s <code>wrap</code>/<code>empty</code>, just
Monad-flavored. There&rsquo;s no dedicated Functor chapter, and <code>map</code> gets treated as
a free consequence of <code>bind</code> and <code>pure</code> instead of getting its own build-up,
unlike <em>From Objects to Functions</em>, which used Functor as the on-ramp to Monad.</p>
<p>Reader was clean mechanically (the environment as a deferred function,
<code>ask</code>/<code>asks</code>, and <code>run</code> as the escape hatch), but the worked examples were too
small to justify the ceremony over just passing an argument. The one clear win
was swapping <code>run(computation, prod_env)</code> for <code>run(computation, test_env)</code>,
which is a real dependency injection payoff, independent of the toy examples
around it.</p>
<p>Maybe and Either are where the book actually sold itself. You chain <code>bind</code>-based
computations and only check for failure once at the end, instead of doing
constant nil checks, which is a direct answer to how much Go&rsquo;s manual <code>err != nil</code> checking grates on me. <code>Either</code> wins over <code>Maybe</code> when you need to carry
<em>why</em> something failed. Choosing <code>bind</code> to fail fast versus <code>ap</code> to collect all
the errors was the most concrete moment in the whole book where an abstraction
proved its worth, since the same operations give you two different validation
strategies with one shared vocabulary.</p>
<p>Effect never made a compelling case for why actions specifically need to be
trapped in a monad, though the ride repository example was believable as a real
pattern. It was the weakest chapter at justifying its own existence.</p>
<p>I&rsquo;m not convinced the full ceremony is worth it over Kotlin&rsquo;s null safety for
the <code>Maybe</code> case, since that comparison feels close to a wash. Either doesn&rsquo;t
have an equally clean stand-in in Kotlin, though. Kotlin&rsquo;s <code>Result&lt;T&gt;</code> is tied
to <code>Throwable</code>, so a hand-rolled <code>Outcome</code> type or Arrow&rsquo;s <code>Either</code> are the real
equivalents, and that&rsquo;s the one idea from this book most likely to actually
change how I write Kotlin.</p>
<p>Overall, it&rsquo;s a good, easy introduction to FP for someone with some prior
exposure who wants examples grounded in a domain instead of math. I&rsquo;m glad I had
AI on hand to work through the parts the book left underexplained, especially
the Foldable predicate case, since it would&rsquo;ve been a rougher read alone.</p>
<p>Full <a href="https://github.com/llcawthorne/book-notes/blob/main/elixir/advanced-fp/book-notes.md">book notes</a>.</p>
]]></content:encoded></item><item><title>Learn Functional Programming with Elixir</title><link>https://llcawthorne.github.io/posts/learn-functional-programming-with-elixir/</link><pubDate>Mon, 05 Oct 2026 06:00:00 -0400</pubDate><guid>https://llcawthorne.github.io/posts/learn-functional-programming-with-elixir/</guid><description>&lt;p&gt;&lt;img alt="Learn Functional Programming with Elixir cover" loading="lazy" src="https://llcawthorne.github.io/posts/learn-functional-programming-with-elixir/images/cover.jpg"&gt;&lt;/p&gt;
&lt;p&gt;A perfectly good introduction to the Elixir language, although it didn&amp;rsquo;t have
anything specific to learning functional programming in it beyond getting used
to doing things the Elixir way. I guess it had more recursion than most
introductory programming books&amp;hellip; It feels like a terrible introduction in
comparison to Dave Thomas&amp;rsquo; &lt;em&gt;Programming Elixir&lt;/em&gt; though, since it stops totally
short of introducing the Actor model and OTP, which are unique strengths of
Elixir, but that&amp;rsquo;s obviously a longer book to read.&lt;/p&gt;</description><content:encoded><![CDATA[<p><img alt="Learn Functional Programming with Elixir cover" loading="lazy" src="/posts/learn-functional-programming-with-elixir/images/cover.jpg"></p>
<p>A perfectly good introduction to the Elixir language, although it didn&rsquo;t have
anything specific to learning functional programming in it beyond getting used
to doing things the Elixir way. I guess it had more recursion than most
introductory programming books&hellip; It feels like a terrible introduction in
comparison to Dave Thomas&rsquo; <em>Programming Elixir</em> though, since it stops totally
short of introducing the Actor model and OTP, which are unique strengths of
Elixir, but that&rsquo;s obviously a longer book to read.</p>
<p>Full <a href="https://github.com/llcawthorne/book-notes/blob/main/elixir/learn-fp/book-notes.md">book notes</a>.</p>
]]></content:encoded></item><item><title>From Objects to Functions</title><link>https://llcawthorne.github.io/posts/from-objects-to-functions/</link><pubDate>Sun, 27 Sep 2026 15:00:00 -0400</pubDate><guid>https://llcawthorne.github.io/posts/from-objects-to-functions/</guid><description>&lt;p&gt;&lt;img alt="From Objects to Functions cover" loading="lazy" src="https://llcawthorne.github.io/posts/from-objects-to-functions/images/cover.jpg"&gt;&lt;/p&gt;
&lt;p&gt;This was one of the better books I&amp;rsquo;ve read recently for actually changing how I think about programming. It combines domain-driven design, test-first development, and functional programming into one coherent story, which is pretty rare, since most books only tackle one of those at a time. Unlike some of my other recent reads, the Kotlin itself was well-structured and idiomatic throughout, not just functional-flavored Java.&lt;/p&gt;</description><content:encoded><![CDATA[<p><img alt="From Objects to Functions cover" loading="lazy" src="/posts/from-objects-to-functions/images/cover.jpg"></p>
<p>This was one of the better books I&rsquo;ve read recently for actually changing how I think about programming. It combines domain-driven design, test-first development, and functional programming into one coherent story, which is pretty rare, since most books only tackle one of those at a time. Unlike some of my other recent reads, the Kotlin itself was well-structured and idiomatic throughout, not just functional-flavored Java.</p>
<p>The book builds a real app, a to-do list called Zettai, outside-in with TDD, starting from acceptance tests and working down to the domain core. It uses http4k, which the author picked specifically for its &ldquo;everything is a function&rdquo; philosophy (an <code>HttpHandler</code> is just <code>(Request) -&gt; Response</code>), and Exposed for persistence. The book&rsquo;s repo only has the start and end states for each step (step1 through step7, spread loosely across 13 chapters) rather than the intermediate changes, so I had to lean on the book&rsquo;s prose to follow <em>why</em> the code evolved the way it did and not just <em>what</em> it ended up as.</p>
<p>The book starts with actor-based domain-driven testing and works its way through receiver-typed lambdas and extension functions, higher-order functions and purity, and a hub-and-spokes (ports and adapters) architecture before it gets into the theory. From there it covers monoids (with a door state machine example), functors, monads, and applicatives, then event sourcing and profunctors, and it finishes with a logging and JSON capstone that pulls everything together. The theory was mostly motivated with real code before the abstraction got a name, which I appreciated. Functors come out of <code>Holder</code>, <code>List</code>, and <code>Outcome</code>, and then <code>ProjectionQuery</code> deliberately breaks the container idea to push you into thinking of them as computations instead of containers. Monads come from a concrete <code>TxReader&lt;TxReader&lt;T&gt;&gt;</code> nesting problem instead of being introduced abstractly, and applicatives show up through error-accumulating validation with <code>`!`</code> and <code>`*`</code> operators, contrasted against the way monads short-circuit. The exceptions were the door monoid section and parts of chapter 7, where the vocabulary showed up before the payoff did. That was disorienting in the moment, even though the payoff did eventually arrive by the end of the chapter.</p>
<p>The Kotlin was the kind you&rsquo;d want to see in a strong codebase, with extension functions, receiver types, sealed classes, and generics all used the way they&rsquo;re meant to be used and not just as vehicles for FP theory. The actor-based test framework, Pesticide, was a neat pattern too, you write a test once and run it against the domain, a local HTTP server, or a deployed instance, even if I&rsquo;m not sure I&rsquo;d adopt the library itself over something mainstream like kotest.</p>
<p>The final third, especially the logging and JSON chapters, had a noticeably higher error rate than the rest of the book. Functions like <code>storeEvents</code> got used before they were shown, parameter counts didn&rsquo;t match, and field names had typos. The JSON chapter has you build a hand-rolled JSON library that even the author admits he was &ldquo;wary&rdquo; of introducing, and it&rsquo;s incomplete, since its own reflection-based code generation &ldquo;seldom works right without manual intervention.&rdquo; A thin adapter wrapping kotlinx.serialization in an <code>Outcome</code> probably would have served the book&rsquo;s own goals better than building JSON parsing from scratch. There&rsquo;s also an optional 50-page category theory appendix, which was a mixed bag. Functors, monads, and comonads mostly confirmed what the main text had already taught me, and Kleisli categories turned out to be <code>bind</code> with different notation once I decoded them, but profunctors and the Yoneda lemma were presented abstractly enough that I had to reconstruct them from the code examples myself before they landed.</p>
<p>Looking back at it now, after a stretch in Haskell, I remember a lot more about the DDD and TDD from this book than I do about the details of Kotlin. It was really into TDD, with the whole app built outside-in from acceptance tests, and I miss that now that I&rsquo;m working through 1000 pages of <em>Django 5 By Example</em> without a single test in them. Anyway, it&rsquo;s a dense book, but it was worth the length, and it changed how I think about combining DDD, testing, and FP instead of treating them as separate concerns. I&rsquo;d recommend it to someone with some Kotlin under their belt and the patience for some rough editing toward the end.</p>
<p>Full <a href="https://github.com/llcawthorne/book-notes/blob/main/kotlin/from-objects-to-functions/book-notes.md">book notes</a>.</p>
]]></content:encoded></item><item><title>A Blog Reborn</title><link>https://llcawthorne.github.io/posts/a-blog-reborn/</link><pubDate>Tue, 04 Aug 2026 17:07:11 -0400</pubDate><guid>https://llcawthorne.github.io/posts/a-blog-reborn/</guid><description>&lt;p&gt;So, I haven&amp;rsquo;t been blogging for about ten years. To tell the truth, I spent
all day programming, so when I got off work, I spent my time reading history
or philosophy or anything else not computer related. I can see from my
previous posts that I was experimenting with video and had started reading
Agile Web Development with Rails. Well, I&amp;rsquo;m still a full stack web developer,
so I could do worse than looking back at the web framework that really started
it all. So I will read Agile Web Development with Rails 8 and get a taste of
convention before configuration. That doesn&amp;rsquo;t really fit with the new title
of the blog, but it&amp;rsquo;s still something I want to do, so I will get it done.
I was interested in functional programming and different approaches to web
development 10 years ago, and have never fully explored either, so I&amp;rsquo;m picking
up where I left off with a slightly updated approach.&lt;/p&gt;</description><content:encoded><![CDATA[<p>So, I haven&rsquo;t been blogging for about ten years. To tell the truth, I spent
all day programming, so when I got off work, I spent my time reading history
or philosophy or anything else not computer related. I can see from my
previous posts that I was experimenting with video and had started reading
Agile Web Development with Rails. Well, I&rsquo;m still a full stack web developer,
so I could do worse than looking back at the web framework that really started
it all. So I will read Agile Web Development with Rails 8 and get a taste of
convention before configuration. That doesn&rsquo;t really fit with the new title
of the blog, but it&rsquo;s still something I want to do, so I will get it done.
I was interested in functional programming and different approaches to web
development 10 years ago, and have never fully explored either, so I&rsquo;m picking
up where I left off with a slightly updated approach.</p>
<h2 id="haskell">Haskell</h2>
<p>But let&rsquo;s talk about the new title. It is &ldquo;Senior Software Engineer Learns
Functional Programming.&rdquo; One of the last things I did but never blogged about
was try to learn Haskell. I started with the venerable
<a href="https://haskellbook.com/">The Haskell Book</a>. I read a bit over half and
realized I still couldn&rsquo;t program much of anything in Haskell. This was after
spending previous effort learning functional programming. I learned some
Scala and the syntax of Clojure and felt ineffectual with both aside from
being able to use Scala as a better Java, so that&rsquo;s what led me to Haskell
to learn functional programming right. Well, I still want to do that. I didn&rsquo;t
think I wanted to really, but I spent some time reading <em>Advanced Functional
Programming with Elixir</em> and it made a perfectly good case for why Haskell is
a better programming language and featured a style that was not idiomatic
Elixir but instead very Haskell inspired, and it got me interested again. So
I&rsquo;m not going to start over with The Haskell Book and try to re-learn
programming from first principles. Instead I am going to read
<em>Haskell by Example</em> which is more hands on and dip into the explanations of
<em>The Haskell Book</em> whenever I need more theory. I&rsquo;m also about halfway
through <a href="https://learnyouahaskell.github.io/"><em>Learn You a Haskell</em></a> which
I started over vacation, since I&rsquo;m finding my intuition for working with
linked lists has degraded.</p>
<h2 id="elixir">Elixir</h2>
<p>The subtitle of the blog is &ldquo;With explorations in
Haskell, Elixir, and Clojure&rdquo;. I&rsquo;ve already read two Elixir books on the
basics of the language (reviews upcoming) and I have every intention of
spending more time with Elixir. The books I read didn&rsquo;t even touch on the cool
Actor model and OTP stuff that makes Elixir unique. It&rsquo;s not the best language
for learning to deal with immutable values since it allows you to rebind
variables, which feels a bit like cheating. Sure the data structure itself is
immutable, but you just end up pointing the same variable at the updated
copy. Haskell won&rsquo;t let you get away with that. I understand since the
variables aren&rsquo;t global and are local to the Actors working behind the scenes
it is safe even for concurrent code, but I intend to learn how to deal with
immutable data structures bound once to a name. So I will definitely spend
some time away with Haskell but eventually get back to Elixir. It overlaps
my other goal of trying web frameworks thanks to Phoenix, so my two big
projects (&ldquo;Learn Functional Programming&rdquo; and &ldquo;Try Web Frameworks&rdquo;) actually
meet.</p>
<h2 id="clojure">Clojure</h2>
<p>I have also bought the most recent edition of <em>Programming Clojure</em> and
<em>Clojure Brain Teasers</em> and plan to spend time with it again. I read
<em>Getting Clojure</em> and <em>Living Clojure</em> and <em>Clojure for the Brave and True</em>
years ago, and I felt pretty comfortable with the syntax of the languages and
all the parentheses, but I never was able to use it for much. So after I
spend some time writing code with Haskell, I&rsquo;ll spend some time with Clojure
again and see if I can do anything cool with it. I&rsquo;m a Java developer by trade,
so its position on the JVM feels quite welcome, and once I learn idiomatic
functional coding in a language where I can&rsquo;t back off and call Java code,
maybe it will be accessible to me. I&rsquo;ll probably spend a while with Haskell
and then Elixir first though. I do want to play around with Ring to try
writing my webapps with a minimalist Clojure library.</p>
<h2 id="web-frameworks">Web Frameworks</h2>
<p>Back to the web frameworks though&hellip; I was going to dive into <em>Agile Web
Development with Rails 8</em> and try Ruby. Then I will read through <em>Django 5
by Example</em>. This builds up four sizable projects which I plan to steal.
I don&rsquo;t really like any dynamic language all that much, but I do normally
prefer Python to Ruby for its usefulness with AI and its sensible stance
on one way to do things and lack of going crazy with metaprogramming. I have
every intention of stealing the Django projects to reimplement in other
frameworks to serve my own curiosity. First in Rails, then move on to the next
stop. So then I can read <em>Programming Elixir</em> and <em>Programming Phoenix
Liveview</em> to try doing a web framework. How do I plan to make time for all this?
Well, I think I can wrestle with Haskell for at most 30-60 minutes a day, so
my time beyond that can be spent toying with web frameworks which requires
less cognitive load. After Phoenix, there&rsquo;s other options. I can try writing
a typed API in Haskell with Servant or do something with Yesod. I also wouldn&rsquo;t
mind reading <em>Distributed Services in Go</em> and trying the same projects as
microservices. I happen to like Go for being so simple that you can&rsquo;t hide
anything behind the language. I&rsquo;ve recently read two books on it (reviews
forthcoming) and feel pretty comfortable with it. Aside from that, I wouldn&rsquo;t
mind trying an Angular frontend with a backend in another language, since we
actively use Angular in the new project at work. And I&rsquo;m not opposed to trying
React to just see the difference. Obviously, all JavaScript Single-Page
Applications are more the rage now than old school web frameworks like Rails,
and it fits my interests of seeing different ways to do things. I also have
been toying around with Kotlin and would love an excuse to go back, so I would
like to try Spring with Kotlin for the big enterprise way of doing a web
framework along with Ktor for a lighter weight framework in the same language.
I could code Spring in Java, but I do like not coding in Java when I&rsquo;m away
from work and find Kotlin a fun alternative. Spring and Angular are probably
the most professionally relevant interests that I&rsquo;ll be pursuing, but it&rsquo;s
obvious that I&rsquo;m not trying to maximize for utility. I do really think it
very clever that the new project at work is leaning into a modern Angular UI
with a Java backend instead of using any of the trainwreck front end projects
available on the Java platform. JSF was bad enough to make me never want to
see a Java frontend again. Anyway, that&rsquo;s as far as I&rsquo;ve thought
these two projects through, but if I make it that far with them, I&rsquo;ll have
a better idea of what I want to do next. Put together, they should keep me
busy for a while, and assuming I don&rsquo;t give up blogging for ten years or so
again, it will give me something to blog about.</p>
<h2 id="why-now">Why Now?</h2>
<p>Why do I think blogging will catch on this time? Well, what made me give up
my side projects and blogging before was primarily being burnt out on spending
all day coding at work to get off and do more of it at night. Now that my kid
is older and I&rsquo;ve got more time to focus on personal development, I figured
why not fire the blog back up so I can shout my book reviews and whatnot into
the void. Aside from that, work has us leaning a lot more on AI for writing
code these days, so it&rsquo;s as good an excuse as any to keep my own skills sharp
with some side projects. I&rsquo;ve also been rather good lately at putting my mind
to stuff and keeping it going.
I lost about 40 pounds and run 10K every day I don&rsquo;t lift weights. So maybe
I can stay focused on something intellectual too. Also, I still run over an
hour most days a week, which gives me a great opportunity to listen to a
history audiobook or fictional work, so it isn&rsquo;t like I&rsquo;m giving up my hobby
reading. I&rsquo;m just cutting into other spare time with a new project. As a busy
dad, I really get 1-2 hours of free time that I&rsquo;m not working out most days,
so it&rsquo;s easy to spend 30-60 minutes on Haskell and the remainder if there is
any on something else. Or so I think. We&rsquo;ll see if this blog rebirth lasts.
So far, I&rsquo;ve read about 8 technical books that I&rsquo;ll end up posting reviews
for, so I already have more content than I had last time before
discontinuing it, and it seems something fun to do. I&rsquo;ve already been reading
a minimum of 30 minutes a day for over a year, and often for hours, so I&rsquo;m just
going to read different stuff.</p>
<p>I didn&rsquo;t put this in the first draft, because it feels kinda silly to get
inspired by a book about a famous person, but there&rsquo;s also another thing
that motivated me to do more programming on the side. I listened to the
audiobook on Steve Jobs while I was running. Really, I don&rsquo;t care that much
about Steve Jobs and still don&rsquo;t after listening to his life story. He
definitely had vision and did good things with Apple, and I&rsquo;m writing this
on a Mac so can&rsquo;t complain about the results, but I consider him more of
a visionary businessman than a real hacker. I liked Isaacson&rsquo;s biography
of Benjamin Franklin and figured Steve Jobs would be another accessible work
by him for my runs. But you can&rsquo;t read about the founding of Apple without
encountering Woz. A true engineer that would&rsquo;ve gladly made computers and
gave them away, because he loved tinkering with circuitboards. I don&rsquo;t really
care about circuitboards either; I&rsquo;ve always been a software guy. But being
exposed to a story with that type of passion reminded me I used to be
passionate about computers.</p>
<p>I&rsquo;ve always had a bit of a love-hate relationship with Apple. I still have
Linux on my desktop PC and am a proud member of the Columbia Linux User&rsquo;s
Group despite not attending meetings all that often.
The early Apple computers were toys with no CLI and one button mice
because multiple buttons are confusing. But after OS X was reborn with BSD
under the hood and a full fledged terminal, I found that having a computer
that mostly worked with the default configuration and
actually looked pretty good made it easier for me to focus
on writing code and not spend so much time tinkering around with Linux. I
learned from the Steve Jobs book that the first Macs were expandable
because Woz thought people should be able to tinker with their own computers.
Maybe I would&rsquo;ve liked those better than the Macs at school.</p>
<p>Anyway, back to passion, I didn&rsquo;t take my computer apart and hide all the
pieces because I thought it would be faster when I put it back together
hours later. I did it because I wanted to learn how a computer was put
together (I didn&rsquo;t know I wasn&rsquo;t really a hardware guy back then; I honestly
prefer buying them off the shelf now).
I also didn&rsquo;t learn C and relational databases because I thought they would be
profitable (although database knowledge is the gift that keeps on giving).
I loved solving problems in C in the middle of the night on my hand-me-down
computer. I didn&rsquo;t found an ISP in the 90&rsquo;s to get rich quick,
I founded it to have fast Internet access and to have cool problems to
figure out. Likewise, I didn&rsquo;t make straight A&rsquo;s in school because I
expected it to help my
job prospects. No one cares about my GPA. I loved the material! It was
fascinating to learn about algorithms, operating systems, and, after
programming so long, compilers. Somewhere along the way, it just became work
like any other job. So it&rsquo;s a combination of factors: having more free time
now that my kid&rsquo;s a little older, work leaning harder on AI for the actual
code these days so I want to keep my own chops sharp on the side, a refound
passion for programming inspired by a rather unlikely source, and the fact
I&rsquo;ve been reading every day over a year anyway, so why not make it technical.
I still don&rsquo;t know functional programming beyond how to apply a good
map and filter, and I still haven&rsquo;t tried a lot of different web frameworks.
They&rsquo;re all likely to be better than the Java EE/Spring hybrid monstrosity
that I work on most of the time. Almost anything beats JSF.</p>
<p>And as an aside, this will probably be my last time trying to learn
&ldquo;functional programming&rdquo;. If I try to learn the secrets of Haskell again
and bounce off, I am just going to adopt Go as my programming language of
choice and write lots of simple procedural code with structs and <code>err</code>
checks every other line. As an old school C hacker and Perl scripter before
they bolted on OOP, it feels quite natural to write straightforward procedural
code, but I&rsquo;m trying to work outside my comfort zone even if I think the
benefits of functional programming might be overpromised.</p>
<p>But I really kinda understood the point of functional programming with
<em>Advanced Functional
Programming with Elixir</em>, and all those <code>err</code> checks in Go grated at
my nerves, so the beauty of being able to chain a bunch of calls together then
deal with errors or results at the end was quite appealing to me. Monads
aren&rsquo;t really the Elixir way though. Your average Elixir programmer would
do some simple pattern matching to catch <code>:err</code> and deal with it instead, but
<em>Advanced Functional Programming with Elixir</em> featured a Haskell inspired
functional programming library and monads. And while I wasn&rsquo;t ultimately
convinced of the utility of the Reader or Effect monads (I&rsquo;m open to learning
more about those in Haskell, and I will have to anyway if I spend time with
it), I really liked Maybe and liked Either even more. Even Java has Option,
but Either is a lot more useful. Plus parallel validations with Applicative
were kinda cool. They weren&rsquo;t a reason to re-learn programming, but I&rsquo;ll take
them along with my Either and roll with it a bit.</p>
<h2 id="conclusion">Conclusion</h2>
<p>So that&rsquo;s it. The blog is reborn. I&rsquo;ve got one project that meshes with the
title of learning functional programming. I have another of trying web
frameworks that has some limited overlap built in and picks up where the
blog left off. I transferred my old posts over and rebuilt the site in Hugo
and moved over what I could from the old Jekyll files. And I&rsquo;ve written a
very long coming back
post plus already have a stash of book reviews in my Obsidian. So I guess
I&rsquo;m back and doing this for now and we&rsquo;ll see where it goes. I may get
tired of posting updates here and just read the books, but I like having
somewhere to collect my thoughts and review what I read.</p>
]]></content:encoded></item></channel></rss>