David Marchese calls the interview that the NYT published on their daily feed yesterday, "one of the most emotionally intense interviews I think I have ever done…" I think it is one of the most emotionally intense interviews I have ever heard. It is whimsical, profound, and beautiful in many ways. Wow.

#podcast #literature

podcast (1) literature (1)


Post photo
Post photo
Post photo

Aspen in Avon, Colorado. Also testing multiple image upload.

#testing-fediverse

testing-fediverse (6)


Post photo

Avon, Colorado

Added the capability to add photos to a post.

#testing-fediverse

testing-fediverse (6)


After changing the template on the server, time for the next test! Do hashtags show up in federated social media apps?

#testing-fediverse

testing-fediverse (6)


Testing my new little posting pipeline:

  • Draft in fediverse follow (social?) / mentions / interactions/ posting mobile app. Naming is hard…
  • After drafting, the app makes pushes the post to the git repo behind my static website
  • The push triggers a build which redploys the page with the new content and send potential webmentions

Let's see how this goes!

Oh, yeah, if this works, it is definitely slow to update… So maybe the apps name is Slowcial?

#testing-fediverse

testing-fediverse (6)


Welcome to mastodon, @stephanhagemann.com !


In reply to: @shageman@ruby.social

Trying out these guides to sending webmentions...

Some of the pages I am on right now:

#fediverse #testing-fediverse

fediverse (1) testing-fediverse (6)


Am I going to see you at RailsConf next week?

I am part of a big group from @GustoHQ that is going to and I would love to chat about all things and !

medium.com/gusto-engineering/g


Engines and Gems: Destination. Not path.

Ten years ago, I wrote Component-based Rails Applications. Today, on cbra.info, I have this banner: "I consider the CBRA approach deprecated. Gradual modularization based on packages gives us all the benefits of components (and more) for much lower costs."

Gems and engines still play an important role, just not as the path but rather as the destination.

#gradual modularization #gems #engines

gradual modularization (21) gems (1) engines (1)


What is the modularization destination for large apps?

When talking to developers about gradual modularization, one of the questions is, "So... where are we headed?" That is, what is the destination of a modularization journey?

#gradual modularization #architecture

gradual modularization (21) architecture (4)


👋 Just a heads up that I re-released Chapter 8 with updated content on measuring modularization progress!

In addition to general improvements, this release fixes outdated references to how things work with the various open-source tools.

Get it here:
leanpub.com/package-based-rail
stephanhagemann.com/books/grad

If you already bought the book, log into @leanpub to get the latest version!


Folks are still finding engines as a way to do modularization in and . I just found two new talks (one from ) where folks are presenting how they approached it! I added both to cbra.info

youtube.com/watch?v=StDoHXO8H6
youtube.com/watch?v=ZE9dKoBIr4


Update on progress.

stephanhagemann.com/books/grad

Today I am releasing Chapter 4 in full. This includes all the protections that you can apply using packwerk and RubyAtScale tools:

* privacy
* architecture
* visibility
* folder visibility
* API documentation
* API typing
* Namespacing
* API Structure


And another one!! Nested-visibility checker. As I wrote earlier today: this one does not exist yet. I recorded it as an issue on the packwerk-extensions repo: github.com/rubyatscale/packwer

These semantics:

```
packs/a VIOLATION
packs/b OK
packs/b/packs/d OK
packs/b/packs/e ENFORCE_NESTED_VISIBILITY: TRUE
packs/b/packs/e/packs/f VIOLATION
packs/b/packs/e/packs/g VIOLATION
packs/b/packs/h OK
packs/c VIOLATION
```


The next section of the Gradual Modularization book is rolling of the press right now: Visibility enforcement.


I want to tell you _why_ I didn't publish anything for the Gradual Modularization book... between June and October. It is related to _how_ I am writing and it will likely happen again... maybe today :D

In June I announced (stephanhagemann.com/posts/2023) that I had to change tactics and catch in writing with what had been going on in our open-source work at github.com/rubyatscale.

This was always going to be the work of Chatper 4 I started talking a couple of days ago.

But then...



Second drop of Chapter 4... in which I discuss the usage of the architectural layers extension to .

stephanhagemann.com/books/grad


I just published a long overdue update to the Gradual Modularization book. Here is what I wrote my readers (of which I apparently have 622!!): stephanhagemann.com/posts/2023


Message to Readers of Gradual Modularization

A message I sent to the readers of Gradual Modularization for Ruby and Rails regarding the new update published today.

#gradual modularization

gradual modularization (21)


Next Monday, the Ruby Modularity slack is trying something new: an online meetup. Join us! meetup.com/ruby-modularity-gro


Message to Readers of Gradual Modularization

A message I sent to the readers of Gradual Modularization for Ruby and Rails regarding the new update published today.

#gradual modularization

gradual modularization (21)


Leanpub is having a sale of my book Gradual Modularization for Ruby and Rails 👀 It ends tomorrow... Get it now! leanpub.com/package-based-rail


I uploaded a new version of the Gradual Modularization book: It contains a boatload of copy-editing. Moral of the story: Could've done this months ago! Feels good to do some spring cleaning.

leanpub.com/package-based-rail


After taking in a lot of new ideas and connecting with colleagues across my industry at @railsconf this week, today, I signed up to become a member of @rubycentral . Things like rubygems, RubyConf, and RailsConf would not be possible without them and I support this work.

Will you join me? rubycentral.org/#/portal/signi


If you attended and liked Guillermo Aguirre’s talk on Applying microservices patterns to a modular monolith, join me tomorrow for an introduction for how to get started with one of the fundamentals discussed in the talk: Rails Modularization with Packwerk: railsconf2023.sessionize.com/s


Thanks to everyone who attended our modularity lunch! I very much enjoyed the time and the varied discussions!


Railsconf Modularity Workshop update: We got notified that signups are no longer possible, because we're at capacity for the room we're going to be in.

We also got this message: "However, there may be some extra seats (a few) in there, so swing by and check to see if there is anywhere to sit and join!"


I am super happy and proud with my team's and Gusto's showing at RailsConf this year: @maple @baweaver @nateberkopec and Alex!! Yay!

Check out details here: engineering.gusto.com/gusto-at

Alex and I are planning a modularity lunch for Tuesday and are also doing office hours, which you can sign up for here: tinyurl.com/modularityOH


Yup, this is legit. Good and relevant comparison; well researched. Definitely not spam. Definitely not generated by shitGPT.


I have been thinking about how how gradual modularization fits into work of "changing code for the future" (trying to avoid all of the words in the chart)...

Does this resonate? What questions do you have?


Are you attending @railsconf ... and following me??? Then you might be interested in joining me for the workshop _Gradually Modularizing your Monolith with Ruby Packs and Packwerk_ that I am hosting together with my colleague Alex! Sign up is here: eventbrite.com/e/workshop-grad


Together with Alex Evanczuk, I am going to lead a workshop on gradual modularization at RailsConf in Atlanta on April 26.

Are you going to join us?

railsconf2023.sessionize.com/s


Today, I participated in a book club session for leanpub.com/package-based-rail... It is so humbling to see in how many ways I get misunderstood, make points less than clear, and could improve structure... I am so grateful to anyone who engages with the topic. Thank you!


Over my winter break I realized that not having finished leanpub.com/package-based-rail is weighing on me. Last half I took a long break because I needed to reassess what I should still add. Here is what I have come up with:

* Do-over for Chapter 7 - many gems have seen big revisions and improvements
* Finish Chapter 8 on metrics
* Add Chapter 9: How to create modularization progress in your org
* Add Chapter 10: From modularity to autonomy

Which chapter are you most interested in?


TypeScript's superpower

In his post When Static Types Mask Code Smells Jared White reflects on a discussion about TypeScript and makes the case that static typing isn't a panacea. It does not fix all your code problems. Indeed, it does not!

#gradual typing #typescript

gradual typing (1) typescript (1)


🧵 A thread about gusto’s newest #bigrails open source work

🧵 A thread about gusto’s newest #gradualmodularity (nah, I should say #bigrails) open source work: It is all about managing big Rails applications with a lot of people!

There is a lot, so buckle up!

See them all at https://github.com/bigrails

...

This work is part of what the product infrastructure team does at https://twitter.com/gustohq!

If stuff like this is interesting to you, DM me (on twitter) or find me elsewhere and let’s chat!

...

First up https://github.com/bigrails/stimpack! This gem makes organizing your Rails app’s folders such that they work well with packwerk a breeze. Just point it at a folder and all needed autoloading is done for you! Kudos to https://twitter.com/nganpham!

...

We use https://github.com/bigrails/bigrails-teams to create the concept of an engineering team in our codebases as an explicit construct. This can be used to route errors, notifications, deprecations, etc. In short support for breaking down a large app by team. Which brings us to...

...

https://github.com/bigrails/code_ownership! We use this gem to ensure that every file in a codebase has an owner. This way, for example, we can ensure that every error can be routed to a team.

...

With https://github.com/bigrails/danger-packwerk we get to direct support for #gradualmodularization work. This gem contains a danger plugin that will make inline comments on GitHub PRs that add packwerk violations. This helps teams know about and learn about boundary violations and what to do!

...

That danger is https://github.com/danger/danger btw

...

We published a VSCode extension, too! https://github.com/Gusto/packwerk-vscode. This extensions gives you that warm fuzzy feeling of a red squiggly line underneath a constant when you happen to create a privacy or dependency violation in the code you are writing.

...

If you read my book Gradual Modularization with Ruby and Rails, the gem https://github.com/bigrails/package_protections will feel familiar. It is our implementation of the ideas from Chapter 3! It is an opinionated framework for protecting more aspects of modularity than just privacy and dependency.

...

Last but not least: https://github.com/bigrails/modularization_statistics. This gem reports modularization stats to data dog, so you can build yourself a bunch of sweet dashboards that show overall progress. We have it connected to teams, code ownership, and package protections as well.

...

All of these gems have seen herculean efforts by https://twitter.com/AlexEvanczuk to get them built and to get them open sourced.

Hint: Alex will be at https://twitter.com/railsconf next week talking about all of this stuff (https://railsconf.com/program/sessions#session-1321)!

...

Hint hint: a bunch of Gusties will be, including me ;)

#gradual modularization #tweet

gradual modularization (21) tweet (4)


Gradual Modularity: Chapter 6 is out!

The message I sent to folks who bought Gradual Modularization for Ruby and Rails about the publication of Chapter 6!

#gradual modularization #book news

gradual modularization (21) book news (1)


Gradual Modularity: Chapter 6 draft available!

I have dragged my heels long enough! That's why I pushed publish on the first complete version of Chapter 6: _Managing Privacy Violations_ while I am having it proof read at the same time. Check it out at https://leanpub.com/package-based-rails-applications!
/posts/2022-05-02-chapter6-is-out/

#tweet

tweet (4)


Can I tweet from here?

Just testing whether I can tweet from here...

This post is following https://brid.gy/about#webmentions to publish a tweet automatically. Let's see!

#test #tweet

test (2) tweet (4)


Can I tweet from here?

Testing some more. So that seems to work... Let's check a link back to here.
/posts/2022-05-02-can-i-tweet-from-here-2/

This post is following https://brid.gy/about#webmentions to publish a tweet automatically. Let's see!

#test #tweet

test (2) tweet (4)


Rails Apps Size Tests

Want to generate some quick stats for the size of your Rails app (and likely some of its problems)?

These are the queries I used to generate graphs for some big open-source Rails app for my 2014 RailsConf talk Refactoring towards Component-based Rails Architecture.

#ruby #rails

ruby (12) rails (10)


Gradual Modularity changes from recent Ruby, Rails, and packwerk updates

How do Ruby 3, Rails 7, and packwerk 2 affect the source code for Gradual Modularization for Ruby and Rails? Let's find out!

#gradual modularization #ruby #rails #packwerk

gradual modularization (21) ruby (12) rails (10) packwerk (2)



If you find yourself in a hole, stop digging

There is this thing called the law of holes[^1]. It's interesting...

#musing

musing (1)


3 Ways I Am Changing How I Publish The Gradual Modularization Book Starting Now

My recent experience of publishing 30 atomic essays in 30 days[^1] failed in one way: I only got 25 articles out. I succeeded in most other ways and will apply my learnings from this time to how I work on and publish Gradual Modularization for Ruby and Rails[^2].

#gradual modularization #publishing #atomic essays #editing

gradual modularization (21) publishing (2) atomic essays (1) editing (1)


Should Product Development Teams Be Done With The *Definition Of Done*?

I recently came across a very practical application of the analysis of agile vs post-agile[^1] in a simple observation from a new team member: "It seems like our definition of done is really unclear."

#agile #post-agile #impact

agile (2) post-agile (2) impact (2)


Software Engineers Beware: Even Instantaneous Migrations Can Bite

This is an old example, but a good reminder: even instantaneous migrations can bite you in the ass. Be careful.

#technical migrations #instantaneous migrations #dependencies #hacking

technical migrations (2) instantaneous migrations (2) dependencies (1) hacking (1)


Naming 3 types of technical migrations to make us better at tackling them

The cost and benefits of technical migrations are hard to pin down. Discussing them efficiently is also difficult without properly understanding what we are talking about. This article creates a nomenclature to help with this.

#technical migrations #instantaneous migrations #localized migrations #global migrations

technical migrations (2) instantaneous migrations (2) localized migrations (1) global migrations (1)


Make Your Self-hosted Website Come To Life By Connecting It To Your Social Media

I have always felt like I wanted my web content to be on my website. I have also always felt that my website is a pretty lonely and inactive place.

#personal website #webmentions #social media

personal website (1) webmentions (2) social media (1)


Three Ways Engineering Leaders Evaluate Team Performance

A 2 minute detour in a conversation with my mentor at my work, Gusto (we're hiring... a lot[^1]!), connected the dots on big trends in the software industry that are so foundational, I am embarrassed to say, I missed them.

#software engineering #team management #agile #pre-agile #post-agile #performance #planning #velocity #impact

software engineering (1) team management (1) agile (2) pre-agile (1) post-agile (2) performance (1) planning (1) velocity (1) impact (2)




Zettelkasten VS Atomic Essays

Zettelkasten VS Atomic Essays? More like Zettelkasten AND Atomic Essays!

#productivity #zettelkasten #atomic essay

productivity (11) zettelkasten (3) atomic essay (1)


How I use Joplin for managing my to-do list

I have tried many to-do list applications and systems. They were all too complicated.

#productivity #tools #joplin #to-dos #technique

productivity (11) tools (9) joplin (4) to-dos (1) technique (3)


5 plugins turn Joplin into a powerful and customizable Zettelkasten

In 1992, Niklas Luhmann, a German sociologist who published over 50 books and over 400 academic articles, published Kommunikation mit Zettelkästen about his use of the Zettelkasten method - explaining how it made him so productive.

#productivity #tools #joplin #zettelkasten

productivity (11) tools (9) joplin (4) zettelkasten (3)


To get smarter at what you do, make sure you _process_ what you read (using Joplin) - in 4 short steps

6 years ago I read this beast of an article titled "How to Use Evernote for Your Creative Workflow"

#productivity #tools #joplin #summarize #highlight #compression #comprehensiveness #evernote #technique

productivity (11) tools (9) joplin (4) summarize (1) highlight (1) compression (1) comprehensiveness (1) evernote (1) technique (3)


Switching to Joplin will transform your daily note taking

There are a bunch of note taking apps that seem pretty hip right now. The most en vogue might be notion and obsidian. I want you to known about a lesser know, open source alternative called joplin[^1].

#productivity #tools #joplin #note taking #technique

productivity (11) tools (9) joplin (4) note taking (2) technique (3)


Are windows with notes littering your screen? Do you loose them? Does it feel chaotic? We can fix that with one small change!

I still regularly find my screen getting cluttered with random notes, but I am getting better. In fact, just today I deleted the TextEdit app from my mac so I won't use it ever again. Let me tell you why. And, let me tell you how to fix your note taking.

#productivity #tools #note taking

productivity (11) tools (9) note taking (2)


Never able to find that zoom link fast enough? Always late to the next meeting? Use MeetingBar!

MeetingBar is for you if you use a calendar and you regularly participate in video calls[^1].

#macos #productivity #tools #meetings

macos (4) productivity (11) tools (9) meetings (1)


Still using your mouse for window management on macOS? Stop! Hammerspoon!

Hammerspoon[^1] boasts two things: a truly epic project name and a lua scripting environment that hooks into extensions that allow you to control system functionality in macOS.

#macos #productivity #tools #automation

macos (4) productivity (11) tools (9) automation (1)


2 ways homebrew for macOS is ... even better

Homebrew[^1] describes itself as "The Missing Package Manager for macOS (or Linux)." The program primarily installs command line applications but through its various extensions is, in my opinion, the best way to install and long-term manage applications on a Mac.

#macos #productivity #tools

macos (4) productivity (11) tools (9)


My 3 favorite ways to use Alfred

Alfred[^1] is a productivity app for Mac. It "boosts your efficiency with hotkeys, keywords, text expansion and more." For anyone who doesn't use the keyboard much to navigate around their system it will take some getting used to. But once you do, whew! Are some things much more straightforward to do!

#macos #productivity #tools #search

macos (4) productivity (11) tools (9) search (1)


Need inspiration? Talk to an eight year old about work!

Some time ago, we had family visiting. Mom, Dad, daughter, son. We were just hanging out for the weekend, took a leisurely stroll to our neighborhood shops to get some breakfast. The choice was burrito or bagel - and coffee. Sticking our purchases into our shopping bag, we headed to the park nearby to have a breakfast picnic.

We played ball, had breakfast, and raced. The sun was out, yet it was a nice fall day . It was good to be outside and be together. We walked under some trees that were turning colors. With the sun out they were brightly golden and orange. Pictures were taken. We ended up sitting in the grass in the middle of all these trees - in the sun.

Out of nowhere my nephew asks: "Can we make a game for my phone?"

Eight months earlier

When we saw each other the last time, we had visited them and the topic of work came up. I mentioned that I build software applications (I called them apps). "Oh, for the phone?" - "Sometimes, yes"

"Can you make games?" -- "I haven't made a game, but I might be able to. We could try to figure it out together, if you'd like." We chatted about some ideas, but attention spans being what they are, we didn't build an app.

Back to today

Because of that question, "Can we make a game for my phone?", we ended up: inventing a game, talked about game mechanics, about load screens. We ended up drawing a couple of wireframes and created an app starter on an simulator. Whether you'll find out game in an app store near you sometime soon, I don't know.

All the conversations that were part of this story were such a fresh perspective on my work, fun, inspiring -- a good reminder why I love the work I do.

#work #inspiration

work (1) inspiration (1)


The one reason that Gradual Modularity is relevant for all languages is totally backwards

If you have read any of my posts about gradual modularity and thought "well this is only interesting for those folks who messed up their (Rails) apps on their own in the first place," read this post. I don't believe that is true: Gradual Modularity can benefit engineers working in most languages and frameworks.

#gradual modularization #refactoring

gradual modularization (21) refactoring (1)


Gradual Modularity - A definition attempt

Yesterday's attempt at a concise description of what Gradual Modularity is[^1] fell short of being a definition. Here is another attempt at that.

#gradual modularization

gradual modularization (21)



Gradual Modularity - What is it?

The largest software development organizations in the world make heavy use of microservices (or service-oriented architectures) - one kind of modularity that allows organizations with thousands of developers to be productive.

Our options today create a great hurdle for modularization refactoring work

Beyond classes and objects, the most common mechanisms to achieve modularity are libraries (running within the application process and services (running outside of the application process as standalone applications). These kinds of modularity create “perfect isolation.” Perfect in the sense that the functionality of these libraries and services verifiable in isolation.

From the perspective of refactoring towards libraries or services, the perfect isolation property poses a problem: The extraction refactoring needs to create “perfect” isolation, too. That is a daunting proposition for apps that have developed into “balls of mud” (lets say because of an over-eager object-relational-mapper layer - read: basically every Rails app in the world) - things are simply too entangled for this process to be easy.

Gradual Modularity removes the modularization refactoring hurdle

Gradual Modularity removes the need for perfect isolation. Take two parts (let’s call them packages) of an application that we’d like to modularize:

Only partially known dependencies? Only partially defined public APIs? Some usage of private code? Partially clobbered namespaces? Only partially separate databases? All of this doesn't work with services or libraries. It is totally fine with gradual modularity.

For each package we can define and lock in the level of isolation that we’d like to achieve for the moment. Depending on the level, violations are allowed. Violations don’t break the app, instead they are recorded in todo-lists that are checked in with the code.

Gradual Modularity, through allowing partial, leveled isolation and todo-lists for outstanding isolation work, gives developers a toolset to confidently and iteratively refactor towards a perfectly modularized system.

Follow along with me as I am writing a book on Gradual Modularity at https://leanpub.com/package-based-rails-applications

#gradual modularization

gradual modularization (21)


Three reasons why the one legitimate criticism of Gradual Modularization falls short

I have found one criticism of gradual modularity that resonates:

Gradual is really just somewhat. This whole idea has no teeth and won't lead to actual change with positive impact.

#gradual modularization

gradual modularization (21)


Switching to packages is a game changer (says the guy who pushed for components for almost a decade)

Let's start with how I use the two terms:

When I say components, I mean individually tested, isolated, explicitly dependent, and composed software parts that are combined to make the functionality of an application1. In practical terms, components in various languages are Ruby gems, Java Maven projects, or Node modules.

With packages, I am referring to more-or-less individually tested, more-or-less isolated, and composed software that are combined to make the functionality of an application. Packages don't widely exist and they have been introduced to Ruby only a year ago when Shopify open-sourced packwerk2.

I pushed for components for a long time: Hear me when I say: Stop. Use packages.

Separating code into components (or services) is a big decision

In order to make components - the same goes for service creation or extraction btw - some big decisions come first: Which functionality should live together? What should its API be? It also comes with a lot of work: Set up a separate test suite. Set up and maintain the new CI/CD pipeline. These decisions and this work is risky: what if we get it wrong?

Software engineers wouldn't put this work in if it weren't worth it though. So why do we do it? To manage complexity. To ensure that the incidental complexity of our application is not too much higher than the essential complexity of our domain.

Don't look back

With packages, you replace the "one big decision" of components with many, many, much smaller, easier, and far less consequential decisions around packages3. That is why packages are a game changer: we can get to the same destination, but we can get there with waaaaay less risk along the way.

#gradual modularization #components #packages

gradual modularization (21) components (3) packages (1)


FactoryBot - Feeding the beast?

ActiveRecord (AR) is the main driver of incidental (read: superfluous) complexity in your app. Do not feed the beast.

#testing #test factories

testing (4) test factories (1)




You should want more data out of your (flakey) tests

If you are working with a large codebase, then you are likely dealing with test flakes. Flakes? Tests that, ever so often, report a failure where no relevant change to the system has happened. Google seems to think that a certain amount of flakes is unavoidable[^1] and I agree.

#testing #test flakes

testing (4) test flakes (2)


The one big difference between writing and writing NOW

So, I started this thing... "ship 30 for 30"[^1] after seeing a couple of nice posts by Matt Stine[^2]. Really, we haven't even really started yet. The first post is to come out Saturday, but in trying out this editor we're going to use throughout the course on thing struck me: In order for me to do this successfully I will to switch from writing to .. writing NOW.

#writing #publishing

writing (2) publishing (2)


Gradual Modularity

When shopify released the tool packwerk they did more than just open source a utility they had been working on. They changed how we should think about application modularization.

#gradual modularization

gradual modularization (21)


Except where otherwise noted, content on stephanhagemann.com is licensed under CC BY 4.0 by Stephan Hagemann