- @TheLeadDev #LeadDevLondon
- white coat captioning - @whitecoatcapxg
- wvnts.co/lduk2018
- happy pride! it’s like the world cup for people with fashion sense
- who am I?
- SRE @ github
- professional worrier with sudo access
- car advert analogy
- beautiful mountain road,
- lots of facts and figures
- very very small print:
- “laboratory setting”
- it’s an advert
- this is how i feel about most container talks
- “just download this gist, (don’t read it!) and run it”
- “oh you want to run containers in prod? no problem! prod is just your laptop times 1000”
- we need to examine containers a little more critically than we do today
- my creds
- I’ve been running containers in prod since early 2015 (docker 0.6)
- ran dockerized cassandra clusters
- now, i run the k8s platform behind github
- “docker 101 talk view”
- host (which is a box)
- OS (another box)
- daemon (another box)
- containers (little boxes)
- this is all lies
- it’s a good way for a human to see containers
- but this is how your computer sees containers:
top
command- python
- ruby
- kubelet
- those python & ruby processes are containers!
- containers are made of a bunch of linux features stapled together
- when you build your Dockerfile, you’re making a tarball
- when you run it, you’re starting a process (just like any other process)
- this is where those extra features come in
- namespaces
- what it can see
- cgroups
- what resources it can use
- namespaces
- 4 lessons in this talk
- they are good when you use them in the right way and play to their strengths
- strength which are: ephemeral, disposable processes
- ie stateless applications
- take data in, change it in some way, send it on to somewhere else
- fantastic for scaling
- run multiple instances side-by-side, behind load balancer
- connect to same backend
- if one dies, nobody cares (ephemeral)
- what do containers give you?
- they’re portable
- they don’t depend on dependencies from system
- easy to iterate
- easy to upgrade
- disaster recovery
- divergent DR processes:
- jenkins
- cap
- some random cron job
- someone has to sit with you to show you how to deploy their apps
- if it’s containerised, everything is deployed in the same way
- also great for production incidents
- if i get paged, and find the problem isn’t my service, it’s someone else’s service
- in the old world, you’d have to page them
- now, you can at least try redeploying their service (because it deploys the same way)
- divergent DR processes:
- testing environments
- ephemeral spaces with disposable things that you want to clean up afterwards
- they’re portable
- stateful apps
- eg databases
- “I attended one of those container 101 talks and now i want to containerise all my databases”
- my response: “are you google?”
- really: “are you routing billions of requests to thousands of database across hundreds of databases per second?”
- if not, you don’t need to containerise your databases
- reasons to try:
- faster provisioning
- stability
- recovery
- if your current processes take months to add or upscale a database, it can seem really attractive
- but: you can get all these benefits from a cloud provider and
some tooling
- “omg that will cost $$$$, we’ll build our own”
- how much do you think building your own is going to cost?
- 2 main ways people do this:
- containerised database instances, data goes to some
network-backed storage like ceph
- use something like etcd to handle failure and service-discovery
- BUT: eventually you’ll be network-bound
- store data on host using a mounted volume
- if one dies, what do you do with the stale volume still on the host?
- you could redeploy..
- (this is what we did for cassandra. we had to write a lot of our own tooling)
- containerised database instances, data goes to some
network-backed storage like ceph
- maybe: use a cloud provider instead
- automatic failover
- scalability
- read replicas
- multi-regions
- everything you need without worrying about:
- becoming network-bound
- securing data properly
- etc
- how will you build your container tarballs?
- you don’t have to use docker in prod (do you want to? you should read about it)
- orchestration & scheduling
- resource management
- placement
- management
- how will you manage clusters?
- how will you drain traffic?
- how will you do automatic failovers?
- networking
- how will you handle routing, access control, service discovery?
- there’s a dozen tools that just handle networking in kubernetes
- linkerd
- istio
- envoy
- calico
- …
- how do you hook it into your existing infrastructure?
- deployment: is it the same tooling? how do you support two parallel deployment pipeline?
- monitoring: what new metrics do you need to be monitoring on your new platform? what counts as a healthy container?
- provisioning: how do you provision new container hosts? what gets priority? container hosts or legacy hosts?
- debugging: how are you going to troubleshoot with this new abstraction layer? how will you empower the devs running apps on this platform to debug their own services? logging platform? training?
- gradual rollout. try some things, some fail, try new things
- minimum 1 year to rollout a new container platform
- just one service, on a relatively stable platform
- minimum 1 year to rollout a new container platform
- behind closed doors:
- “we need containers”
- “let’s give it to ops”
- containers is a completely new can of worms
- you’ll need a new team
- you’ll need specific skills:
- ops
- you need to know where the skeletons are buried
- deployments
- tooling
- you’ll need tooling to glue the platform together
- you’ll need to test it
- monitoring
- someone who knows the right metrics to check when you see weird phenomena
- kernel engineer
- analyse kernel crashes
- understand upstream
- networking
- infosec
- containters have a bad reputation but they’re making great strides
- internal adoption
- good relationships with other teams internally
- you need to manage other teams’ roadmaps to get early beta customers
- project manager
- ops
- each of these skills doesn’t need to be a separate person, but
you also need more than one person
- you need at least 4 people, ideally 6-8
- less than 4 is death for on call
- empower them to succeed
- authority
- budget to try out new cloud instances
- do you have
- stateless services?
- a large, hetorogeneous platform?
- do you have time, money, people, org support?
- yes, maybe you should do containers
- do you have
- a monolith and a few services?
- a small team with no org support?
- just want to spite me?
- maybe don’t do containers?
- do you want containers or a blog post?
- it’s ok not to use containers
- why become a lead in the first place?
- dealing with people problems is much more interesting than dealing with computers
- i asked a friend for advice who had done it before
- he said: “dan, don’t do it”, you like coding too much
- each company interprets slightly different way:
- tech lead?
- people manager?
- part of your job is to understand what your role is about
- getting into leadership is not trivial
- ask for help of people around you
- your lead, for example
- head of dept set up a step-by-step process for how to become a lead
- part of my plan was going through a 3-month transition of intense mentoring
- surprises:
- how much of my time i had to spend in meetings
- strategy
- agile
- 1:1
- they’re important
- i was getting energy drained, couldn’t keep pace
- i got better in time
- better at choosing which meetings really mattered
- career switch
- this isn’t a promotion, it’s a different skillset
- becoming a lead isn’t a natural evolution of being a developer
- the DRY principle is not a good principle with people
- how much of my time i had to spend in meetings
- how do you learn new skills really fast?
- shadowing my mentor
- having his support helped me have a smooth transition and kept me from feeling lost
- applying what i read in books
- not just reading books
- put it in practice!
- reflect and remember good and not so good behaviour from other managers in the past
- example: i always hated not feeling i was in an open and safe
environment
- without mutual trust, there couldn’t be an open and safe environment
- how do you earn trust of team?
- it’s not easy: trust means opening yourself up to be vulnerable
- regular 1:1s
- transparency in decision-making
- especially around performance evaluation
- the best solutions to problems come from the team
- have the team take ownership of the problem
- feedback loops
- ask for feedback from team on any occasion
- healthcheck meetings with the team
- not taking a decision is a decision
- we are accountable for both the decisions we make and the ones we don’t or postpone
- feedback culture
- give feedback as close as possible to the moment in time where the action which generated the need to provide feedback happened
- decouple development feedback from performance evaluation
- why did your company hire you as a lead, rather than as just another software developer in your teams? understand this and unleash your lead superpowers.
- @alexhillphd
- why code review? they’re good at some hard-to-quantify things:
- fucntionality
- readability
- maintainability
- scalability
- but it’s also a direct critique of someone and their work
- defensiveness is a common feeling
- not all comments are equal
- two axes:
- low reward - high reward (how important is the comment?)
- low conflict - high conflict (how likely is recipient to feel defensive?)
- low reward high conflict:
- whitespace, typos, arbitrary preferences
- use a linter instead to resolve these! don’t do it in code review!
- low conflict:
- missing tests, bugs, rogue println statements
- no problem
- high conflict high reward:
- design pattern choices
- over-engineering
- readability
- naming choices
- duplicated logic
- active collaboration needed
- two axes:
- conflict resolution archetypes:
- competing
- collaborating
- compromising
- avoiding
- yielding
- (dual concerns model)
- we want to achieve the collaborative approach
- lower defensiveness
- raise confidence
- as an organisation;
- pair program
- discuss tasks prior to implementation
- not silo codebases
- ensure everyone reviews and all code is reviewed
- not about singling people out
- seniors don’t get to commit without review
- as a reviewer:
- raise code by a grade or 2, no more
- C-> B+, B->A, but not D->A
- language: use “we” not “you”
- “you should have re-used this function” -> “we could reuse this function”
- ask questions
- give positive feedback
- “this is a cool library”
- “this refactor makes a lot of sense”
- raise code by a grade or 2, no more
- as an author:
- practice the “as if” technique
- how would i respond if [i were in my best mood, i were<role model>, this code wasn’t mine, the comments were phrased differently]
- say ‘thank you’
- annotate your review first
- solicit feedback with specific questions
- practice the “as if” technique
- summary
- anticipate feelings of ownership
- minimise unnecessary conflict so you can focus on the important ones
- nudge towards collaboration by reducing defensiveness and raising confidence
- blogpost on website
- @pia_nilsson - engineering manager, spotify
- a journey in combining the lean & XP practices with a focus on the team
- flow in lean: kanban board
- all about optimising speed from backlog to done
- find bottlenecks - tech and people
- increase the flow of work
- at spotify, we were doing a lot of things, but not finishing
many
- lots in “develop”, not much in “review”, “validate” or “done”
- we knew we had some bottlenecks
- what did we do?
- WIP limits
- improved flow of work, got more stuff done
- but it also increased friction
- devs couldn’t pick up a new shiny task
- had to instead find that key person to get that review done
- test-driven development and domain-driven design
- talk about why it makes sense to do tests first
- teaching sessions on DDD
- architecture discussions talking about boundaries of a microservice
- increased flow more
- but it also increased friction
- pairing & mobbing as a default
- added to working agreements - you are expected to pair
- expected to decrease silos
- everyone was on board
- increased flow even more
- but still increased friction
- how can we keep the flow but reduce friction?
- that’s this talk
- WIP limits
- need to create safe spaces for people to share opinions without worrying about being right
- read up on google project aristotle - “psychological safety”
- “how confident am i that i won’t be blamed or laughed at if i make a mistake or ask a dumb question?”
- “code creme brulee”
- hard on the surface, soft on the inside
- we set up to scratch that surface
- ask the stupid questions
- speak up about a task, how it makes you feel
- try to be a bit vulnerable
- training in toxic communications
- based on studies from Dr Guttmann who studies married couples for 40 years
- four toxic communicaton patterns:
- criticism
- defensiveness
- stonewalling
- contempt
- we introduced “i messages”
- “this sucks” -> “i think this sucks”
- reduces defensiveness
- contempt is often seen in teams with a lot of sarcasm
- appreciation is the antidote
- practice active listening
- “yes and”
- comes from improv theatre
- build on other’s ideas
- never say “no” or “but”
- “this unit test does too many things, I’m going to delete it”
- “yes, and let’s write a new test which is clearer”
- it’s about hearing a third opinion which you might never hear if you said “no but”
- we’re passionate people
- it’s not great to be interrupted
- practice: friendly feedback (without blame)
- conflict is a tragic expression of an unmet need
- non-violent communication cheat sheet:
- when you [merged to master yesterday], i felt [confused], because i have a need for []. Would you consider [checking in with me first]?
- key point: don’t leave feelings to implicit interpretation; explicitly talk about them
- turn up the good
- if the team is moving really fast, it’s important to know where we’re going and why
- Objectives and Key Results
- can really help if used properly
- in the CD backend team we had these uninspiring objectives
- objectives need to be really inspirational
- objective: centralise all CI at spotify
- key results: measures that show how far along we are towards
our objective
- key results: increase customer base of platform by 60%
- note: no mention of how we achieve this
- that’s up to the team
- despicable design
- think about our users and how our service could be made worse
- service window midday
- slower response times
- postal reviews
- stuff like that
- it was fun and it got us thinking about our users
- think about our users and how our service could be made worse
- how we increased flow while reducing friction
- get the talking going
- active listening
- friendly feedback
- answer why
- this isn’t static at all - you can’t do it once and forget about it
- @mennovanslooten - front end chapter lead - backbase
- I’m not sharing this story because i think it is special
- but because i know it is not
- and it would have helped me to hear it before i became a lead developer
- i had been a FE dev for >15 years
- one of my old employers found i was on the market and invited me to become a chapter lead
- the experience of becoming a lead dev was.. not great
- i’m hear to explain how i felt being a lead developer as opposed to being a developer
- i loved being a developer
- i loved programming
- i loved the way code looks in an editor
- i loved abstract puzzles
- i loved learning about some 50-year-algorithm i last heard about in university
- it was not just satisfying, it was really rewarding. fulfilling.
- i could open up a browser and show my work to my friends and peers and family and say “i built that!”
- i worked really hard to get good and stay good.
- but: a nagging voice in the back of my head
- “how long do you think you can keep doing this?”
- i had trouble keeping up
- people much younger, less experienced, who were creating solutions i didn’t understand, to problems i didn’t realise i was having
- it was in this context that my old employer invited me to become
a chapter lead
- it was a huge step in my career, if you can call having the same job for 15 years a career
- i had no idea what i was signing up for
- (well, i had some ideas, but none of them turned out to be true)
- the reality was rather disappointing
- not nearly as rewarding or fulfilling
- what did I create today? waht did I do?
- i wrote more emails than lines of code
- meeting after meeting which had nothing to do with programming
- interruptions so bad that my interruptions would get interrupted
- i did something i should have done way before, which was talk to
other lead developers
- almost everyone i talked to was dealing with the same issues
- you’re not alone, you’re not weird, it’s totally fine
- i came home from that conference determined to get better at
being a lead developer, but also to get better at enjoying it
- and it worked!
- there’s no four-step programme
- i had to completely let go of programming
- step away from chasing that feeling of fast feedback
- i had a meeting with my manager where we were asking if someone’s
job title matched their performance
- i found two people in my group were performing way better than their job title suggested
- i focussed all my email-writing powers into writing to my manager
- two months later, they were promoted and got a significant raise
- this blew my mind
- i had a load of influence and power
- and i had never really bothered to use it
- this made me reevaluate everything i did
- interruptions, emails
- let the developers continue uninterrupted
- if i sent an email it was for the benefit of the people around me
- with great power, comes great responsibility
- i like helping people
- not because i’m selfless
- but because it makes me feel important and valuable
- @jenny_duckett - technical architect, ministry of justice
- think about a time when you were working on an effective team
- what made you excited about it?
- i was on a team
- it changed several people over the course of my time there
- lots of people joining the team were completely new to the team
- support and improvement work over the 10 product areas we owned
- we had to shift the focus of the team significantly at one point
- might seem unusual choice for best team ever, given the
circumstances
- an empowered, open team
- i see lots of teams struggling
- change is often positive!
- we frequently make deliberate changes about how we’re working in our team
- there’s often uncertainty involved
- which might be resolved quickly or go on for months and months
- people can feel unvalued
- people leave and join
- often these are positive changes but it can still be hard
- the dynamics of personalities and opinions changes whenever people change
- senior leaders move
- it can be hard for teams to make decisions and handle roadmaps while this is happening
- it can be hard to revisit decisions that you thought you’d settled
- it can be hard to make progress
- wider priorities shift
- can end up feeling frustrated and disempowered
- why make effort when it might just change anyway?
- teams are re-organised out of existence
- can make people feel undervalued as individuals or for the work the team has done together
- if you’re putting people through these things more than occasionally, you will have a retention problem
- even things like desk moves (see Lara Hogan’s blog post about this) can have an impact on people
- the way changes make people feel is at least as important as the change itself
- work on yourself first
- help ensure you can sustain through these disruptive changes and be better able to support your team as a result
- if you’re senior, consider the relationships that the teams have worked hard to build together
- don’t do it all yourself
- you don’t need to review all the PRs
- let go of the details
- instead, give people your trust
- assume positive intent
- if you’re working with other people to lead your team (such as product and delivery managers), work really hard on your relationship with them
- one thing i found really useful was a support network for tech leads within GDS
- set yourself up to lead sustainably
- define a single clear goal for your team
- we had to stop splitting our efforts and focus on one goal
- the effect was magical
- we agreed as a team what parts were essential by the deadline
- a shared understanding of all this meant the whole team was empowered
- communicate it over and over again
- it’ll feel like you’re just repeating yourself and you’re boring people
- but it’s reassuring just to know that the goal hasn’t changed
- you might not be able to pick one single goal
- but communication is even more important in that case
- give your team the background they need for each piece of work
- add context to your stories
- use story kickoffs
- don’t get as far as the PR before explaining why you want the work done
- run workshops
- embrace opportunities for positive change
- become great at integrating new people
- every new person has a mentor for the first few weeks - often the last person who joined
- recognise that everyone is always learning
- make it clear that you value learning as part of everyday work
- share understanding of your work in the team
- write good commit messages - why, not just what
- comments on tickets and user stories documenting progress
- when teams make a decision, document the reasons for it
- if you learn to share context frequently, you will be able to keep work flowing during disruptions
- when my team started mobbing, i was amazed how quickly the team made progress and how rarely they were blocked on anything
- we wrote a blog post (written by Emma Beynon )
- teams were able to use mobbing later on to tackle things which were entirely new to them
- taking ownership helps people handle change
- use every piece of work to help someone grow
- start with individual needs
- delegate effectively
- be clear and explicit - tell them that this is what’s happening and why
- set the scope: what’s the problem they’re trying to solve?
- who else is going to be involved?
- when should they bring questions to you?
- teach people to do your job
- grow the next generation of leaders
- it’s easier and more rewarding to hire less experienced people and grow them
- prepare the team for you moving on even before you know it’s going to happen
- when i came back from a couple of weeks holiday and found my
team carried on as normal without me, i had all the feelings
- sad but proud
- grow people for a resilient team and organisation
- encourage your team to show off their work
- show the team how their work fits into the bigger picture
- don’t over-insulate your team
- when something gets through your shield, it’ll be very disruptive
- if there are rumblings around in your organisation, mention it to your team
- tell them when you’ve said no to your team taking on other work
- a wider view helps people adapt when things change
- communicate your team’s capacity for change
- it takes time to become familiar with a new domain
- i frequently had to argue for not restructuring teams wholesale, but come to some accomodation to take on new organisational priorities
- people at the top can’t create a culture of empowerment alone, but they can reinforce or destroy it
- show them why all your team’s work matters
- good communication about change is vital
- grow sustainable teams for a sustainable organisation
- a team that understands where they fit within the overall strategy can more easily accept changing the focus of that work to support that goal in a different way
- (i recommend reading the whole transcript of this talk (see link at top), there’s way too much value that i missed)
- @cmccarrick - SVP of platform engineering - GTL
- start with a story
- when i was 14, i worked on a farm making peaches
- long days in the sun, alone, covered in peach fuzz
- i had a lot of time on my hands
- i decided there was no way i was doing this for the rest of my life (and got straight As for the first time at school)
- i realised that there’s only so much that one person can achieve on their own
- i bought a commodore 64
- i’ve been having conversations iwth hundreds of people
- “i don’t have enough time”
- “i am so stressed out”
- what does it mean to scale?
- my manager quit on a friday; on monday - boom - i was running a team
- i manage over 200 people in 10 offices scattered throughout the world
- there are times when i lose it
- i get emotionally paralysed and can’t make any progress
- learning to scale yourself is not a one-time task; it’s a
lifetime’s effort
- you should expect your job to change every 6-9 months
- you have to be good at communicating 1 on 1
- as you grow, you need to get better at geting your point across to larger and larger groups
- become expert at managing up to your managers; across to other teams; and down to your reports
- the “manager readme” - weekly digest
- personal branding and self-promotion
- in order for your good performance to have any effect on your career, someone needs to notice your good performance
- we value logic, efficiency, getting the work done
- to us, that’s all that should matter
- but often it’s not
- what can i do?
- take initiatives on high-visibility projects
- genuinely praise other people
- have confidence - it’s a positive feedback loop which attracts people to you
- don’t let your weaknesses blind you
- get honest feedback
- you need a safe environment
- get people to expect consequence-free feedback
- most importantly: learn to say “no”
- without feeling guilty!
- respectful, but completely unapologetic
- people are bad at time estimation and time management
- how much time do we have?
- 168 hours a week
- if you don’t prioritize your life, someone else will do it for you
- write down all the things you need to do (don’t prioritize!)
- but there are things you don’t think about - dark matter tasks
- people who say “can you help me with this?”
- keep a journal - track all these quick favours
- prioritization:
- “which one of these is the most important?”
- “they all have to get done” is not an answer
- eisenhower method
- 4 box matrix: urgent/not urgent vs important/not important
- urgent/important: do
- not urgent/important: plan
- not important/urgent: delegate
- not urgent/not important: eliminate
- “which one of these is the most important?”
- multitasking is a scaling anti-pattern
- focus
- what’s it like being completely focused?
- relaxed
- confident
- lose perception of time
- how do you recreate that moment more often?
- get the most done
- calendar blocking
- what’s it like being completely focused?
- meetings OMG
- makers vs managers schedule
- delete every recurring meeting you have
- make your calendar sacrosanct
- reject double bookings
- email and slack
- they’re so addictive!
- “i wish i spent more time on email” - said noone ever
- turn off notifications
- schedule short blocks during the day when you quickly check emails
- schedule longer blocks at the end of the day where you tidy things up
- your calendar can do your slack statuses for you
- put response times in your manager readme
- so people have expectations on response times
- obsess with the things that matter!
- move from “how can i get this done?” to “how can this task/decision/goal get done?”
- not delegating properly is an anti-pattern
- let things go
- delegate decisions!
- not doing this limits the scaling of your entire team by becoming a bottleneck around decision-making
- leading takes energy
- leading gets lonely
- if athletes get injured, they sit on the bench
- mental fatigue, burnout, is an issue that affects us more than we might think
- make yourself a priority once in a while. it’s not selfish, it’s necessary
- mental health benefits of exercise
- @jlewin_ - software developer - sky
- “people who came to the react.js community early are now mostly talking about Reason”
- new syntax for ocaml
- functional programming language
- 1990s heritage
- used by financial institutions
- interop with JS
- “why can’t i use typescript or flow?”
- with reason, types are baked into the language which gives
benefits you can’t get otherwise
- 100% coverage - everything has a type
- guaranteed to be sound
- no runtime type errors
- pattern matching
- compile reason to (readable!) JS
- access JS in reason
- compile to native
- reasonml-community on github
- create-react-app with reason-scripts
- reprocessing
- @jackiebackwards - head of FE development for behance at adobe
- I’m all-in on frontend development
- I’ve never worked in devops
- i did help with the development of the web UI of our CD platform
- what makes a good deploy?
- as long as it makes it to production and doesn’t set off any alerts, it’s a success
- what about empathy? what about being compassionate and minimising suffering?
- a good CI/CD pipeline is the empathetic choice for delivering code to production
- putting code into production is scary
- it can be the domain of a specialist person with specific skills
- the first time i wrote a capistrano script to deploy my personal website, i was so baffled by what i’d written, i was afraid to update my site for over a year afterwards
- a good CI/CD platform does a lot to address the risks & fears around deploying to production
- CI and CD are the practices that enable organizations to frequently and reliably release new features and products
- lots of benefits in terms of reducing risk
- it’s also opinionated which may have impact on how teams do work and require team discussions
- episode I: the FTP menace
- when i did this in the beginning:
- svn for version control
- branches were hard, so we just wrote to master all the time
- we thought we were “agile” by not being nitpicky about writing tests
- no process for task management
- every 2 weeks or so, our one devops engineer would cut a release from our master branch, put it into staging where it would sit for a day or two, then onwards to production
- we were deploying huge, risky changesets all at once
- we would attempt to deploy at the lowest-traffic times to
compensate
- we could only deploy after hours
- don’t do this!
- episode II: attack of the hotfixes!
- our ops staff would spent days at a time being our menial deploy sherpas
- we had no way to do a rollback. if we pushed a bug, we just had to resolve it and release another hotfix
- episode III: revenge of the GUIs
- at some point we switched to git and github
- branching, code reviews, automated tests
- jenkins & hubot to allow engineers to deploy changesets to different staging environments
- at some point we switched to git and github
- build nights make deploys more stressful by making things seem higher-stakes than they really are
- it takes someone with a specific lifestyle to be able to hang around the office at all hours
- biggest points of failure
- how the process affected us and our users
- episode IV: a new hope
- some of our engineers were sick and tired of our build processes
- wrote down how deploys should work
- started to build a new platform
- solved the probelm in 2 weeks
- a series of best practices
- ownership of deployments is empowering
- development safety:
- fork-and-branch to allow for consequence-free development playground
- upstream is locked down and only contains approved code
- reduces clutter - clean history
- feature firewall
- new features are developed incrementally and shipped to production behind flags
- can do this without fear of negatively impacting user experience
- our designers can test new features in a real-world environment
- smaller changesets
- smaller PRs even for new features
- feature doesn’t need to be fully complete to be deployed to production
- less risk
- smaller PRs even for new features
- peer reviews
- style checks automated
- PR peer reviews become higher quality
- rule: be nice
- be cogniscant of your colleague’s efforts
- CI at every step
- starting from PR
- if anything fails, you are blocked from moving forward
- staging and production require manual verification
- automated tests stop being useful at the point where reality begins
- human verification of human-made changes intended for human consumption
- evergreen master
- master is always deployable
- safer rollbacks
- easy interface, easy deploy
- a good UI is pretty invisible
- jenkins as an anti-example of this :sick-smiley:
- moonbeam.io
- it started as a hackathon, but it’s grown to be a first-class citizen
- we now use moonbeam to deploy moon
- @tara_ojo - software engineer - futurelearn
- think back to your first day in your career
- full of enthusiasm
- building something from scratch
- fast forward to today
- think about that journey
- everything you’ve learned
- you probably didn’t get to where you are today by yourself
- you learned from colleagues with loads of experience
- you probably also learned from colleagues without much experience too
- the way you work with junior developers on a day-to-day basis can have such a big impact on their careers
- before futurelearn, i was on a 12-month grad scheme at M&S
- we knew we needed to learn how to code
- but we didn’t know what else we had to work on
- I use the word “junior” but there are other words:
- intern
- associate
- apprentice
- graduate
- noob
- you could be doing things to support and uplift junior developers
in order to get them to the next stage
- they need to stretch themselves
- “i could start teaching other people in my team things” - grad developer who felt ready to move on
- teaching is a good way for a junior to stretch themselves
- if your junior developer is picking up tasks that they know they
can do, and doing them quickly and successfully, then they may be
sticking to their comfort zone
- you want them to stretch themselves by taking things a bit beyond this
- but: avoid going too far into the PANIC zone
- remember that the boundaries between these zones aren’t fixed
- gather evidence about amazing changes and stretching
- this will be useful for interviews for roles at a higher level
- being a junior is not something to be ashamed of. it’s not a burden
- invest time
- teach them
- pass on your knowledge
- good pairing
- when i was quite new
- i was struggling to follow along
- i fell asleep at one point
- if that person had given me the keyboard, i would have been much more engaged
- ask specific open questions
- “if i run the tests against this code, do you think it’s going to pass?”
- create opportunities
- living objectives
- set goals and measure confidence levels in a bunch of different areas
- check your confidence as you go through
- it’s a good way to measure your progress
- living objectives
- regular feedback
- “i feel like i’m not mid-level, i need confirmation from people around me”
- giving specific and actionable feedback
- try this structure:
- do more
- do less
- start doing
- stop doing
- keep doing
- @adrianh Generalising Specialist - quiet stars
- making a product is easy
- someone comes up with a “north star” - the problem that needs solving
- someone else comes up with a journey of how we get there
- someone splits it up into cards
- we divide it up into cards and give them to developers
- we do them all
- this is a lie
- stories come in different sizes
- some are big, small
- causes problem with flow - blocked pipelines
- we start doing estimates
- story points
- if it’s too big, we cut it up
- gets us back to our nice list of small tasks
- this is also a lie
- our customers don’t care about our stories
- when we take a story and cut it up, we often discover the actual value is somewhere other than what we’ve built
- something’s gotten lost between the north start and the individual stories
- instead of estimating story points first, try these three
value-based questions:
- can we bin this story (or at least shelve it?)
- if it’s about building subscriptions, but the first 3 months are free, do we need to build it now?
- can we thin it?
- can we deliver less and still deliver most of the value?
- can we split it?
- into more than one story, which still provide value to the customer?
- not: database tables
- can we bin this story (or at least shelve it?)
- we still get smaller stories!
- binning: you can’t get smaller than nothing at all
- thinning: we’re doing less, making stories smaller
- split: those stories are smaller
- ask the questions again about the results. and again
- but split based on value, not effort
- book: user story mapping by Jeff Patton
- you have your customer journey, and you map the stories that we
need to minimally support that journey
- that’s release one
- each slice is a release that provides a version of the customer journey
- this is an ongoing activity
- if you bin a story, that tends to push it down to the next release
- if you thin a story, it tends to pull it up to the current release
- if you split a story, it spreads it across releases
- (this is still a lie)
- many organisations don’t let people at the development team level make those decisions about customer value
- things to help people know the goals:
- OKRs
- options
- assumptions
- hypotheses
- experiments
- do less together more often to do more
- @nmeans - VP Engineering - Muve Health
- how does a nuclear reactor generate power?
- when i was a kid i was given a four-volume set of books called “how things work”
- my dad often patiently explained to me how things work
- I distinctly remember turning to these books when a new nuclear reactor came online
- I turned to the page on reactors
- the basic mechanics of a nuclear power plant are basically the
same as a conventional plant
- a heat source to heat water
- high pressure water turns to steam
- steam expands which pushes a turbine
- which turns a generator
- which is where the electricity actually comes from
- the steam condenses and goes back round the system
- we’re looking at pressurised water reactors because that’s how
Three Mile Island works
- primary loop: water heated and held at high pressure
- secondary loop: water turns to heat
- the two loops don’t mix
- the primary loop water doesn’t boil
- or at least…shouldn’t
- three mile island
- about 10 miles south of the capital of Pennsylvania
- unit 2 went into operation 1978
- runs at 90% capacity for 3 months
- “hot, straight and normal”
- 4 men
- shift supervisor
- shift foreman
- 2 operators
- everything was pretty normal
- except for a small problem in one of the condensate polishers that the previous shift couldn’t solve
- 10 hours earlier the swing shift started working on unclogging a clog
- they tried backwashing but it didn’t work
- the operators early on developed a backup system where they took air from the pressurised system and used that to break up the resin beads
- suddenly went quiet (which it shouldn’t with hundreds of tons of water)
- there was a leaking check valve
- all eight tanks close simultaneously completely blocking the flow of water
- there is no water to be pumped through the secondary cooling room
- the main feed water pumps trip offline
- the turbine and generator trip offline 2 seconds later
- the palnt’s main safety opens
- the secondary water is not radioactive at all
- lets off loads of steam into the night sky
- the turbine and generator alarms go off
- the primary water pressure spikes
- this is by design - without secondary to remove heat, it heats up and so pressure goes up
- automatic systems kick in here:
- pressuriser:
- regulates system pressure
- measures water level
- if there’s water in the pressuriser, there’s water in the rest of the system
- maintains a bubble of steam at the top which absorbs pressure shocks
- but the pressure is continuing to climb
- the next thing that happened (and most famously)
- pilot operated relief valve opens
- 4 seconds after the turbine and generator trip offline
- the computer detects that pressure is still climbing
- so it scrams the reactor
- neutrons -> uranium fission
- we control this reaction through cadmium control rods which
absorb neutrons gleefully
- typically raised and lowered to control reaction
- scram: drop them to the bottom
- stops the nuclear chain reaction almost immediately
- but it doesn’t stop heat production quite as quickly
- secondary fission products are still present - 6.5% heat production
- in the hours after this, it’s still important to carry heat away from the core
- control room shows the pilot relief valve has been signalled to close
- operators are happy - they have procedures for this
- confident that the system is behaving as it should
- but: 2 minutes later
- emergency core cooling system kicks in
- high pressure values dump water into core
- they didn’t understand why the system thought it needed more water (because the pressure was still rising)
- 2.5 minutes later, they switch the high pressure valves off
- if they hadn’t, there would have been no accident
- bill zewe wonders about something:
- the pressure is now dropping but the water level is rising
- he suspects the pilot relief is stuck open
- checked the outlet temperature
- if he had decided to close the block valve, there would have been no accident
- 6 minutes later:
- alarm about sump:
- pilot relief valve has leaked enough to set off this alarm
- clear signal that there’s a significant leak
- but they miss it
- the water in the reactor pool is boiling
- causes vibrations
- they have to shut off the primary coolant loop pumps
- this helps for a little while
- 30 minute later, the vibration is back
- it’s now 5:44 in the morning, and a nuclear reactor that was at 90% 2 hours ago has no coolant going round
- alarm about sump:
- a radiation alarm goes off
- one of the fuel rods has ruptured
- uranium is normally encased in zirconium
- almost certainly, the water level has droped below the top of the core
- one of the fuel rods has ruptured
- the leadership has come to the plant
- “they closed the block valve, right?”
- they finally shut it
- this would have been the right thing to do 20 minutes into the accident
- doing it now removed the only source of cooling
- heat intensified rapidly
- 8 minutes later, top of core collapsed
- at 7.20 the radiation alarm at the top of the building goes off
- maximum yearly allowance in 20 seconds
- they knew the core had started to melt down
- they turned on the high pressure injection
- but turn it off 18 minutes later because they’re concerned about the pressuriser
- over the next few days they continued to be concerned about
radiation leak
- but the containment did its job
- there was public concern about a hydrogen explosion
- on sunday april 1st president jimmy carter visited
- about 20 tons of melted uranium ended up at the bottom of the reactor vessel
- a further 10 tons in the middle
- final cost of cleanup: $1bn
- still not finished
- unit 1 is still producing electricity
- unit 2 won’t be fully cleaned up until unit 1 is shut down
- currently scheduled 2034
- sidney dekker: the field guid to understanding “human error”
- “first stories” and “second stories”
- the story i told is the first story
- focuses on humans in story and what they could/should have done differently
- problem with this: bias
- hindsight bias
- if you know the outcome, you exaggerate your own ability to predict and prevent the outcome
- “I think if i saw water pooling at the bottom of the reactor building, i would have noticed there was a leak”
- outcome bias
- given the outcome, you judge decisions based on that
- eg: turning off the high pressure injectors was obviously stupid
- hindsight bias
- how do we get to the second story?
- work from the participant’s reality
- assume positive intent
- everyone involved made the best decisions they could with the knowledge they had
- why did Fred turn off the emergency cooling system?
- pressurizer
- he was afraid the water in the pressurizer was going to go solid
- if you allow the pressurizer to fill with water (no steam bubble) there’s no shock absorbing effect any more
- this is a smaller problem than the core melting down
- why is fred so concerned about the pressuriser?
- they were all naval reactor veterans
- prime job in a submarine operator was to prevent the pressuriser going solid
- this makes sense for a submarine reactor: 12 MWth
- not three mile island: 2.8 GWth
- heat at shutdown (6.5%):
- submarine: 0.78 MWth
- three mile: 185 MWth
- in a submarine, a water hammer (unabsorbed pressure shock) was the worst-case scenario
- pressurizer
- so Fred Schiemann, with a rising pressure, disabled the cooling to keep the system safe.
- why did bill zewe not close the block valve when the temperature was over 200℉?
- the pilot-relief valve was leaking from the day three mile opened
- if they shut it down every time the temperature went over 200, they’d not generate any electricity
- they were going to fix it for next refuelling shutdown
- he also figured the pilot-relief valve was closed
- but the control panel only said what the computer had told it to do, not the actual position
- why did the crew not respond when the sump alarm went off?
- they never got the alarm!
- giant panel of lights - each one resembles an alarm
- on a good day, 40 or 50 lights are lit up
- there’s no rhyme or reason to their placement
- the light for reactor vessel pressure is next to the one for a stuck elevator
- no timeline for lights - when did alarm go off?
- there is a timeline on the printer
- but it’s on a 300 baud connection
- there’s so many alarms that the printer is 2.5 hours behind
- Dr Dekker: human error is never the cause
- it’s always caused by underlying systems
- blaming a human prevents us from examining this
- ask what is responsible, not who
- understand why what people did made sense
- because if it made sense to them then, it’ll make sense to someone else later
- seek forward accountability, not backward
- blameless postmortems
- free people up to candidly share what went wrong
- so you can really get to the bottom of it
- the act of telling the story is all the accountability a well-meaning person needs to learn their lesson
- they’ve already beat themselves up, they don’t need your help with it
- blameless postmortems
- there’s always a second story - look for it
- this talk should really be titled what destroyed three mile island?
- (i missed the start of this)
- the higher up you go, the less people will tell you when you get things wrong
- a lot of engineers are promoted into management because they’re
good engineers
- some people are naturally good at both
- but if you’re good at engineering, it might actually be harder to develop management skills
- people ask me: do you miss coding?
- no!
- coding is not about the code. it’s about the achievements
- my best way of achieving things isn’t coding
- @ramtop - functional programming specialist - standard chartered bank
- legacy systems!
- i used to work at banks and big institutions
- legacy systems are old systems that probably make a lot of money for the company
- but they’re big and complicated and nobody really knows how they work
- a friend of mine is working on them, and a legacy system is just
last year’s system!
- they’re moving quickly in order to go to market
- the system became a liability quickly!
- what is a legacy system?
- an old running system
- critical for busines
- hard & expensive to:
- maintain
- improve
- expand
- how do you recognise one?
- it was a very good design
- possible too good!
- people start adding extra features and use cases
- it becomes overloaded
- continuous state of emergency
- i was in a bank, where there were different levels of
emergency
- level 4 wasn’t too important
- level 1 would involve newspaper headlines
- there was a project which was consistently at a level 2 emergency
- I couldn’t really imagine to work on those teams because there was so much pressure
- but it becomes kind of normal, and nobody really cares
- i was in a bank, where there were different levels of
emergency
- we’d like to retire it but… we don’t know who is using it!
- there was a system that needed to be retired, and they checked everyone using it
- but: there was a system which had an annual report, and it used the old system, and the report was a legal requirement
- it was a very good design
- technical debt default
- when it reaches some point that is so high that you could never ever repay it, that’s really a problem
- what do we do?
- further degradation: broken windows effect
- if you have an old building, and somebody breaks a window, and nobody fixes it, the rest of the windows get broken quite quickly
- there’s a sense that it’s abandoned and nobody cares
- problem: the new rewrite left unfinished
- i worked on a really old system
- (initial commit was older than the grad on the team!)
- they had tried to replace it three separate times
- hidden costs of rewrite
- legacy system complexity is always underestimated
- because ofsuccess bias
- all previous knowledge in the code is thrown away and slowly rediscovered
- new features can delay the release
- old system is neglected but remains critical
- data migration is always more painful than expected
- legacy system complexity is always underestimated
- it’s not that rewrites never work, but they’re very risky
- https://en.wikipedia.org/wiki/Kintsugi
- fixing things without hiding the fix
- using lacquer/gold leaf to join broken ceramics back together
- similar to option #2 but it actually works
- progressive rewrite
- https://www.martinfowler.com/bliki/StranglerApplication.html
- reduce risk
- shorter release cycles
- for example: you have a C# app, but you want to migrate to
scala+js
- keep the C# app but add a Newport view onto the new interface
- replace one feature at a time
- using the old app as a skeleton
- a progressive rewrite could take longer than what is estimated
for a full rewrite
- but probably much less than the actual time needed
- we got it completely wrong as an industry what quality is
- clean code?
- design patterns?
- TDD?
- functional programming?
- these are tools & techniques. they’re not quality
- you can’t say “this code is good quality because it has 95% test coverage”
- the only thing that really matters is the time it takes to
implement a feature
- if new features are easy to implement (or bugs are easy to fix), the code is good quality
- @crystalcy - product & UX lead - independent
- i hire designers and product managers
- have you ever felt 😕 while interviewing?
- .o(“why is this person asking me this question?”)
- not knowing what the intention behind a question is
- or like 😱 when interviewing someone?
- not having the tools to run the interview well
- or give a good impression and make them want to join the team
- Hiring is
- frustrating
- stressful
- not fun
- all of the above
- hiring is also expensive
- if you want to get buy in to improve your hiring processes, talk about time and (opportunity) costs saved
- let’s build a more intentional, inclusive hiring process, using
human-centred design
- less bias, more diversity
- less frustration, more delight, higher yield
- how often does the candidate accept an offer we extend?
- our goals
- cut bias (and improve diversity)
- set expectations (and increase delight)
- get to yes (and improve yield rate)
- our methods
- user interviews, journey mapping, paper prototyping
- competitive research
- sat in on existing sessions run by colleagues
- other dept heads had fairly long presentations
- that seemed exhausting to the new person
- i thought: maybe let’s make this more interactive
- many of these people had not been designers before
- and main exposure had been to graphic or interior design, not UX
- new onboarding session
- i led interactive activities
- design challenge: how might we improve the interview experience?
- conduct research
- user interviews
- goal: uncover candidate pain points
- activity:
- have new hires pair up (in different roles)
- ask open-ended questions
- time-box activity (5-7 minutes)
- it’s very easy to ask a question that is
accidentally misleading
- don’t ask “what did you like?” but “what did you think? how did that make you feel?”
- map the experience
- journey maps clarify pain points in the candidate experience
- example table to amp things out:
- paper prototyping & testing
- this can be intimidating to people not used to it
- “I work in HR, I’m not a designer”
- prototyping isn’t just sketching an interface
- could be: sketching an email
- writing a phone script
- ship & iterate
- focus on quick wins
- this is how you make a success of it
- make sure that someone from your hiring team is part of the process
- lead the way by offering to implement changes for roles you’re hiring for first
- “several different people were constantly emailing me to schedule next steps… it was hard to keep their names and positions stragiht. and if i had a question, who do i go to?”
- clarify roles
- guides help the candidate navigate the interviewing process
- hiring managers lead the decision-making process
- “talent” (recruitment team?) helps candidate navigate candidate journey
- dept director leads service design
- “it was frustrating that different people kept asking me the same questions over and over again”
- interviewers often didn’t have the resources to interview
candidates fairly and effectively
- interviewer pulled in at the last minute
- they don’t know where they fit in to the candidate experience
- we created an interviewer guide
- what stage are you performing?
- who has the candidate spoken to before?
- what are you expected to assess them on?
- note-taking template
- help to detail exactly what was said and what candidate answered
- these notes would be read by someone else
- people might interpret the way a candidate gives an answer
differently
- based on personality or bias
- eg: candidate takes a while to get to an answer after
rambling for a bit
- different interviewers interpret this differently
- the candidate’s a little nervous
- they’re not a good communicator
- they’re not good at listening - they didn’t listen to the question
- your interpretation depends on your own personality
- different interviewers interpret this differently
- we structured it so that interviewer was responsible for writing what was said, and another person for assessing
- interviewer pulled in at the last minute
- review
- hiring is expensive
- an intentional, inclusing hiring process is better
- less bias, more diversity
- less frustration, more delight, higher yield
- quick wins: clarify roles, create resources
- user interviews to uncover candidate pain points
- journey maps
- paper prototypes
application | phone screen | on-site interview | |
---|---|---|---|
people | |||
touchpoints | |||
emotions |
- @marekrog - CTO - appsilon data science
- imagine a world where:
- code is perfectly understandable
- concurrenvcy is a piece of cake
- testing is a breeze
- this world maybe doesn’t exist, but i think we can get close with functional programming
- learning FP is a great way to grow as an engineer
- @claresudbery - Lead Consultant Developer - Thoughtworks
- I am a technical lead with thoughtworks
- software development consultancy
- one of the things i do is introduce new practices to people
- usually XP - pairing, TDD
- also: new languages, new ways of doing things, new tools, new skills
- I’m not perfect
- i make mistakes
- as a teacher, it’s part of my job to help pupils believe that they can succeed
- let’s stop making other people feel stupid
- let’s stop intellectual elitism
- the idea that experienced practitioners are supposed to be “clever”
- you feel you’re supposed to prove to everybody else how clever you are
- you judge people if you don’t think they are clever enough
- you end up with this pathology where elite people talk to each other in jargon and nobody understands each other
- let’s talk about empathy
- teaching should always be inclusive
- strategies:
- when i first heard about this, i thought it sounded like hell on earth
- why would you want to spend your whole day with someone else
- when i came back into the industry i was insecure, i felt my skills were out of date, i deliberately came back at entry level
- when i was pairing, i learned so much more quickly
- I’m also eternally grateful to all the people who said to me that they were confused
- is importantb
- but the way you do it is important
- ask simple questions
- speak clearly
- make it clear what you do and don’t understand
- i led a team of (non-thoughtworks) developers
- my job was to upskill them
- i have run a lot of workshops before
- don’t feel like you’re giving a professional workshop that people would spend thousands of pounds for
- it can be cobbled together
- example: people were confused about async/await in C#
- i had learned about it previously
- i spent an hour brushing up on it, reminding myself
- thinking about what the most useful things to learn would be
- and where it would be most relevant in our codebase
- devised an example based on our codebase
- divided it into work and gave them half an hour to work on it
- come back, present, split up, work another half hour
- that’s a good model for a workshop
- you can iterate on it
- it can be a complete shambles at the start
- if you don’t start with “I’m the expert, you’re the learners” then everyone can feel their way through
- have a retro at the end and work out what to improve together
- also, you can google for someone else’s workshop and just run that
- workshop is more structured
- i’ll look for a tutorial, give it a quick look to ensure it’s not completely bonkers
- and go through it together - one screen, one keyboard, rotation timer (you need a big screen for mobbing though!)
- or you can split into pairs
- then do a quick post-it retro at the end
- again, empathy
- pay attention - if you’re going too fast, slow down
- don’t give yourself a learning deadline
- don’t say “by end of day, we’ll know A,B,C,D,E”
- because it might just be too much
- and different people learn at different paces
- you can get the faster ones to teach the slower ones
- the best way to consolidate your learning is to explain it to somebody else
- make learning part of the culture and show that it is celebrated
- regular sessions where you tell each other stuff
- anything! doesn’t have to be technical
- magic tricks, rubik’s cubes, etc
- ask them all the time!
- i want to know the answers!
- i want my team to know the answers!
- i want to show that no question is too stupid
- i don’t like when people use jargon
- people in junior positions say to me: “i’m glad you asked that question, i wanted to know the answer but i thought it was a stupid question”
- I had the same first impressions as with pairing:
- pairing is brilliant, but mobbing seems ridiculous
- 6 people all on one computer?!
- but: you’ve got all the knowledge on the codebase in the same place at the same time
- make an environment where everyone can come to work as themselves
- when you find them in your codebase, use them and point them out to people
- retros & feedback help the team own the work that they do
- feedback isn’t a way to tell people what they are doing wrong
- positive feedback matters
- feedback is a way to scaffold people and support them
- @dbussink - principal engineer - github
- i work for github
- we’re pretty well-known sticker company
- i was a senior engineering manager until recently
- my team has grown from 10 to 30 people
- i was doing people management, also managing some of the managers, but also involved with the technical discussions
- it became untenable as we grew
- we hired some people
- i’m now focussed on the technical leadership part
- i never realised the way i’d be working today when i graduated
- internet, video conferencing
- i never realised that would be viable
- if you as a company want to work with amazing talent you’re not going to find them all in one place any more
- not everyone wants to move
- do you really want to pay to have everyone in san francisco
- not everyone wants to work in a distributed team, some people prefer working in an office
- our team:
- all things i talk about today are things that work for us
- but may not translate directly to your situation
- today we’re 28 people, 5 different continents (or 7)
- today people work from 11 different countries in the world
- US coast to coast
- europe
- africa
- timezones: biggest difference is 10-11 hours
- people say to me this must be very hard
- I see it as easy mode
- because of how spread we are, everyone’s in a similar position
- there’s no advantage to being in any particular location
- the struggle companies have is that they have a big office where
most people are
- there’s a few people scattered around
- one simple thing you can do is: when having a meeting, everyone
dials in separately
- you start adopting conventions
- eg raise your hand before speaking
- although: sometimes people in the same office might as well not
be
- see slack outage where people joked on twitter that they might have to talk face-to-face
- my first day:
- i accidentally took staging down
- someone across the world in the US east coast jumped in and helped
- this worked because we put conversations somewhere they were public
- when you work on a distributed team, you have to be much more explicit about how you do things
- psychological safety
- regular cadence
- get everyone together regularly
- you need budget to do this
- use time together well
- what is the time together for? it’s expensive, but also high bandwidth
- so set explicit expectations about what you’re trying to get out of it
- examples:
- long term strategy
- team structures - are they working? what should we change?
- iterate on collaboration processes
- do we want to hire more people? what’s our strategy here?
- no day-to-day development
- do non-work activities
- when people are colocated, they might do non-work things together (karaoke? dinner?)
- try to capture this
- grab dinner together
- we did some things to teach coding to kids via
https://code.org/
- we really enjoyed it
- we got a lot out of it as teachers
- lightning talks about non-work topics
- tell people that it will be tiring
- keep talking
- build these relationships in regular 1:1s
- non work video chats
- world cup
- which country is screwing up in local politics today
- coffee machine chat / water cooler
- i was trying to sign up for a website that had an on-paste
disable form handler and i had to hack it to make it work with
my password manager and i wanted to complain
- just complain in chat
- other people share feelings together
- another eg: wedding photos
- rubber-ducking with myself in team chat
- be aware of your timezones though
- don’t always make your meetings a US-friendly time
- it’s hard to ad hoc jump into a meeting if you have a 9/10 hour time difference
- talk in public about what you’re doing
- slack has an interesting metric: public/private message ratio
- you want more public than private
- in an office, people can jump in if they think they can help
- talk in public channels
- also: github issues & PRs
- status updates
- is it useful to have a meeting to do status updates?
- often people use meetings as a crutch
- if i ask for people to update their status in a document, it doesn’t happen
- so i schedule a meeting to force it
- no instant gratification
- if you have a question, you won’t get a response for at least a workday
- even if it’s urgent
- you need to work on unblocking others
- if someone’s waiting on you, you need to get back to them
- don’t block yourself
- over-communicate
- any blame-free postmortem you’ll find a place where communication broke down
- by the time you feel you’re communicating too much, you might just be doing enough
- use restraint
- be aware of how and when you communicate
- as a manager, I’m fine with people sending me messages any time, but i won’t answer it
- stop working in the evening
- this is important!
- especially if you’re europe, working with US people
- they’re actively working away
- hardly anything is truly urgent
- “Durch einfach liegen lassen erledigt”
- (ed’s translation: “finished by simply leaving it be”)
- use timezone spread
- remember heartbleed? shell shock? people started remediation, then handed over to next timezone
- @webdevbev - front end developer - oxford computer consultants
- I haven’t had an intern but I’ve had work experience students,
and I’ve been an intern myself 3 times
- 2015: graduated (english & german literature)
- codefirst:girls internship
- zooniverse internship
- oxford computer consultants internship
- turning permanent at oxford computer consultants at the end
- we talk a lot about diversifying our industry
- this is a really broad area, and women are just one part of that
- only ~15% of compsci grads are female
- if we want to do better, we can’t just hire compsci grads
- when i was at codefirst:girls, i was told there were four
options:
- bootcamp
- paid bootcamp like makers academy
- i couldn’t afford this
- paid bootcamp like makers academy
- graduate schemes
- often require a STEM degree
- apprenticeships
- most of these requre you don’t have a degree
- paid internship
- this was the only option open for me
- bootcamp
- lots of people i met were in my position: not quite ready for a
junior position. but how do they get there?
- i curated the newsletter for codefirst:girls for 7 months
- we only had one internship come through to us
- this newsletter goes to 4000 people!
- what is an internship?
- on-the-job training within a team
- paid, beginner-suitable opportunities
- open to anybody regardless of background
- duration
- I recommend 6 months
- I did 3 months
- it takes 1 month to settle in
- then you’ve only got 2 months left
- you need to start finding another job
- applying for jobs but not knowing how to do the tech tests
- salary
- at least a living wage
- you are working. you are adding value
- Oxford is at least as expensive to live in than London
- you need more than national minimum wage
- you shouldn’t be too stressed about money
- at least a living wage
- there is a legal meaning to an internship (link at end)
- structure
- support
- this is really important to people who are switching careers
- i gave up a proper contract to do an internship in a new city
- it was a hell of a gamble!
- be clear to your intern about what support you will give them
- this is really important to people who are switching careers
- interacting with an intern
- be nice in interviews!
- if you stress someone in an interview, all you learn is how they deal with stress and not the other parts of them
- it’s important to tell them what they can learn
- they may not have a compsci background
- include them in team meetings
- often they come from other career paths
- they have lots of skills
- skills you may not have!
- eg: during my degree I did some samaritans volunteering and ran active listening workshops
- i run codebar oxford
- i teach underrepresented people in tech
- i meet all these people who want to get started and ask me how to do it
- and I don’t know what to say to them
- move to london? leave your family behind? do a bootcamp?
- these are really hard for lots of these people
- especially mums
- links
- @jqiu25 - senior software engineer - spring
- spring - a fashion ecommerce marketplace
- i lead the catalog team
- i spend a lot of time thinking about things like how data gets ingested into our system
- i have spent more times than i care to admit sitting at a SQL prompt wondering how to inject data into production
- we know it’s not good practice but we do it anyway
- why?
- internal tools are not available
- edge cases exist
- time-sensitive changes are needed
- often, the SQL prompt is the fastest, easiest solution
- example:
UPDATE products
SET name='julies-product'
WHERE id=1
- I’m writing this query and often I’d get someone to check it over
my shoulder
- but: say it’s friday night and everyone else has gone home
- and someone is telling me we promised it by monday
- noone available for review
- “what’s the worst thing that could happen?”
- I run the query
- grab some water
- tell marketing i did it
- then look at my laptop
- and realise this is what I actually ran:
UPDATE products
SET name='julies-product'
😱🤯
in order of up-front effort, and benefits received:
- how it works
- we started storing SQL queries in a google spreadsheet
- checklist of what needs to be done
- add a record to the spreadsheet
- name, date, reviewer
- reviewer approves
- run the query
- inside a transaction!
- if you make a mistake halfway through, it’s easy to roll back
- add a record to the spreadsheet
- what’s great
- easy to implement
- just start a spreadsheet and send an email
- audit trail
- promotes right behaviours
- easy to implement
- what’s not so great
- easy to make mistakes
- audit trail is at will - room for error
- difficult to run long and complex logic
What if marketing wanted something more like this?
UPDATE products
SET name='julies-product'
FROM brands
WHERE brands.name='julies-store'
AND ...
- how it works
- write a script
- i do it in python
- i add an argument parser so it’s reusable
- connect to remote database
- run the script
- i like my scripts to have a
--dry-run
flag
- i like my scripts to have a
- write a script
- what’s great
- reusable
- easy to manipulate outputs
- access to common code from your repos
- reuse logic you’ve already written before
- what’s not so great
- easy to make mistakes
- no code review
- outputs are only available on user’s machine
- and they go away when you exit terminal
- network disconnections
- easy to make mistakes
How do we go about running really long scripts?
UPDATE products
SET name='julies-product-1'
WHERE id=1
UPDATE products
SET name='julies-product-2'
WHERE id=2
UPDATE products
SET name='julies-product-3'
WHERE id=3
...
- I used to do this by coming into work really early
- but even after all day it was only 25% done
- what if we had a computer to run scripts that was on all the time?
- how it works
- write a script
- get the script onto the server
- deploy?
- upload?
- compile first?
- scp?
- ssh and run inside a session
until one day:
- “heyyy jenkins is maybe down? returning 504s on browser, can’t ssh in”
- i suddenly realised that the script i was running on it was
using all the CPU and none of the engineers could deploy
anything
- oops
- fix: reboot the instance
lesson learned.
- what’s great
- ability to run long-running scripts
- reliable network connectivity
- no new infrastructure
- what’s not so great
- scripts can affect resources on your server
- cpu, memory
- not user friendly
- manual copying
- ssh
- start session
- all just to run a SQL query
- no persistent audit trail
- only the engineer that started it has access
- scripts can affect resources on your server
- how it works
- dedicated jenkins job
- jenkins job page gives free UI
- recipe
- write script
- code review
- input arguments to jenkins job and build
- what’s great
- persistent audit logs from jenkins itself
- good for tracing what happened to scripts
- code review and automated tests
- UI
- minimised room for error
- we’ve come a long way here!
- persistent audit logs from jenkins itself
- what’s not so great
- hard to manage credentials
- this was the main driver for us to look into better solutions
- we found a dev was still just scping scripts to the server
- it was because his script had >30 creds to manager
- environments not clearly separated
- inputs not verified
- hard to manage credentials
we have all these problems: configuration management, logging, separating concerns. haven’t we solved these before?
- how it works
- a new service, architected like the rest of our pipeline applications
- single UI
- different script runner service in each environment
- recipe
- write script
- code review and run tests
- choose environment and run
- what’s great
- centralized configuration management
- separation of environments
- user friendly interface - by far the friendliest
- we can do more!
- parallelize and scale our instances
- preview results
- up to you to customize!
raw sql | local scripts | existing server | task runner | script runner | |
---|---|---|---|---|---|
data editing | ✓ | ✓ | ✓ | ✓ | ✓ |
complex logic | ✓ | ✓ | ✓ | ✓ | |
long scripts | ✓ | ✓ | ✓ | ||
testing | ✓ | ✓ | |||
code review | ✓ | ✓ | |||
audit trail | ✓ | ✓ | |||
user interface | ✓ | ✓ | |||
separate environment | ✓ | ||||
centralize configs | ✓ | ||||
…and more! | ✓ |
- make something usable
- don’t just think about safety, think about speed and usability
- that’s why we’re getting behind the SQL prompt in the first place
- invest the effort - it’s worth the cost
- @meckington - technical manager - futurelearn
- “where do you see yourself in 5 years time?”
- i always used to dread this question
- i felt bad because i felt i “should” have an answer
- rather than just making it up on the fly like i always did
- it felt like there was this expectation that someone already
has come up with this grand goal
- things like SMART or GROW are about reaching those goals which are already defined
- what if someone has no idea?
- thing I started doing with people i manage: explicit goal-setting
workshops
- generate as many ideas as possible
- broad rather than deep
- then, later, select which are most important
- generate as many ideas as possible
- format depends on person
- one catchup or several
- send questions beforehand
- leave it up to each person how much prep they do
- some are happy to get these questions thrown at them
- others want time to reflect beforehand
- provide enough time & space to reflect
- four areas & types of questions i ask:
- values (intrinsic/ideal)
- future (extrinsic/ideal)
- current role (extrinsic/now)
- current skills (intrinsic/now)
- in this order, because the answers to the early phases can
influence answers to later phases
- eg if they say “i value doing things efficiently” you can ask “do you get to do things efficiently in your current role?”
- ask questions to get someone to reflect and think about who they
are and how they do things:
- what are the building blocks that make up you?
- how would you describe yourself in 5 words?
- what is your purpose? your passion? your motivation?
- where do you get your energy from?
- personality tests & quizzes as conversation starters
- what do you want in your future?
- think about long-term goals
- ask questions to get people thinking about what their ideal life
and career would be:
- imagine you’re retiring and looking back at your life: what do
you want to have achieved?
- (this is easier to answer than “where do you find yourself in 5 years?”)
- what does work-life balance look life for you?
- what does your ideal day look like?
- imagine you’re retiring and looking back at your life: what do
you want to have achieved?
- extra: come up with anti-goals
- what don’t you want to happen?
- I never want to be bored
- i never want to work overtime
- how have last few weeks/months been?
- ask questions to reflect on current role and company
- what are the challenges of your role?
- which of your abilities, interests and/or values are you able to do in your role? which would you like to do more of?
- what would you miss if you left your role? why?
- what kinds of people do you most enjoy working with? what work environments
- what do you do better than others? what do others see as your strengths?
- are there any gaps in your knowledge or experiences?
- what technical/communication/leadership skills can you develop?
- people might be drawn to one particular area, or two
- the purpose isn’t to have something in all 4 areas
- this is just to get people to reflect and to lead them down that rabbit hole
- if you don’t help people set goals, you end up with the human
equivalent of tech debt
- you wake up one day and don’t really like the person you’ve become
- “which way you want to go depends on where you want to get to…”
- @froots101 - front-end coach & consultant - tinned fruit
- based in edinburgh
- I’m a consultant. i aim to help web product teams take their UI engineering to the next level
- i’ve seen a common pattern
- controversial premise: single page apps damage businesses
- yes, this is a clickbait title, no it’s not all SPAs
- google maps - one of the first if not the first
- big team, lots of investment
- application-like experience
- dynamically change bits of page in-place
- APIs to get data
- client-side routing and history
- static asset bundling
- in reality, a lot of SPAs are much more mundane
- they are CRUD - Create Read Update Destroy
- easy to make!
- if you’ve ever picked up react beginner tutorial you can make a todo list quickly
- but it’s hard to make good
- extremely hard to make good, simple, fast
- ⚠ WARNING anecdotes ahead
- it can feel like you’re adding a lot of value quickly in the beginning
- but there’s this mid-stage where it starts to get really hard
and feels like a traditional app might have been better
- you have to push through this to get to the great UX
- lots of teams never really fulfil that vision
- as developers we naturally blame the tools
- react, vue, ember, …
- hype cycle
- currently vue is the new shiny to react
- “this time it’ll be different”
- in extreme cases:
- backbone -> angular -> react -> vue
- this is bad for business
- reinventing user value again and again
- I’ve done this myself!
- how do we break this cycle?
- frameworks don’t make apps, teams make apps
- things to think about before big tech changes
- is there a product vision?
- are you all aligned on it?
- does the team have good comms and psychological safety?
- skills and capabilities?
- dev practices
- what the damned thing actually does
- a rewrite encourages forgetting
- a rework requires learning
- it’s harder but in the long term much more valuable
- reworking a SPA is really quite hard
- we’ve been quite monolithic about them
- only recently have we been looking into ways of breaking them up
- smaller apps make it easier to find and eliminate waste
- what’s the simplest way to sustainably add and maintain user value?
- learn how to live together with your product
- @kevingoldsmith - VPE - AstrumU
- this is not a talk about agile
- before agile, the way we talked about software came from industrial manufacturing processes
- agile brought us much more people-focussed techniques
- i’ve developed a bunch of different strategies and frameworks that are inspired by agile
- scenario: first 1:1 with someone
- someone joins your team, or you move team, or whatever
- if someone’s remote, i like to do first two 1:1s in person
- personalise a joint working agreement
- chance for you to talk about how you approach management
- chance to discuss what the responsibilities of the role are as you both see them
- two columns of post-it notes
- expectations on lead and on report
- one expectation per post it
- 10-15 minutes or until you can’t think of any more
- take turns
- pick up a post it, discuss what it means to you together
- does this make sense?
- do we agree? do we disagree?
- example: “i expect you to be on time to all team meetings”
- “but on wednesday i do the school run so i’m going to miss standups”
- take a photo
- refer to it in later 1:1s
- revisit periodically
- see how these expectations change
- you both get better at your jobs
- you both have more expectations on each other
- how do you go about this?
- what are the responsibilities of a lead at our company?
- brainstorm this
- each person writes down all the responsibilities of a lead (one per post it)
- spend 10-15 minutes or until you can’t think of any more
- four columns
- Pat’s responsibility
- Pat approves
- it’s a responsibility of mine that i’m going to assign to you
- i want you to make a plan around this and i want to say yes or no to it
- Ashley informs
- i’m going to give these responsibilities to you, you just do them
- but i want you to tell me when you’ve done it
- Ashley’s responsibility
- this is now just your responsibility and i don’t need to hear any more from you
- take each post it
- what does it mean?
- are you ready to take this on?
- eg hiring
- capture the output
- refer back to it
- revisit every 6 months
- see things move across the board
- “wait a minute, I’m just giving someone else my job”
- that gives you a chance to expand your skills
- thanks to esther derby for the format
- i got into senior management because i was so good at seeing the details
- but my team grew beyond my abilities
- she showed me this format to help me delegate
- “is it okay if we skip 1:1 this week? there’s some things that need to be delivered”
- “everything’s fine, we don’t need to do it”
- then you force it on week 3
- and they just sit there and say “everything’s good”
- you can get stuck here
- take a walk
- guarantees the 1:1 will last a while
- talk about the match, talk about TV
- work is a shared experience you both have, you’ll slide into work as a subject naturally
- toys!
- something else to focus on
- you’re not just staring at each other
- i have a whole series of these things on my instagram
- shut up!
- wait them out
- people don’t like silence, so they’ll fill it
- give them a chance to choose their words and form their thoughts
- “how’s it going?”
- “good”
- …
- i couldn’t handle the silence
- so i just talked the whole time
- next week i resolved not to say anything
- “how’s it going?”
- “good”
- …
- …
- …
- …
- …
- …
- …
- …
- we sat there for what seemed like 2 hours
- it was maybe 45 seconds
- he said “i’ve been thinking”
- and he started to talk!
- i had been robbing him of the opportunity to gather his thoughts
- polling - i want your opinion, but i’m the one making the
decision
- give people the freedom to express their opinion but it’s consequence-free
- you are accountable, not them
- people have imposter syndrome
- if you’re not sure if you “should” be part of the group you’re much more likely to hold back
- take temperature on something
- voting - we’re making the decision together and i will support
the group’s decision
- you absolutely must support and defend that position no matter how much you disagree
- if your team votes to implement layer 7 routing, you need to
defend it to your boss
- not: we voted and the team said to
- you’re throwing them under the bus
- be very clear which you are doing
- tell people before they give their opinion
- fist of five
- fist: i hate this
- 5 fingers: i love it
- good for polling or seeing how close the team is to consensus
- roman voting
- count to three, everyone does thumbs up or down
- not allowed to be in the middle
- count to three, everyone does thumbs up or down
- i thought agendas were too corporate
- shared agenda
- shared document to capture the agenda and the minutes
- get agenda items at least 12 hours before meeting
- the morning of the meeting
- i groom
- you wanted 15 minutes for this, we don’t have time, i’ll give you 10
- a facilitator (you or someone else) runs the agenda
- person who added the item leads the discussion
- good for team of 7-10 people
- bigger teams: lean coffee
- shut up!
- positional authority encourages people to conform to your opinion
- set expectations
- be clear on desired outcomes
- observer role
- role: watch (not participate)
- people interrupting each other
- people repeating ideas without giving credit
- certain people speaking too much
- exclusionary language
- passive or active
- passive: takes notes
- at 4.35, pat was talking and ashley interrupted
- at 4.40, pat said an idea
- end of meeting: reads back
- active: when they see it they say it
- passive: takes notes
- rotate roles
- note-taker
- facilitator
- observer
- frees you from having to participate
- publish the agenda
- lets everyone prepare mentally and emotionally for the meeting
- remember your role power
- you set the tone and conduct for your team based on your actions and how you react to others
- there is the loneliness of leadership
- one thing I’ve seen with good leaders is they may be good at
not interrupting, not stealing ideas
- but they don’t call other people out
- we have to say “we don’t do that”
- it’s hard! you don’t want to not be liked. you don’t want to have a difficult conversation
- @evnsio - platform team lead, monzo
- note that this bit is very tailored to what I found useful and relevant, so it skips over a lot of detail
- thanos isn’t just a persistent storage engine, it can also be
used as a query layer to load balance requests across multiple
prometheis (for resilience)
- deploy thanos as a sidecar to prometheus
- expose ports for both prometheus direct and thanos
- (this is easier in kubernetes than in ECS)
- comcast’s trickster is a query optimization layer which does promql-aware caching: eg it caches datapoints and transforms requests for new data into deltas
- service discovery for prometheus in k8s
- k8s service manifest
- cluster IPs
- each pod (task) has its own IP - separate from the host IP
- IPs are ephemeral
- service: stable DNS name to talk to that thing
- config files: configmap
- developers using prometheus locally
- still a work in progress