Thursday, April 16, 2026

A bit about relational data in Java / Spring

Stepping away from JPA 

I recently found myself back in the Java world.

tl;dr

I belatedly discover spring data relational jdbc and realise it would have been a better fit for a lot of the things I used to use JPA for. 

the issues

If you've worked with JPA/Hibernate you will likely have encountered one or more of the following issues:

lazy initialisation issues / N+1 query performance issues

You defined your model - now when do you load relations and how does that impact performance? The tendency is to defer thinking about this to a later point in time and probably end up with something hackish like open session in view. (This is perfectly fine depending on the given context, as long as you're aware of the little bit of extra risk you take on.)

problems correctly defining cascading to ensure that related entities get created or deleted when modifying the root entity

You try to stick to domain driven design's definition of repositories and using aggregate roots. E.g. if you're adding a line item to and order, you want that to be persisted by saving the order and not by saving each line item individually through a line item repository. This is not inherently difficult, but configuring this correctly can get complex.

unexpected behaviour because of how proxied entity instances handle calls to internal methods

Hibernate/JPA does its magic (tracking changes, lazy loading, etc) by proxying the entities it handles and wrapping access to entity attributes with aspects. This makes it almost impossible to put any higher order logic into the entity code. This is rarely a problem in itself but tends to lead to excessive use of DTOs.

lots of redundant code mapping back and forth from anaemic DTO objects

It seems all too common to have a complete mirror of all JPA Entities in a set of DTO classes. Then this usually gets mapped back and forth by some automated mapper. This is seen as necessary mainly because of the issues already listed here. In the better cases it will look something like described in this post. Ultimately this makes changes to your models harder while providing very little benefit. 

(Compare to Python's FastAPI with pydantic, especially using different model projections to e.g. hide something like a password attribute)

problems testing all of this because of awkward transaction handling in integration tests

All these problems are solvable and don't mean there is no value in JPA. And a lot of the complexities can be designed and evolved by using tests. But a big issue there used to be in how lazy loading and cascading would behave subtly different depending on how transactions behaved in tests versus in production code. Presumably this should be slightly easier to handle with the proliferation of testcontainers and generally decent integration test support in spring. I haven't had a recent look at this.

a fresh look

So you take on these burdens for the benefit of automagic ways of defining your OR model. "ORMs, it's just what you do to work with relational data in Java." And some of that automagic in e.g. JPARepository is quite useful for basic query operations. 

I've never really questioned this because I do remember the pre-hibernate world of working directly with JDBC. But coming back to the Java world after a two-year period working in a different stack, I was curious to try out some of the project reactor features and in the process looked a bit closer at spring data relational. And with that then finally came the question, why am I even doing this (JPA) to myself? 

The difficulties inherent to trying to map arbitrary complexity of your domain model onto a relational database still exists and don't just disappear. I would just make the claim that in a lot of cases, dealing with those difficulties head on ends up producing simpler, more maintainable code than using JPA. There's still a good amount of querying automagic there (e.g. in CrudRepository/PagingAndSortingRepository) if you want it. And basic relationship handling with @MappedCollection also works well. 

(IntelliJ is also quite good at creating DDL sql for @Table annotated entities that can go straight into, e.g. Flyway scripts)

some examples

Taking the following simplistic model...
@Table("orders")
public record Order(
        @Id UUID id,
        UUID customerId,
        @MappedCollection(idColumn = "order_id", keyColumn = "list_key") List<LineItem> items,
        @Version int version
) {
    static Order forCustomer(UUID customerId, List<LineItem> items) {
        return new Order(null, customerId, items, 0);
    }

    public Order withItems(List<LineItem> items) {
        return new Order(id, customerId, items, version);
    }
}
@Table("order_items")
public record LineItem(
        @Id UUID id,
        String sku,
        int count,
        @Embedded(onEmpty = USE_NULL, prefix = "amount_") Money amount
) {
    static LineItem randItem(String sku, long amount) {
        return new LineItem(null, sku, 1, Money.rands(BigDecimal.valueOf(amount)));
    }
}
public record Money(BigDecimal amount, String currency) {
    static Money rands(BigDecimal value) {
        return new Money(value, "ZAR");
    }
}

 

It maps nicely to the following tables: (sql generated by IntelliJ with the exception of defaulting PKs to uuidv7(), which I added manually)

CREATE TABLE orders
(
    id          UUID PRIMARY KEY DEFAULT uuidv7(),
    customer_id UUID,
    version     INTEGER
);

CREATE TABLE order_items
(
    id              UUID PRIMARY KEY DEFAULT uuidv7(),
    order_id        UUID NOT NULL,
    sku             VARCHAR,
    count           INTEGER,
    amount_amount   DECIMAL,
    amount_currency VARCHAR,
    list_key        VARCHAR
);

ALTER TABLE order_items
    ADD CONSTRAINT fk_order_items_on_order FOREIGN KEY (order_id) REFERENCES orders (id) ON DELETE CASCADE;

 

@MappedCollection and @Embedded work as expected. I also like using records to make it clear that instances aren't mutable. You can then use either CrudRepository or JdbcAggregateTemplate to work with these. E.g.:

public interface OrderRepo extends CrudRepository<Order, UUID> {}

OrderRepo repo;
JdbcAggregateTemplate jdbc;

void examples() {
    UUID someCustomerId; // ...
    Order order = repo.save(Order.forCustomer(someCustomerId, List.of(LineItem.randItem("sku1", 11))));
    order = order.withItems(List.of(
            order.items().get(0),
            LineItem.randItem("sku2", 22)
    ));
    repo.save(order);
    
    List<Order> customerOrders = repo.findByCustomerId(someCustomerId);

    // more complex queries can be done with JdbcTemplate. JdbcAggregateTemplate provides easy mapping to entities though:
    List<Order> customerOrdersByTemplate = jdbc.findAll(Query.query(where("customerId").is(someCustomerId)), Order.class);
}
 

side note: on project reactor

Interesting to dig into a little. Adds a sizable amount of complexity with a lot of caveats (e.g. no support for nested entities in r2dbc). Ultimately not worth the effort except for very constrained use cases. Performance gains for IO bound tasks can instead be achieved with virtual threads.

Tuesday, January 7, 2025

Olly 2.0

 You blink and suddenly there's Observability 2.0. It's a logical conclusion of where the more interesting things were going, and I'm a little disappointed in myself that I didn't see this coming. One of those "obvious in hindsight" things for me.

Related articles:


I do see the main challenge as adoption. I wonder if this can step out of being a niche pattern. Specifically, I think I disagree with the "critical mass" part of this:

a critical mass of developers have seen what observability 2.0 can do. Once you’ve tried developing with observability 2.0, you can’t go back. That was what drove Christine and me to start Honeycomb, after we experienced this at Facebook. It’s hard to describe the difference in words, but once you’ve built software with fast feedback loops and real-time, interactive visibility into what your code is doing, you simply won’t go back.


The market has been changing rapidly and the capabilities provided by the big providers like Datadog, Dynatrace, Grafana Labs etc. are ever expanding: more integrations to import ever more sources of data, more ways to visualise data (Datadog now even visualises step flow executions). Yet at the same time I feel less excited and more confused then when I first started playing with InfluxDB on a client project in 2014 (real-time claims processing data for an insurance company that business didn't care about because they already had BI systems in place that they were happy with).

It is hard to actually find data that is relevant, nobody builds custom dashboards, instead you go back and forth between a variety of pre-built, generic service pages that show you a lot of little graphs but very little information. To make up for this Datadog, Dynatrace, Wavefront etc. all have some clever processing that tries to do some form of root cause analysis and anomaly detection for you. Often useful, always distracting.

I appreciate that it's no longer the default to have no instrumentation at all and to only hear about outages from customer complaints while you frantically try to deduce what's going on from what little actually useful logs you have. I'm just not sure how to advance beyond that.

On the data analytics side it seems to have now become common to have Data Stewards or some such role to ensure that whatever gets dumped into the data lakes by different teams adheres to some shared understanding of the world. Maybe something like that would be useful to agree upon in the dev world.

I've been excited enough about observability to do a conference talk about it. As mentioned in the introduction of that talk, it's because I want to get more people excited about the topic and because I think it's not easy to get started and see the possibilities if you're starting from scratch.

Honeycomb's sandbox examples seem to be the only thing that comes close to getting a glimpse of that. And even those examples are pretty heavily focused on the operational side.

As an aside - maybe there is a space for "open source" software to showcase some more higher level things to do with observability. IIRC Emelia was working on getting some metrics out of hachyderm and maybe things like that could be expanded on. (Hachyderm also seems large enough to have statistically relevant amounts of data)

It's my impression that not a lot of developers care all that much about observability. And the pretty decent out of the box support of open telemetry type agents covers quite a lot of operational concerns. So I'm wondering what the driving cultural change could be that would get developers interested in putting some time into considering what might be interesting to log about whatever piece of code they're currently working on.

I'm not sure if something equivalent to code coverage checks might be useful, if it were straightforward to build? I've not been a fan of hard coverage targets but as a soft constraint automated coverage and linting checks can be a useful way of automating standards that a team has agreed upon.

These changes might take time, I guess. As an industry we're still not particularly great about code quality. Taking TDD as an example, it's not like proper use of it is at all common. But at the same time doing at least some form of automated testing does seem the default now. I do remember the times when you had to justify the time spent on writing tests. We're clearly in a better place now.

Maybe over time it will become common to expect to be able to interrogate your running software for more interesting data than just how many request per seconds some controller is handling.

Tuesday, May 7, 2024

DevConf 2024

 DevConf 2024

 Update: talk is now online at https://www.youtube.com/watch?v=a-EB4d4FsyE

I'm doing a talk on Observability and wanted to add a few links with more information for people taking an interest.

Slides of my talk are on speakerdeck and the repo of my playground

Some useful guides

 Structured logging

A good intro to how rate queries work in Prometheus by Beorn Rabenstein (youtube)

A guide on how to do SLOs that I like

An interesting look to the future: https://hazelweakly.me/blog/redefining-observability/

Honeycomb's sandboxes 

Grafana Docs and playground

(Edit 09.01.2025) This post on structured logging is also really useful and worth adding to this post

Historical section

An old video by Coda Hale on metrics. The video and tech (dropwizard) are dated but I found it a good intro anyway

A bit more on how Netflix used to do deployments.  

Sam Newman's talk as mentioned


Tuesday, August 3, 2021

An issue I had with AWS CodeDeploy

 Hi there

Clearly, I've not really written anything here in 7 years. Let's change that. By writing about an issue we had at Qixxit about 3 years ago. It's pretty specific so really not exciting but I've published a bit of code for it and I wanted to finally do a bit of a write-up on it.

The problem

We ran qixxit's backend on AWS as an auto-scaling group behind an application load-balancer. The auto-scaling group would manage ec2 instances running the application. The auto-scaling group would know about the linked load balancer through a property "target-group" in its configuration. This allows the auto-scaling group to tell the load balancer to stop sending traffic to an instance before removing it. 

We used AWS CodeDeploy's blue/green deployment feature to roll out new versions. This would create a new configuration of the auto-scaling group based on a newly built AMI. It would then bring up new instances for that and redirect traffic from the load balancer to these. Eventually, the old configuration is removed.

The new configuration for the auto-scaling group has all the settings of the previous configuration copied over automatically by CodeDeploy. Except for that "target-group" setting.

Now when the auto-scaling group decides that it wants to scale in and remove an instance it will just immediately shut down that instance. (Sidenote: maybe it's because English isn't my native language but I really don't get why it's scale in/scale out and not scale down/scale up. Is this maybe specific to Amazon's documentation?) Anyway, the instance is gone but the load balancer still sends traffic to it.

I don't actually remember what specific problems this caused and whether this was also an issue when scaling out. It wasn't too dramatic and initially we worked around it by just setting the target group manually and filed a support request.

Amazon's support was helpful and acknowledged the issue. But they didn't provide a way to directly track whether this was being worked on (I guess they generally don't?) and from the communication it sounded like it was pretty unlikely anyone would ever actually work on it.

A solution

And so I wrote a bit of Javascript to solve it for us. CodeDeploy sends notifications for the various steps of the deployment. That can be hooked into to then set the target group of the auto-scaling group. The whole thing runs as a lambda managed via the serverless framework.

This was a nice way for me to practice my javascript test driving skills and also to play around with the serverless framework. And as of recently also to play around with Github Actions. Though I don't actually know if any of it still works or whether it's even still relevant and maybe the bug got fixed by Amazon. 


In closing

I don't like how this write up turned out. It seems impossible to me to describe this in a generic way that doesn't require some knowledge of a bunch of specific AWS products. But maybe that's a good way to keep expectations low for this blog. 

Tuesday, March 25, 2014

Looking back on 2013


A lot of things happened for me in 2013 but much of it seems informal and I'm not sure I can make much of it in my usual year in review format. So be it. Also, I wrote this early February and then forgot to publish it.

2013 started with me returning to South Africa after a much needed vacation back home. I arrived with a much clearer head and much of the stress form the initial months in South Africa gone.

The project I was working on during my whole time in Joburg was doing well and we started trying to spread those experiences out to more teams at the client. This proved to have the same difficulties every other enterprise agile transformation seems to struggle with, too. I think personally, I learned heaps of things there in terms of how to communicate better and wish I would have taken a more active role in some of the discussions. On the plus side, the client was willing to experiment with processes to some degree, we had some really experienced Thoughtworkers around that I could learn a lot from and for myself I'm happy with what was achieved during the time I was there.

Overall though, I find that the topic of enterprise agile transformation increasingly fills me with despair. There are so many inherent contradictions causing the same kinds of friction, again and again, with huge challenges for making a lasting positive difference for both the companies and the people working for them. I feel new approaches and the courage to experiment with them are required. Lots of that appears to be happening in smaller companies but I haven't witnessed any of that myself. Ok, enough of that. Where was I?

I kept taking part in the Joburg developer community, attending lots of little events and making friends along the way. While the community is relatively small, I do like the vibe and this is one of the reasons why I'm looking forward to spending more time in Johannesburg. But more on that later.

I also had a slightly more active role in some of the events. We had another Black Girls Code event that I ended up facilitating, with heavy support from Thoughtworkers and non-Thoughtworkers alike. I was happy to see (from afar, as I was already back in Germany) that the next BGC event had even more non-Thoughtworkers there. The more people involved in it, the more sustainable and successful it will hopefully become. Curriculum-wise we were working with material we received from the BGC organisers in the US, who were also kind enough to take the time to talk us through it over Skype.

I also did a little workshop at the Developer Usergroup appropriating the very nice "Taking Babysteps" format. I had learned about it taking part in it when Adi ran it in Hamburg a few months earlier.

Just before heading back to Germany my colleague Rouan and I also gave a talk at JSinSA about lineman, a javascript framework that more people should know about. (As an aside, I stumbled upon lineman because I've been twitter-stalking its author Justin Searls for years now, ever since he wrote a maven plugin that stood out because it actually did what it was supposed to.)

I was very happy in the Johannesburg Thoughtworks office and when it came time to return home to Germany, that contrast made it pretty clear that I didn't want to keep working for Thoughtworks in Germany. And so my farewell to South Africa also became my farewell to Thoughtworks.

The next months were incredibly chaotic as I was trying to figure out what I wanted to do next. A good part of that time was spent as a journeyman developer. I blogged about that time extensively so I won't repeat too much of that here. Except to repeat that I'm grateful to have had the opportunity and really enjoyed it.

During this time I also went to the SoCraTes and ALE conferences again. Both events have quickly turned into my favourite events during the year and I'm already sad that I will probably miss both of them in 2014.

Eventually I made up my mind and decided to go back to South Africa. It's pretty difficult to describe what I enjoy about the vibe of both the developer community as well as that of Johannesburg itself but in summary I feel it's worth it to go back for a a few years.

I went back for two months at the end of the year to go job-hunting. It was a pretty positive experience overall and I'm also happy and excited about the new job coming up.

While I was back I also took part in the global day of code retreat again. I really liked the venue and it was nice to just take part without being involved in facilitating.

Going back to Germany, I had to wait for my work permit to come through. This proved to be a pretty rough time as being without a job and without my own place really started to wear on me.

But eventually I got back to Joburg, started a new job, got my own place again and published this blog post. So it all worked out but that's a story for next year's year in review.

Thursday, February 6, 2014

Journeyman weeks - retrospecting

(All my previous posts on this topic can be found via the journeyman weeks label)

With a little bit of distance I will now try to sum up my experience of my little journeyman tour.

The quick summary is: I'm really happy I did this and I'm really grateful that it all came together on such short notice.

Getting started

First I want to elaborate a little bit more on my motivation. At the time of the SoCraTes conference I didn't really know what to do next, work-wise. I had briefly contemplated joining a Berlin start-up as the technical co-founder but ultimately decided against it. I also wasn't really happy with the idea of just working for any German company. I also started toying with the idea of going back to South Africa.

As all my stuff was still in storage and I didn't feel like committing to a new place in Germany it meant I was crashing on people's couches anyway. And I didn't just want to hang around doing nothing while I was trying to make up my mind on what to do next. As such, the idea of the journeyman tour seemed like a perfect fit.

After coming back from SoCraTes I wrote up what I wanted to do in a little blog post. People kindly reshared it on Twitter and generally were very encouraging. I spent a few days doing this and coordinating with people and sorted out a little bit of an itinerary. I had 6 weeks to fill, with most of the first week spent on organising and then a week in between in Bucharest for the ALE conference. The other four weeks thankfully filled up quickly. I'm pretty happy that I didn't really think this through because if I had, I might have just gotten scared. What if nobody was interested? What if, after talking about it so much, I would not actually be able to do it?

This wasn't that unlikely, I now realise, as companies struggled to understand what I was doing. And since I didn't really know either, I wasn't sure how to market myself. In all the four companies that I ended up visiting I was introduced by people I already knew who had faith in me. I wasn't that aggressive in communicating with other companies and in hindsight I'm much more convinced of what I had to offer. So maybe, if I had taken more time to prepare, I would have managed to find companies by cold-calling them. But as it was, I was dependent on other people doing my marketing for me and I am incredibly grateful for the support I got.

Lessons learned

I really wasn't sure what usefulness I could provide in just one week. And while I wasn't asking for much in terms of compensation, finding something for me to do, providing someone for me to pair with and getting me set up definitely required effort by my hosts. And so I was a little bit scared to disappoint the faith put into me. Thankfully, I think it turned out ok and I was actually surprised by how much can be done in a week.

Part of that usefulness falls into the general usefulness of pairing. Having a fresh set of eyes to help work on something, I think, was appreciated by all of my hosts. (This relates well with the "Beginner's Mind" pairing pattern, described in this post.)

I also didn't expect how quickly I was able to become productive in the various new dev environments. With a lot of automation already set up and a pair to help explain the details I was able to focus on the actual code. And with concrete tasks to work on this provided a pretty perfect setting to dig into a new language or tool. This is also what I found most beneficial for my own goal of learning new things during those weeks. If I want to get started with a new language I usually struggle setting up some dummy test app to play around with. Having the basics of building, deploying and baseline architecture already created makes it really easy and fun to explore a new language.

There is probably a lesson in here for companies scared of becoming polyglot, trying to fit all their development work to one language (and one framework and platform, too. Eek.) While there certainly are risks to maintaining a diverse set of software projects, I would say that we tend to underestimate how much of the existing know how of software development can be carried over to a new language. And this only gets easier the more you learn about what differentiates various languages.

There's probably also a lesson about automation and reducing the time for new people joining a team to actually start writing code. But I think that's a little out of scope of this post.

Apart from providing a nice way to learn new development skills I also appreciated being able to learn more about how different companies work. All four companies were pretty different in size and organisation and it was nice to be able to take a peek into that. And I think this arrangement would be a pretty good way to do hiring and have potential employee and employer get to know each other.

Last but not least, besides languages and companies I also got to work with more people and make new friends. That alone has made this worth it for me. Spending time with people who share some of the same enthusiasm for software development was really refreshing and energising.

Try it yourself?!

So, would I recommend this to others? In general, I would say yes. I found it a good way to learn and to get diverse experience in a short time-span. And for the hosting companies I would say it provides quite a bit of value to have a fresh pair of eyes looking at existing code and processes. But there are some caveats, of course. I'm not sure if I had been as eager to do this if I wasn't homeless at the time. And the things I learned about were a little bit random and probably not always on the top of my list of things to look at. This didn't bother me much, as I have made the experience that a little bit of randomness in my life had always turned out well for me. But it's worth pointing out.

For the host companies I think the benefits are more pronounced. It's a cheap way to have an outsider come in and ask questions and potentially pick up on blind spots. This is something I think would even work for less experienced developers coming in (and would also work for other roles then devs). And fostering pairing is also something that is valuable, even though a lot of companies may not have picked up on that. Plus, I think showing that a company cares about learning is good advertising from a hiring perspective.

Further reading

There are other people who did similar travels who inspired me and who put more effort and energy into it than I ever did. I'm extremely happy to see that this doesn't seem to let up.

First, there is Corey Haines, who I saw talking about craftsman swaps, code retreats and his journeyman tour at QCon in London in 2010. He had a tremendous impact on how I think about my work. (You can watch the talk here.)

Rob Ashton, while probably working from slightly different motivations, was the one whose blog posts came at just the right time to spark off discussing this idea at SoCraTes. A year after he started, he still hasn't settled down and I envy him for it.

Peter Kofler has also done a craftsman tour around Vienna and I'm grateful to have been able to exchange experiences with him. He's also written extensively about it on his blog.

Since then I've also become aware of and impressed by Andy Waite and the guys from The Bakery.

I hope this encourages you to try something similar. If I can be of any help please do contact me either via twitter, by email or just leave a comment.

And, if you're in or around  Germany, there are groups for remote pairing and for craftsman swaps on the Softwerkskammer website.

Wednesday, October 2, 2013

Journeyman weeks - week four @ msgGillardon

Read here about last week at soundcloud...

Nicole Rauch had been a strong supporter even before I actually came up with the idea of doing a journeyman tour. The German Softwerkskammer network has been playing with the idea of craftsmen swaps and Nicole worked hard to make that possible in the company she works for. Hopefully the example will inspire others to do similar things.

During SoCraTes Nicole and her partner Andreas Leidig had offered to host me and eventually got the OK from their employer msgGillardon to let me work there for a week. The company is set in the small town of Bretten, close to Karlsruhe. It's a very beautiful little corner of Germany and I was quite happy with the contrast of small town life compared to frantic Berlin the week before.

View from the top of the office
The part of msgGillardon I was working at makes software doing forecasting for finacial institutions. Most of that is still in C++, with newer parts now being written in Java. I was a little too intimidated by C++ to work on that, which in hindsight might have been unnecessarily self-limiting. But I actually enjoyed working in Java again, since it's been quite a while. The framework used (Eclipse RAP) and the specifications written in FitNesse provided enough things that were new to me and gave opportunity to learn.

I remain skeptical of frameworks that try to hide the complexity of visually representing an application. In the case of Eclipse RAP it at least seems to be thorough and consistent in hiding representation, which makes it more acceptable then Wicket or JSF (*shudder*). If you're happy to stick with what the framework provides and think in terms of desktop applications, as in this case, RAP seems to be helpful. But one of the drawbacks showed itself when we started to write Selenium tests for the application. The effort required to select elements to interact with made automating them too expensive.

FitNesse seems a little crude in some places but I liked working with it. I was missing support to generate code snippets, as Cucumber/JBehave/SpecFlow all do. Aside from that, writing examples in Slim tables fit very nicely for the domain we were working on. There was a lot of combinatorial complexity in the inputs and it looked a lot more comprehensible to have these in FitNesse rather than in java unit tests. It also allowed for a slightly easier active conversation with the product owner about the required functionality.

In terms of culture, msgGillardon is quite different to the start-up companies I've visited in previous weeks (and also quite different compared to ThoughtWorks and its clients). As a more traditional medium sized company working for a lot of customers in banking, things were a little bit more formal and the technology less bleeding edge.

Nevertheless, I was very positively surprised by the willingness to try out new things. (And not just the obvious experiment of letting some random guy show up there and work there for a week. With very convenient and simple organisation.) There seems to be a genuine interest in changing and improving and that is not something I'm taking for granted anymore.

The other thing that definitely stuck out was the diversity of the teams, at least in age and gender. I have no idea how that came to be but it was refreshing to see. I'd be curious if people there have found an explanation for why they are doing so much better than everyone else in Germany.

During the week I also had the opportunity to take part in the Softwerkskammer Karlsruhe meet-up. It was nice to see so many familiar faces from the SoCraTes conference. Nicole and Andreas were running a legacy refactoring workshop that was a very nice alternative to the legacy code retreat format. Like all good workshops, it left me with a lot of things to think about on how I would do things differently if I were to do it again.

This ends my journeyman weeks for now. I feel incredibly grateful for the privilege of having been able to do this. I am in the process of summarising the different experiences and compare and contrast them. I will hopefully also have some useful information for others who want to try something similar. If you have any specific questions or feedback, please do leave a comment, contact me on twitter or write me an email. I'd love to hear from you.

Pictures from the past couple of weeks are on picasa. Also check out Peter Kofler's blog about doing something similar in Vienna and Andy Waite's for something remarkably global.

Wednesday, September 18, 2013

Journeyman weeks - week three @ soundcloud


To find where I left off go here...

Leaving Bucharest behind

The break in Bucharest was really awesome. The ALE conference was as good as I remembered from Berlin in 2011. There's a certain vibe to this conference that is hard to describe. People generally seem to be very open and trusting and thus the conversations to be had are very interesting and candid. It felt very nice to be around friends old and new. And people were very encouraging of what I'm currently doing and very supportive. Which reminds me to point out the following. If you like what I'm doing please let me know in comments or on Twitter. It means a lot to me.

I stayed at quite historic grounds

I was still processing the impressions from Bucharest when I set out for Berlin. Arriving there I found my way to the interim SoundCloud office in Prenzlauer Berg. I was greeted by my old friend and former colleague Duana Stanley who had arranged my week there. We had never got to work on the same team while we were in ThoughtWorks, so I was looking forward to finally getting to pair up with her.

The interim SoundCloud office

We had briefly talked about what I could do wile I was there and one of the things I said I was interested in doing, was learning more about Android development. The Android team had been working on the jenkins CI build of their SoundCloud client and were happy to have Duana and me help out on some things there.

Their build consists of a fairly normal maven configuration that gets instrumented by a rake build file. That seemed like a much nicer solution to wrap filesystem and git tasks then trying to do that in maven. As we set to work, I was quite surprised by how much maven knowledge was still in my head. Since I haven't really worked with maven in two years and have been trying to forget its existence for longer than that, this was not what I had expected. (Just to be clear: this is not an implicit endorsement of other build tools.)

We managed to get our initial goal done fairly quickly, which clearly showed the benefits of pairing. Since some of that work was the usual drudgery of trial and erroring our way through different maven settings it was nice to have someone to share in the suffering as we pushed each other forward.

After that we tried to move parts of the build out into its own project. This took more time than I would have liked but eventually reduced the build time by a good minute. Duana quickly calculated that we would need about 1200 builds to make up for the time we invested in doing this. As we calculated a bit more I was surprised by how quickly this would pay back, if you consider that multiple people are running the build, many times a day. This led me to realise that I never really thought much about this in other instances of trying to improve build times and it seems painfully obvious now.

Sure everyone feels the pain when the build duration passes that magical 5 minutes barrier. And we feel compelled to improve things. And even 5 minutes is pretty awfully slow. But if you think about it in more concrete terms it gets highlighted. Improve the build by a minute with 3 pairs trying to build 10 times a day and you already get half an hour. By month's end you have already gained more then a full day. The very unscientific and fuzzy way of coming up with this number is balanced by the fact that you really should be building more than 10 times a day anyway.

Anyway, back to my week. Finally we got to work on a little feature for SoundCloud's android client. Since Android 4.1 notifications can have a different, expanded view when there is enough space in the notification menu. Getting this working for the SoundClound client was a nice, small fearure that cut through a lot of basic Android concepts. I got to do the layout for the big view and, while refactoring, learned how the notifications fit into the concept of Android's services. We decided not to add any extra functionality to it yet, because we felt that we wouldn't be able to finish it by the end of the week.

We didn't get around to writing much tests (shame on me) but learned that Robotium wouldn't be able to test the notifications anyway. But I think we managed to get the feature to a good starting position.

On Friday afternoons, SoundCloud has a demo session where people from across teams show what they've been working on. This seems to have most of the employees present and is followed by drinks and mingling. Duana and myself presented our results and I talked very briefly about what I am doing with this journeyman tour.

Large paintings of your favourite meme

I quite liked this get together and SoundCloud's company culture in general. SoundCloud is decidedly bigger than the other two startups I was at (and they're still growing) and I think it's at a critical stage where it becomes challenging to keep the existing close-knit culture. People were very open and helpful to me and I think there's still that sense of playfulness that makes startups fun. Also, they provide free pistachios and cashews (among other things) which meant I got pretty sick quickly because I have terrible impulse control when it comes to eating those.

While I was there I also got to meet some of the women working for the rails girls summer of code project. They all seemed really eager and doing fine so I was pretty happy to see that the project seems to be going along well.

I also went to another session of xtc Berlin. I think there were about eight people present and I was happy to see that it still lives on. It was also really nice to catch up with some people I hadn't seen in a while. Among which was Stefan Hübner, who reminded me about Euro Clojure, which I promptly bought a ticket for.

Next week I'm heading south to Bretten near Karlsruhe. Nicole Rauch and Andreas Leider have invited me to work with them at msgGillardon. I've never spent any time in that region of Germany so it should be interesting.


Tuesday, August 27, 2013

Journeyman weeks - week two @ vaamo.de

Wonder what happened last week?

My travel continued as I left Berlin behind and headed out to Frankfurt. During SoCraTes 2013 I spent some time talking about my little journeyman project with Benjamin Reitzammer. He was one of the first that came to my mind as someone I could be working with and learning from. He had recently started working at a start-up called vaamo and so all of that seemed like a good fit and thankfully he was willing to organise getting me there.

Arriving

I had spent the weekend at my parents' house in Düsseldorf and so the short Monday morning train ride to Frankfurt went by pretty quickly. I had good directions and easily found vaamo's offices in the university campus' "House of Finance". Everyone was quick to welcome me and it was a matter of minutes to get set up for GitHub, Travis and HipChat. It took a little bit of installing random stuff (like a JDK... ahem) and I was up and running. I was able to reuse my postgres docker image from the week before, which I thought was pretty cool.

Goethe University Frankfurt

Vaamo is working on an interesting product around making saving money more accessible. I say interesting because it is something I can probably make use of, once it gets released. The tech stack is based on Scala & the Play framework. There's already quite a few people working on the product, including another of my SoCraTes buddies, Johannes Seitz. During the week I stayed in the huge apartment of one of the founders, conveniently located in walking distance of the office. 

Technology

I am happy I finally had some time to actually work with a JVM language other than Java. I've had some basic idea of how Scala works but now I could actually write useful code in it.

I especially enjoyed having Johannes show me a few ways to solve common web app problems in a more functional way. We made heavy use of Option (and Either) monads, which felt a lot more straight-forward in Scala than anything I had experimented with in Java, quite some time ago. (Hopefully it was also easier because I've learned a bit more since that time. :))

"Show me"

In terms of tooling, I was less impressed. IntelliJ was struggling very much on my (admittedly underpowered) laptop while adding very little benefit in terms of refactoring support. Being used to how well the JetBrains stuff works for other languages I have hope that this will improve but was very disappointed with the current state. Working with vim or sublime might have been the better option.

I'm also pretty skeptical about the Play framework (and maybe sbt, if that's what's under the covers). Opinionated frameworks are good for the 80% case but then seem to always end up fighting you when you trail off the beaten path. In this particular case I was unable to get jasmine tests integrated into the build. (I'm certain it's possible to do that if you invest time or know more about Scala/Play/sbt but it shouldn't be this hard to get started.) This was sad because the support for TDD in Play seems to otherwise be pretty excellent.

I did enjoy a different set of tooling very much though. Vaamo uses Travis for continuous integration and I really loved the integration of that with git(hub) and HipChat. As I mentioned here I really like chat rooms to keep a history of ephemeral status information. It's easy to find when you need the information and it's easy to ignore if you don't. And it also makes it viable to have people work in a distributed fashion.

Extra curricular activities

I also enjoyed hanging out with people and seeing more of Frankfurt. Due to a prior bad experience I had a pretty low opinion of the city and I was glad to find out that it's actually not really that bad. :)

Team Vaamo (with Lasers!)
I enjoyed philosophizing about our industry with Benjamin and similarly I was also lucky to run into Olaf Lewitz and Meike Mertsch who just happened to be in Frankfurt at the same time. Once again I feel extremely grateful for the opportunities that make these serendipitous encounters possible!

This is of course also still the case for the overall journeyman weeks tour. I'm really glad I get to be able to do this. Although I did wake up very disoriented on Tuesday morning, not knowing where I was. :)

Next up

As I'm finally finishing up this post I'm sitting in the offices of Mozaic Works in Bucharest. My old friend Adi Bolboaca was kind enough to host me and show me around this beautiful city. In the end it was a little bit too short notice to find someone to pair with for two days but I'm enjoying having some time to walk around the city. And starting tomorrow I'll be busy enjoying catching up with people and hopefully meeting new ones during this year's ALE conference.

Down the street from Mozaic Works
Next week I will be returning to Berlin again to work with Duana Stanley at Soundcloud. They use some pretty interesting and diverse technologies so I'm sure that will be another great week for learning. For my final journeyman week (as of now) I will head south to msgGillardon in Bretten, where Nicole Rauch and Andreas Leidig are kind enough to host me.

Read about my week at SoundCloud here.

Saturday, August 17, 2013

Journeyman weeks - week one @ bitbond.net

After publishing my initial post and advertising it on Twitter I was quite overwhelmed with the positive reaction and offers of support. I also realised I had very little clue about how to do this from a logistical perspective.

Nevertheless, I quickly found the first two companies willing to host me. And so I decided to just set out and figure the rest out along the way. This will probably eventually involve having to consult with a tax accountant but that's for another day.

For the first week I returned to Berlin once more. My ex-colleague Gregor Russbuelt connected me to one of his former colleagues, Jürgen Walter, who heads up the technical side of a little startup at https://www.bitbond.net. I was looking forward to do a little Rails work in earnest and possibly also learn more about bitcoin. The latter part didn't actually happen but I'm quite happy with what other stuff I picked up along the way.

Balconia Berlin

Jürgen put me up in a room in his nice apartment in Prenzlauer Berg and we went out to a co-working space nearby each day to do our work. As a first problem we tried to change bitbond's capistrano scripts to work on docker images rather than straight on the remote server. Coincidentally, both Jürgen and myself had recently been pointed at docker.io and thought it was worth looking into further. It turned out that assessment was correct. It's a really neat little toolset. Although it did take us a while to get a clear understanding of how repositories, images, containers, tags and volumes fit together. (Now there's a new tutorial available. Maybe that makes things easier.)

Docker

Docker lets you spin up preconfigured ubuntu instances and run commands inside of them. The idea being that you have a little vm for each of your components. Spin up an image to run the rails app, one to run redis and maybe more for postgres and nginx. Each image is essentially disposable and changes in state to the image are only persisted if you use docker to commit the image. There is a concept of ephemeral, potentially persistent volumes that can be mounted and shared between images, allowing you to store e.g. the data of your postgres server.

Each image keeps a history of the commits made to it and you can run commands against each of these versions or base new images or repositories on them. A repository is maybe best described as a branch. Lastly, new images can also be built off of existing repositories and there is a public directory containing a lot of useful readily configured ones.

There is a limitation to the size of an image's history though, so you cannot run more than 42 (doubt that's unintentional) commands within an image while committing the results. This should usually not be an issue but while we were toying around with our deployments we committed quite a few changes and then were quite surprised when we ran into this problem. It didn't help that the error message is far from helpful.

Our plan then was to

  • build new images based on the default docker ubuntu repository, containing the debian packages necessary for rails/postgres/redis/nginx
  • in the case of rails, run each capistrano step inside of the docker image, committing the image after each step 
  • for the other images, run the respective service, making sure addresses and ports of related services are passed in as environment variables and passed on correctly
  • start rails from its image, also passing in information about related services 

(There is another project called coreos that would make the configuration a little more scalable by using etcd to handle service discovery but we didn't look into that)

We wrote a bunch of little shell scripts to help with the individual steps and also experimented a lot until we sort of figured out how docker volumes work. We spent some time working on creating a capistrano plugin to make this available to others. Hopefully it won't take too long to get that ready.

Working on the application

We eventually got to a point where we had a redis and postgres image serving data and a rails and nginx image serving up dynamic and static content, respectively, all working together. At this point we stopped and went to work on the actual application, going through the list of open bugs and features for bitbond.

I was quite impressed with the level of testing being done on bitbond and with Jürgen's TDD workflow and good naming of things. This last bit might sound like a minor thing until you've actually worked on code where people are diligent about keeping things appropriately named. It makes working with the code just so much easier.

And so when we were working on a little bug, we wrote a test that reproduced that behaviour and then fixed the code. When we worked on a new feature, we started with a small capybara script that described how that feature was supposed to work and then implemented against that. It's a very focused, quick and rewarding way of working and I always appreciative when I get to do it.

So we did that and then deployed to production, thereby also making sure we didn't screw up the current production deployment scripts too bad. Ah, the joy of releasing. I can't understand why so many people artificially limit themselves from having that experience more often.

I also got a glimpse of more of coffee script and haml for working on the client side of things. I always liked both of them but never had the opportunity to do any real work with them. At least in the case of coffee script I definitely need to finally change that. Hopefully my recent experiences with lineman will help with that.

Success

So I'm considering the first week of my little journeyman tour a smashing success. I learned new things, got to meet new people and helped ship code. I feel extremely privileged and happy that I have the opportunity to go on this little adventure and do so at such short notice. This community is really great. (And I'm not even sure what "this community" means, exactly.)

If you think what I'm doing here is interesting, please spread the word or invite me over. You can still contact me at dtemme@gmail.com or @dtemme on Twitter. My calendar is still available at this link as well as embedded at the end of this post.

Next up

I'm staying in the broader domain of financial services but moving to Frankfurt, where vaamo is hosting me. I'm really looking forward to working with old twitter and socrates friend Benjamin Reitzammer.

And if you're in Frankfurt and want to grab a beer, please do let me know!

(Write up for week 2 is up now.)

Tuesday, August 6, 2013

Personal Kanban - auf deutsch

Wie an anderen Stellen schon erwähnt, bin ich ein grosser Freund von Personal Kanban und bin dankbar für die Hilfe, die ich daraus ziehen konnte. Einige der hektischeren Phasen in den letzten Jahren wären mir ohne dieses Werkzeug bedeuten schwerer gefallen.

Nun gibt es das Buch endlich auch in einer deutschen Übersetzung von Meike Mertsch und ich bin froh, dass ich auch diese Version ohne Vorbehalt empfehlen kann.

Monday, August 5, 2013

Journeyman weeks

Having just quit my job and not really knowing what I want to do next I've decided to take to the road. I've always enjoyed Corey Haines' programming tour (wasn't there supposed to be a book?) and recently I came across Rob Ashton's post here. This gave me the idea to just travel around for a few weeks and see what I can learn from other people and hopefully help others build cool stuff.

At the SoCraTes conference I mentioned this to a few people and was generally encouraged. During the code retreat that happened on the Sunday I also realized that I need more practice and that there is so much stuff out there that I'm clueless about and want to learn (most recently Elixir). I was also discouraged a little, as the organisational overhead seems a little daunting.

But anyway, I'm currently homeless and jobless and while I wait for the "next step" I wouldn't mind learning more and keeping my operating cost down. So here is my offer: I will work with you if you can provide a roof over my head and can somehow get me to said roof (I am currently based in Düsseldorf, Germany). I've mostly been working with Java, JavaScript and C# and would very much appreciate the chance to expand more into the functional world. I am very opinionated about writing maintainable software and even more opinionated about what software not to write at all.

I hear you say:

Daniel, that's great! How can I help?

Thanks! There's three things, really: 
  • If you would like to work with me for a week or two please contact me at dtemme@gmail.com or @dtemme on twitter
  • If you have any tips on being self-employed in Germany and how to arrange something like this, I would like your input
  • If you think you might know anyone that is interested in pairing with me, please spread the word

I will initially run this little experiment until the middle of September. I've created a calendar showing my availability here.

Updates




Thursday, April 4, 2013

Three tales of browser-based test suites [Part 2] - test harder


In Part 1 I wrote about my initial experience testing with Selenium. In this part I will write about what I learned about browser-based tests on my first project working for ThoughtWorks. It was a step up in terms of coverage and complexity and that also brought its own set of problems.

Friday, March 15, 2013

2012, a year

This thing proved to take quite a bit of time to write. But 2012 was a very eventful, challenging, rewarding, entertaining and educational year.

Like last year I'm overcome by massive gratefulness and joy for having been able to connect to so many nice people throughout the year. 

So, in very brief stats: I worked on 3 projects, spoke at 2 conferences, did more code retreats, and moved to South Africa.

Friday, September 21, 2012

South Africa - first impressions

It's now been 4 weeks since I set off from a not so impressive summer evening in Hamburg to arrive in a slightly warmer Johannesburg the next day. It's high time I capture some of the first impressions if they're to be first impressions.

But just to quickly give a status update for the people that care: I'm fine, the project I'm working on is fine, the TWers here are cool and it's exciting to see the office grow. The nature of how things are here does limit my socializing though and thus makes me feel a little isolated.

On now for my highly subjective observations:

  • South Africans are even crazier about their BBQing (or Braai-ing) than Germans. The main difference being the amount and the sheer size of the meat. 
  • Food... lots of Avocados and lots of meat in general. I'm loving it.
  • I was told that only red meat is meat and chicken counts as a vegetable
  • 100% of sampled offices (2) use fingerprint scanners instead of keys. Not sure if this could ever fly in privacy-conscious Germany, but it is convenient.
  • Oh how I miss my reliable, fast and cheap internet. 
  • Our office is really nice and next door it has proper hipster coffee. 
  • Let's not talk about beer though. Instead, stick to wine.
  • Traffic lights are called robots
  • Driving involves a change of habits owing to the security problems. Bags go in the trunk, phones stay in the pocket, windows stay up
  • In general people are excessively friendly though. The common "How are you" is actually answered and not just mirrored back. After taking a while to get used to the latter being the norm in the UK it's weird to have to unlearn that. 
  • Live seems to center around cars and malls. This is a bit annoying, as I can't stand malls
  • The exception to this being Melville, which has lots of small shops and cafes on actual streets that you can walk on. I found this nice song there.
  • Basic satellite TV (which seems fairly common) has about 10 sport channels. It doesn't seem uncommon to have those running on TVs around the office. 
  • I do not understand Cricket. 
  • Everything happens two hours earlier. I get up two hours earlier, I start work two hours earlier, I'm home two hours earlier, shops close two hours earlier, I go to bed two hours earlier. I'm still not sure if that's also a security side-effect.
  • Giraffes are awesome.
A giraffe nibbling on my jacket



Tuesday, July 31, 2012

Three tales of browser-based test suites [Part 1]

The topic of browser-based testing seems to come up again and again and on many occasions I meet people who have expectations that don't match my experience. So I guess it only makes sense to write down these experiences and some of the conclusions I came to.

I'm not even going to try and go into distinctions between acceptance, functional, integration or whatever testing. Whatever you're calling those tests, if they are instrumenting a web browser, that's what I'm talking about. (If you care about the distinctions, or about testing in general, I recommend reading Gojko Adzic's excellent book Specification By Example.)

I want to look at three concrete examples that I have worked on over the past years.

In the first case, nobody on our team had prior experience, except for a short but traumatic brush with IBM's Rational Functional Tester (remember kids: friends don't let friends use IBM products). To get rid of that, we decided to go ahead and try Selenium.

We initially recorded tests with the Firefox plugin but quickly realized that this wasn't maintainable and didn't really offer us good control for selecting elements. Our Tester Benjamin then took it upon him to write tests in Java and started to integrate them into our CI environment. Over time he created a solid set of Page Objects that allowed us to write new tests fairly quickly.

It took the rest of the team quite a while to take some ownership of these tests but eventually we came to a point where we'd sometimes even drive new features from these Selenium Tests.

There were hurdles along the way. Tests were brittle and the execution time was unacceptable (>30 mins). This improved with newer versions of Selenium, use of Selenium Grid to parallelize tests and by keeping a close eye on the VMs running the browser instances. In the case of IE(<8 gave="gave" just="just" p="p" simply="simply" up.="up." we="we">
Due to some relatively complex processes it was also fairly hard to test later stages of these processes. We only slowly got better at setting up test data for this without making use of the browser. This left us with some unfortunate holes in automated coverage.

There were still manual tests for each release for all of our major supported browsers. But with more of the core functionality being handled by automated tests and with the amount of changes shrinking due to shorter release cycles the effort for this went down considerably.

We also became better at writing unit and integration tests and our confidence in these grew.

What did I take away from it:


  • the demand for these tests was driven by Benjamin wanting to automate his tests to make his life easier. And also his desire to learn more about Java. It was a relatively clear goal and the benefits of effort spent on automation were fairly clear. Where automation was hard, it allowed him to balance that effort with the effort of doing the tests manually
  • setting up and maintaining browser instances for tests and keeping them stable is hard, unthankful work and I'm glad that these days you can just hand money over to saucelabs to do that for you
  • getting the CI builds to be reliably green made shared ownership easier. Collaboration on these tests continued to grow.
  • closely related to that, the tests have to run fast. If they run for more than ten minutes they might as well not exist
  • we had relatively few Selenium tests compared to our unit-tests but there were the odd cases of bugs that weren't caught by our normal test-suites
  • when we rewrote a lot of the front-end JavaScript and test-drove those with jasmine, browser compatibility issues became very rare
  • as our understanding of all the different tests grew, it became easier to decide when we could avoid writing an extra Selenium test
  • working closely with the rest of the team and writing the tests in Java gave our Tester room to grow and learn and turn into a regular dev on the team. Seeing that happen was probably one of the most fun things during my time there. The rest of the team also took up some of the manual testing work.
(Edit 13.9.15: removed some point about testers that I didn't like anymore)

Continue on to part 2

Wednesday, April 4, 2012

Timetravelling in JavaScript unit tests


At the February berlinjs meet-up Krzysztof Szafranek had a very nice, short talk about TDD in JavaScript (slides here). Among many other things he was showing busterjs and the way it lets you test asynchronous stuff without having to actually wait for time to pass.

I made a note of it to give it a closer look. When I recently had to write some JavaScript again, I remembered about it and was keen to give it a try. Since we were already using jasmine as our testing framework, my colleague Christoph and I were looking for something equivalent there. To cut the intro short, there is: jasmine.Clock.

Friday, December 30, 2011

Thank you, 2011


It’s December. That means it’s time to write a long, rambling post looking back on the year. It’s been a very exciting and eventful year for me, so I’m actually appreciating having the time to do this.

Last new year's eve I tweeted the following. And I wasn't wrong.
2011 is gonna be amazing, you just watch!

I’ve changed jobs, moved from Düsseldorf to Hamburg, took part in a lot of conferences and events, organised a few things myself and in all of that met a huge amount of amazing people that truly inspired me. Thank you, everyone! It was an amazing year.


Sunday, September 25, 2011

xtc Berlin

Late Tuesday evening, the night before the ALE conference started, I sat in the hotel bar of the venue talking to people who had arrived early. Looking around, I thought, "cool, it's like an extreme tuesday club in Berlin". Since then I've been thinking about what it would take to actually create something like this in Germany.

So what is the extreme tuesday club?
A regular London meeting (weekly) for Agile/XP/Kanban/Scrum newbies, practitioners, and experts. (*)
That's not very elaborate but I like that it casts a fairly wide net in terms of target audience.

There are already a lot of different software and agile related user groups in Berlin and I like what I've seen of them so far. But each of these only cater to a specific topic or technolgy.

I'm looking for something less formal. Have a beer, talk to people about what they're working on, share war stories, cross-pollinate new ideas, ask for help or give help, if wanted. I would hope it would be as inclusive as possible. So, newbie or expert, programmers, PM/POs, design people, start-uppers, whatever - as long as you care about what you're doing and want to talk with people about it, it should be fine.

I did a little open space session at ALE on this and there seemed some general interest and I said I would just try and get this rolling and just see what happens.

Someone suggested the Cafe 100 Wasser as a pub to go to. And that's where I'll be, this Tuesday from around 8pm onwards. I'd be happy for you to join me. If you do plan to come, please let people know on Twitter.
[we've since changed pubs around quite a bit. Twitter is probably the safest bet to find out where people are. We're now usually at the Prater Garten in Prenzlauer Berg]

Saturday, September 17, 2011

Some closure (ha!) to 7 Languages in 7 Weeks

I'm currently trying to work through a backlog of things I've been meaning to blog about. And at the top is this post. The whole experience deserves being wrapped up properly. But I'll keep it brief.

When last I wrote about it, I was somewhere in the middle of week 6, working with clojure. This is probably my favourite of the languages in terms of learning new things and offering new perspectives while also having enough momentum that I might actually be able to do something with it at some point. I really hope this doesn't fall victim to my inherent lazyness.

The last week dealt with Haskell. At this point I was so busy with moving apartments and starting my new job that I barely managed to read the chapter but didn't get to try the examples. It sounded interesting but maybe a bit too strict. Others in the study group seemed to like it a lot though.

So, what's left to say. I really appreciated the study group and being able to learn from other people's code on github.

I enjoyed the weekly google hangout sessions with the others, when I was able to join them. I particulary liked how aimee facilitated those, keeping track of threads of discussions and making sure everybody got to say something.

The book requires quite a bit of commitment to get the most out of it but where I did that I felt it was well worth it.

I certainly recommend doing this together with other people. And share your experience with the world. 

All in all, I stick to what I said in my first post on this.We live in amazing times!