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.
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.
And with that, I wish you a good morning!
Guten MOrgen!
Morning
mogge
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!
So a big thank you to you all! š
morning :)
Morning!
@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.
I'd say this is almost like the hallway track at a good Clojure conf š
thank you @slipset , that last comment sums it up perfectly.
I wonder if you could run a conference of only clojure philosophical talks (no exp reports, etc.)
I would love that.
Do them in a discussion style, 20m to present an idea, 20m to answer questions / discuss it.
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.
Presented at ffs-conf the one year it was run in London. It was the coolest conf I've attended so far.
Morning
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
But the format was exactly like you suggest @dominicm 20 minutes rant, 20 minutes discussion.
#clojure-uk is pretty good at talking about non-topic things š Right now we are discussing daylight savings time and farmers š
We do sprinkle in a few clojure things from time to time (mostly me asking dumb questions š )
Dia duit!
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?
I would gladly rant about this at a conf setting BTW :)
Give in and just code š
Working with developers is like herding cats.
One of the guys at my work transistioned to being a developer to the "development manager". I don't envy his role.
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
@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 :)
I guess it's harder now? Do you all work remotely?
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.
burying your head with the > I'll do it all myself mindset produces a frustrated team
you do need to allow them to help
do you use a kanban kind of setup?
try to find the fun bits in people management
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 š
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.
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.
well that sounds good
But people have different personalities and engineers have strong opinions which can be draining at times š
(as long as they are not just being polite)
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?
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
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.
So Iām working slowly to expose everyone to the whole of the codebase so they can have more autonomyā¦ itās hard.
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. āExecuteā - Stick exactly to my orders. I did the research, you just have to do it
2. āMake yourself familiarā - Look at the topic, work out solutions and clarify again with me
3. āCreate a solution ā - Get into the topic, and propose the solution to me
4. āDecide with reporting backā - You decide what you want to do, and tell me afterwards what you did
5. āDecide without reporting backā - Your call, do what you think is best, I donāt need to know afterwards
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
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ā¦
(Which is something I struggle a bit to communicate, TBH)
Yes, thatās the āsocial and communicationsā part, that was always a struggle for me, too.
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 š
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
I read āManaging Performing Livingā (āFĆ¼hren, Leisten, Lebenā) and it helped a lot
that is the nice thing about it. That and helping the team and team members be better than they were before
Iāll order it for a covid winter read š
@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.
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.
IMNSHO, it makes for a much more interesting place to be a dev as well.
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.
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.
Perfect is the enemy of good, as a bike tuner once told me in Belgium :)
@slipset I agree completely with that
Lol
I'm still of the opinion that mongodb is no worse than mysql used to be
That comic made me sad. There's too many people genuinely doing that.
So much complexity and "hacks" which we celebrate.
Goā aften!
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...
morning
you need to start getting a life @raymcdermott ...
This is at best UGT in your parts of the world
I start work later these days so it is officially morning for me too
Hmm, so morning is when work starts? or have you shifted your days around?
I'm doing life in the morning and work afternoon / evening ... for me it's a big lifestyle improvement tbh
also aligns with some of the US colleagues at work
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.
Lots of vitamin D. I live close to Malmƶ, 2 kids under 4, I know the feeling.
Enjoying parental leave now, working 50% for a bit (afternoons)
first proper, non-trivial use of clojure.walk/prewalk
today - quite the thing
it I mean, not my code
Do you mean btw, that postwalk is more common in your code than prewalk?
I think I found a use for walk recently to optimize something, but I'm using postwalk in a weird way instead :)
I only used prewalk - yeah I saw that issue but it's doesn't concern me. I'm very direct š
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.
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
The metadata thing has only tripped me on a handful of uses of walk.
Hmm, I think they're all library uses as well. So probably something in that.
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
the metadata design in clojure is quite fantastic, there's always an escape hatch. I've used this in clj-kondo lots of times
"crap, this map is symbol to symbol, but we need locations as well.."
btw please upvote CLJ-2568 :)
@raymcdermott It's great that you're teaching your son Clojure. He can take your morning shift
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
hehe have you ever met a gamer?
@dominicm please don't ask, I might get regrets
@borkdude have you looked at how zippers use metadata?
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)
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
you can even serialize data structures while preserving metadata: EDN supports it. Although transit might not
@raymcdermott Do you drink coffee pre or post dogwalk in your morning life?
hehe post, I like to enjoy it
We use metadata for, well metadata š
btw datafy also uses metadata to keep track of the real thing that was datafied
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.
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]]
But I think itās hard to define where to use meta and where to create another datastructure. We could have solved this as:
[{:rownum 3
:columns [col1 col2 col3]}
{:rownum 4
:columns [col1 col2 col3]}
{:rownum 5
:columns [col1 col2 col3]}]
I couldnāt use meta for column-numbers as cell values could be primitivesā¦
Using meta feels a bit like using dynamic vars.
@slipset why not use an excel lib that makes nice maps out of this?
e.g. docjure
consider it an example š
aye
yeah, metadata offers flexibility and prevents pre-mature refactorings also in cases like this
We do use poi at the edges, but then make it into a matrix at some point and continue from there.
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.
@slipset wow, this got me thinking. what if poi was properly datafied, that could maybe a a nice way of dealing with it
One thing about the excel format is that itās sparse, so you get matrices with ragged edges.
hmm, I just needed interleave
but I forgot it existed, so I wrote (mapcat list xs ys)
almost makes you wonder why core hasn't implemented it like that
probably performance: interleave is much faster