clojure-europe

For people in Europe... or elsewhere... UGT https://indieweb.org/Universal_Greeting_Time
slipset 2020-10-26T07:47:42.316900Z

So my take on the component/di thing is that in the systems that I've been working on, a lot of the interaction with outside systems happen over http, which means there is no state in terms of connections that need to be handled. Like when you're talking to aws stuff, you don't have a "connection". The only connections that come to mind in our current system is redis, the dbs, and probably one or two more that I can't seem to remember. Now, I believe that none to few of the connections which we need in our app are actually dependent, so it doesn't really matter if I start redis before the dbs or vice versa. Also, wrt the db's since we're so lucky as to be using mongo, we've implemented multitenancy as one mongo-db pr customer, which means that we don't know which dbs we'll need on system startup.

slipset 2020-10-26T07:49:48.318800Z

So for all intents and purposes, we (of course we're using component, why wouldn't we) end up with something like (assoc req :system (assoc @system :customer-db (connect-to (:customer req))) in a ring middleware somewhere.

slipset 2020-10-26T07:49:58.319200Z

And with that, I wish you a good morning!

ordnungswidrig 2020-10-26T08:05:39.319400Z

Guten MOrgen!

2020-10-26T08:18:17.319600Z

Morning

thomas 2020-10-26T08:24:18.319800Z

mogge

thomas 2020-10-26T08:32:18.321600Z

Can I just say that I really like that fact that this channel has become a community in the last year or so. Talking all kinds of Clojure stuff, loads of other things and lots of people coming in each morning and saying hello!

thomas 2020-10-26T08:32:32.322Z

So a big thank you to you all! šŸ™

2šŸ›„7šŸ˜„
dominicm 2020-10-26T08:35:14.322100Z

morning :)

borkdude 2020-10-26T08:43:37.323700Z

Morning!

slipset 2020-10-26T08:44:33.324700Z

@thomas I can really second that. And I appreciate the "takhĆøyde" as we say in Norwegian in here. There seems to be more room for discussing off-topic-ish, "stupid", or philosophical Clojure questions in this little channel than other places.

slipset 2020-10-26T08:44:52.325100Z

I'd say this is almost like the hallway track at a good Clojure conf šŸ™‚

3šŸ‘
thomas 2020-10-26T08:47:21.326Z

thank you @slipset , that last comment sums it up perfectly.

dominicm 2020-10-26T08:48:48.326100Z

I wonder if you could run a conference of only clojure philosophical talks (no exp reports, etc.)

slipset 2020-10-26T08:49:01.326400Z

I would love that.

dominicm 2020-10-26T08:49:23.326800Z

Do them in a discussion style, 20m to present an idea, 20m to answer questions / discuss it.

dominicm 2020-10-26T08:49:45.327300Z

Well, in the virtual style you could even pre-record the talk, and have the speaker answering questions and discussing it as it was played.

slipset 2020-10-26T08:50:08.327800Z

Presented at ffs-conf the one year it was run in London. It was the coolest conf I've attended so far.

jasonbell 2020-10-26T08:51:00.328900Z

Morning

slipset 2020-10-26T08:52:32.329600Z

https://ffstechconf.org The only downside to it was that it was https://en.wikipedia.org/wiki/Chatham_House_Rule, so no recording and no live-tweeting

slipset 2020-10-26T08:53:05.330300Z

But the format was exactly like you suggest @dominicm 20 minutes rant, 20 minutes discussion.

dharrigan 2020-10-26T09:02:31.330400Z

#clojure-uk is pretty good at talking about non-topic things šŸ™‚ Right now we are discussing daylight savings time and farmers šŸ™‚

dharrigan 2020-10-26T09:02:58.330600Z

We do sprinkle in a few clojure things from time to time (mostly me asking dumb questions šŸ™‚ )

dharrigan 2020-10-26T09:05:33.331100Z

Dia duit!

orestis 2020-10-26T09:09:54.332800Z

Morning! I have to alternate between playing PM and figuring out what other people should do, and the urge to sit down at my editor and solve things myself and itā€™s driving me crazy :) anyone with similar experience could offer some tips?

orestis 2020-10-26T09:13:04.333400Z

I would gladly rant about this at a conf setting BTW :)

dharrigan 2020-10-26T09:17:12.333700Z

Give in and just code šŸ™‚

dharrigan 2020-10-26T09:17:28.334Z

Working with developers is like herding cats.

dharrigan 2020-10-26T09:18:38.334600Z

One of the guys at my work transistioned to being a developer to the "development manager". I don't envy his role.

2020-10-26T09:24:27.335400Z

saying "morning" is a bit like having clojure dojos. It gets everyone in the same place with similar interests having fun and getting to know each other. That just makes more chances for good things to happen

3ā¤ļø
orestis 2020-10-26T09:27:44.337600Z

@dharrigan I do code, quite a bit :) in terms of making things happen though a team is much more effective and resilient. Itā€™s just that you have to repeat your point and direction every week until other developers cave in and accept it :)

dharrigan 2020-10-26T09:28:33.337900Z

I guess it's harder now? Do you all work remotely?

orestis 2020-10-26T09:49:01.339500Z

Yeah everyone is remote now. Three-dev team, so not too large but still Iā€™m having trouble breaking down tasks into something thatā€™s both not too trivial or too daunting. I have the most context and information so I have to do a lot of writing and talking.

2020-10-26T10:00:32.339800Z

burying your head with the > I'll do it all myself mindset produces a frustrated team

2020-10-26T10:00:50.340Z

you do need to allow them to help

2020-10-26T10:01:19.340200Z

do you use a kanban kind of setup?

2020-10-26T10:02:56.340900Z

try to find the fun bits in people management

orestis 2020-10-26T10:06:15.342100Z

The most gratifying part is seeing other people sink their teeth in a hard problem (be that UI, ops, whatever), seeing them do a good job ā€” and realizing that thatā€™s one problem I donā€™t need to solve myself šŸ™‚

orestis 2020-10-26T10:07:33.342200Z

Yeah thereā€™s a Notion board separate into ā€œBacklogā€ (rough stuff) ā€œReady to goā€ (hopefully with enough writeup or shared context to be actionable), ā€œReviewā€ and ā€œDoneā€. We have a weekly meeting where we go over things and priorities including support, design, stakeholders and another weekly developer coordination meeting. Plus a lot of slack back-and-forth.

orestis 2020-10-26T10:08:10.342400Z

I pretty much run all those meetings and when I ask people on our 1-1s they say itā€™s not too much, not too little.

2020-10-26T10:08:30.342600Z

well that sounds good

orestis 2020-10-26T10:08:34.342800Z

But people have different personalities and engineers have strong opinions which can be draining at times šŸ™‚

2020-10-26T10:08:40.343Z

(as long as they are not just being polite)

javahippie 2020-10-26T10:10:10.343200Z

Why do you have to decide what other people should do, why do you have to split the tasks? Would the team be capable of doing it themselves?

javahippie 2020-10-26T10:12:14.343400Z

I used to be a teamlead for 4 years, and I was often surprised, which of my tasks I was able to delegate away. Often the team was happy to be trusted with more responsibility and was more knowledgeable of the codebase, anyways. ā€œHey team, this needs to be built. Please decide how you should best split up the tasks and how long it would takeā€, worked very often

orestis 2020-10-26T10:16:36.343600Z

Thatā€™s a good point. The rest of the team is new (10 months and 3 months) and the project includes a rewrite/takeover of a legacy platform and codebase, of which I know the most, both on what currently is there code-wise, and of what should be there but was left half-baked for reasons.

orestis 2020-10-26T10:16:57.343800Z

So Iā€™m working slowly to expose everyone to the whole of the codebase so they can have more autonomyā€¦ itā€™s hard.

javahippie 2020-10-26T10:23:09.344Z

Ah, thatā€™s a tricky situation, if the experience levels differ that much. But there is a nice ā€œdelagation patternā€ that works on different experience levels. My source is in german, but I can translate here: https://www.mehr-fuehren.de/wp-content/uploads/2013/08/5-stufen-der-delegation.jpg

1ā¤ļø
javahippie 2020-10-26T10:23:45.344400Z

1. ā€œExecuteā€ - Stick exactly to my orders. I did the research, you just have to do it

javahippie 2020-10-26T10:24:06.344600Z

2. ā€œMake yourself familiarā€ - Look at the topic, work out solutions and clarify again with me

javahippie 2020-10-26T10:24:40.344800Z

3. ā€œCreate a solution ā€ - Get into the topic, and propose the solution to me

javahippie 2020-10-26T10:25:08.345Z

4. ā€œDecide with reporting backā€ - You decide what you want to do, and tell me afterwards what you did

javahippie 2020-10-26T10:25:29.345300Z

5. ā€œDecide without reporting backā€ - Your call, do what you think is best, I donā€™t need to know afterwards

javahippie 2020-10-26T10:26:28.345600Z

So the more you trust your team members the more you can ā€œclimb up the stairsā€ of delegation. It really helped me to figure out, who was on which step and have a certain framework to stick to

orestis 2020-10-26T10:27:31.345800Z

Thatā€™s super helpful and Iā€™ve seen it before. Itā€™s important I think to make sure that everyone agrees theyā€™re on a specific ā€œstepā€, itā€™s frustrating when opinions differā€¦

orestis 2020-10-26T10:27:43.346Z

(Which is something I struggle a bit to communicate, TBH)

javahippie 2020-10-26T10:28:34.346200Z

Yes, thatā€™s the ā€œsocial and communicationsā€ part, that was always a struggle for me, too.

orestis 2020-10-26T10:43:41.346400Z

Iā€™ve never had a role model or even experience in a team where this was happening explicitly so itā€™s tough to figure out what I should be doing šŸ™‚

javahippie 2020-10-26T10:46:44.346600Z

I only learned by Podcasts, and in the end I booked a program with one of those podcasters. There is an incredible amount of ā€œcraftshipā€ and techniques which make it more easy. For the technique part I can recommend books by Fredmund Malik. He was desperate, because every profession needs to be studied or learned, but everybody just kind of ā€œdoesā€ leadership and management. He tried to bring structure into it and summarized it really well

javahippie 2020-10-26T10:47:24.346800Z

I read ā€œManaging Performing Livingā€ (ā€œFĆ¼hren, Leisten, Lebenā€) and it helped a lot

2020-10-26T11:08:39.347400Z

that is the nice thing about it. That and helping the team and team members be better than they were before

orestis 2020-10-26T11:08:48.347500Z

Iā€™ll order it for a covid winter read šŸ™‚

slipset 2020-10-26T11:12:36.348800Z

@orestis I think the main responsibility for a tech-lead/product manager is to create an understanding of why something is being done, and possibly also why it needs to be delivered at some point.

slipset 2020-10-26T11:13:32.350Z

If you can establish this understanding, ie the intent, and you've hired reasonable people, they will deliver the stuff you need, not necessarily the stuff you figured you should ask for.

2šŸ‘
slipset 2020-10-26T11:13:50.350500Z

IMNSHO, it makes for a much more interesting place to be a dev as well.

1
orestis 2020-10-26T11:27:02.354900Z

Definitely @slipset - I sought that behavior and created it in the current workplace. The context is a very small startup with a lot of baggage (operating for almost 10 years now with established product and clients). The trouble with communication is trying to figure out how to tune sender and receiver.

orestis 2020-10-26T11:28:34.357500Z

Also another issue is scoping and time boxing. As engineers we tend to fall into rabbit holes and it usually takes outside intervention to get us out - and some times in my experience it has to be an ā€œorderā€, otherwise the calling of the unsolved problem is too strong, even if the solution isnā€™t relevant to the business any more.

orestis 2020-10-26T11:29:32.358400Z

Perfect is the enemy of good, as a bike tuner once told me in Belgium :)

2020-10-26T11:30:27.358800Z

@slipset I agree completely with that

borkdude 2020-10-26T11:45:54.359100Z

https://twitter.com/JenMsft/status/1320436012405850113

3ā¤ļø
2020-10-26T13:08:58.359500Z

Lol

2020-10-26T13:09:26.360400Z

I'm still of the opinion that mongodb is no worse than mysql used to be

dominicm 2020-10-26T13:13:46.361200Z

That comic made me sad. There's too many people genuinely doing that.

dominicm 2020-10-26T13:13:57.361600Z

So much complexity and "hacks" which we celebrate.

orestis 2020-10-26T14:41:48.362800Z

Goā€™ aften!

zilti 2020-10-26T15:15:08.363700Z

I'm sure a lot of people on http://dev.to would post that "ironically", while they actually do exactly that and are completely oblivious to it. That site really was an eye-opener for me to see what the dev world has turned into...

raymcdermott 2020-10-26T15:23:32.363900Z

morning

slipset 2020-10-26T15:23:53.364300Z

you need to start getting a life @raymcdermott ...

slipset 2020-10-26T15:24:13.364900Z

This is at best UGT in your parts of the world

raymcdermott 2020-10-26T15:24:43.365400Z

I start work later these days so it is officially morning for me too

slipset 2020-10-26T15:25:23.365800Z

Hmm, so morning is when work starts? or have you shifted your days around?

raymcdermott 2020-10-26T15:41:05.366700Z

I'm doing life in the morning and work afternoon / evening ... for me it's a big lifestyle improvement tbh

raymcdermott 2020-10-26T15:41:26.367100Z

also aligns with some of the US colleagues at work

orestis 2020-10-26T17:01:05.369400Z

Iā€™m thinking of doing the same - moving back to Copenhagen where the daylight is precious. Not sure how Iā€™m going to manage with baby-related sleep deprivation though.

1šŸ˜¬
mpenet 2020-10-26T18:12:25.372400Z

Lots of vitamin D. I live close to Malmƶ, 2 kids under 4, I know the feeling.

mpenet 2020-10-26T18:18:05.377100Z

Enjoying parental leave now, working 50% for a bit (afternoons)

1šŸ¼
raymcdermott 2020-10-26T19:10:28.379700Z

first proper, non-trivial use of clojure.walk/prewalk today - quite the thing

raymcdermott 2020-10-26T19:10:42.380Z

it I mean, not my code

borkdude 2020-10-26T19:11:24.381Z

beware of https://clojure.atlassian.net/browse/CLJ-2568

borkdude 2020-10-26T19:11:40.381300Z

Do you mean btw, that postwalk is more common in your code than prewalk?

dominicm 2020-10-26T19:12:01.381800Z

I think I found a use for walk recently to optimize something, but I'm using postwalk in a weird way instead :)

raymcdermott 2020-10-26T19:12:39.382500Z

I only used prewalk - yeah I saw that issue but it's doesn't concern me. I'm very direct šŸ™‚

borkdude 2020-10-26T19:14:29.384200Z

I usually use postwalk as a search and replace in nested data structures. I also use it quite a lot in clj-kondo and sci, but more in the spirit of, not the built-in implementations.

raymcdermott 2020-10-26T19:15:07.384800Z

yeah it was for finding paths after a search ... for making what I thought was a simple game (checkers / draughts) with my son, not work

dominicm 2020-10-26T19:15:40.385700Z

The metadata thing has only tripped me on a handful of uses of walk.

dominicm 2020-10-26T19:16:12.386800Z

Hmm, I think they're all library uses as well. So probably something in that.

borkdude 2020-10-26T19:16:14.387Z

sci leans quite heavily on metadata so that issue became apparent to me quite early in that project. I've been bitten by it before

borkdude 2020-10-26T19:17:41.387600Z

the metadata design in clojure is quite fantastic, there's always an escape hatch. I've used this in clj-kondo lots of times

borkdude 2020-10-26T19:18:31.388100Z

"crap, this map is symbol to symbol, but we need locations as well.."

borkdude 2020-10-26T19:19:15.388400Z

btw please upvote CLJ-2568 :)

borkdude 2020-10-26T19:29:47.389300Z

@raymcdermott It's great that you're teaching your son Clojure. He can take your morning shift

dominicm 2020-10-26T19:30:00.389700Z

I haven't figured out what is and isn't a good use for metadata yet. I bet Alex would have something pithy to say

raymcdermott 2020-10-26T19:30:37.390400Z

hehe have you ever met a gamer?

borkdude 2020-10-26T19:31:35.390600Z

@dominicm please don't ask, I might get regrets

dominicm 2020-10-26T19:32:29.391200Z

@borkdude have you looked at how zippers use metadata?

dominicm 2020-10-26T19:33:02.392400Z

I think I remember the stock answer: use metadata only when you don't care about equality. (Or you want it to not be considered)

borkdude 2020-10-26T19:33:35.393100Z

yes, I think that's the greatest thing about metadata: I can compare two symbols for equality even if they have different location metadata. <3

borkdude 2020-10-26T19:35:47.393600Z

you can even serialize data structures while preserving metadata: EDN supports it. Although transit might not

borkdude 2020-10-26T19:36:18.394Z

https://nextjournal.com/mk/transit-metadata-keys

borkdude 2020-10-26T19:37:18.394400Z

@raymcdermott Do you drink coffee pre or post dogwalk in your morning life?

raymcdermott 2020-10-26T19:38:02.395Z

hehe post, I like to enjoy it

slipset 2020-10-26T19:41:39.395400Z

We use metadata for, well metadata šŸ™‚

borkdude 2020-10-26T19:42:22.396400Z

btw datafy also uses metadata to keep track of the real thing that was datafied

slipset 2020-10-26T19:42:49.396900Z

One example is that we import data from excel. Customer data might not start at row 0, so there is a row offset going on. I attach the real row-num to the vector that contains a row using metadata.

slipset 2020-10-26T19:44:18.398300Z

So given something like:

[[col1 col2 col3] ;; this might be row 3 in the excel sheet it came from, so (:rownum (meta row)) will be 3
 [col1 col2 col3] 
 [col1 col2 col3]]

slipset 2020-10-26T19:45:09.399100Z

But I think itā€™s hard to define where to use meta and where to create another datastructure. We could have solved this as:

slipset 2020-10-26T19:46:03.400300Z

[{:rownum 3
  :columns [col1 col2 col3]}
 {:rownum 4
  :columns [col1 col2 col3]}
 {:rownum 5
  :columns [col1 col2 col3]}]

slipset 2020-10-26T19:46:43.400900Z

I couldnā€™t use meta for column-numbers as cell values could be primitivesā€¦

slipset 2020-10-26T19:47:14.401300Z

Using meta feels a bit like using dynamic vars.

borkdude 2020-10-26T19:49:53.401900Z

@slipset why not use an excel lib that makes nice maps out of this?

borkdude 2020-10-26T19:50:00.402100Z

e.g. docjure

slipset 2020-10-26T19:50:18.402400Z

consider it an example šŸ™‚

borkdude 2020-10-26T19:50:29.402600Z

aye

borkdude 2020-10-26T19:50:53.403400Z

yeah, metadata offers flexibility and prevents pre-mature refactorings also in cases like this

slipset 2020-10-26T19:51:18.403800Z

We do use poi at the edges, but then make it into a matrix at some point and continue from there.

slipset 2020-10-26T19:51:43.404700Z

There is stuff around the excel format that doesnā€™t suit us, or at least didnā€™t suit us at the time of the implementation of this thing.

borkdude 2020-10-26T19:52:07.405400Z

@slipset wow, this got me thinking. what if poi was properly datafied, that could maybe a a nice way of dealing with it

slipset 2020-10-26T19:52:21.405700Z

One thing about the excel format is that itā€™s sparse, so you get matrices with ragged edges.

borkdude 2020-10-26T21:56:24.406400Z

hmm, I just needed interleave but I forgot it existed, so I wrote (mapcat list xs ys)

borkdude 2020-10-26T21:58:46.406700Z

almost makes you wonder why core hasn't implemented it like that

borkdude 2020-10-26T22:02:01.407Z

probably performance: interleave is much faster