I elaborate on Steel Threading – a technical software engineering approach that can effectively navigate ambiguity
- in building a new product or feature,
- and especially in collaboration within unfamiliar teams.
Context
In over 40 hackathons I’ve done, I’ve built a lot of stuff.
- From my context, often teaming with strangers I never met or worked with before
- And usually, as team lead – with technical and non-technical leadership
I tested and found applying Steel Threading to be the most effective in technical leadership in the context of a hackathon.
I learnt about it from working as a Data Scientist/Data Engineer/SWE, when a Staff Engineer in my team was advising me to try it out when I was implementing a new encryption service for our data pipeline.
Definition
Essentially, Steel Threading is:
- To as early as possible, build ONLY the basic components that would tie all separate layers of your product/feature together
- To integrate early as simple and basic as possible
- Imagine a Steel Thread piercing through your entire product tech stack and features,
- Or a slice that would link everything together.
- This slice can be a single simple use-case flow for the product, or even more fundamentally first – a slice purely for integration before that.
- Answers the question, “What is the least that needs to be built and done to link everything together end-to-end?”
- Can involve early deployment and I highly encourage it
- The simpler the Steel Thread is, to cut through the noise, nice-to-haves, and non-essentials – the better.
A great way to think about it is,
What are the things we need to do regardless of what features we build? What’s the MVP of the MVP?
Well, for a webapp, you would need some sort of frontend, backend, and deployment to a live site done anyway – why not do it now rather than later?
Your team's separate pieces of work needs to be integrate regardless!
- Rather than wait for the monster that is your codebase to grow large, complex and unruly.
- Why not tie it all together while it’s still small and manageable?
- Trying to integrate in the late game, can kill a team’s ability to meet the deadline.
- And even if successful, would cost a lot more resources – both in output, energy, time and in spirit.
When to use?
Shines especially when,
- New or unfamiliar team working together for the first time
- New product or feature
- Using new technology
- Adding new components to old codebase
- Ambiguity in product/use-cases/tech-stack
Less penalising to not use when,
- Familiar team with experience working together
- everyone knows what they need to do and who does what
- normally, people would find some Steel Threading occurring anyway from this
- Repeat of x from past work
Less relevant to use when,
- Changes for existing product/feature
Examples
Roughly speaking, here are examples:
Steel Threaded - sparks joy
To build a typical webapp,
- Draw basic design diagram (super high-level)
- Pick tech stack and assign scopes of work
- Basic setup
- Git repository made and shared, proper version control established
- Concurrently, each team member does a subset:
- Backend framework spun up - can boilerplate/template it
- Single basic API call defined in Backend for Frontend (zero or perhaps single simple use-case functionality)
- Frontend setup - zero design and can possibly support that single simple use-case
- Setup automated CI/CD with GitHub actions (pretty easy to do nowadays)
- Setup hosting
- Integrate immediately
- Frontend calls single Backend defined API successfully
- Test local build for success
- Test automated CI/CD
- Test hosting
- Get live site that looks terrible and does absolutely nothing (or that single use-case) 🔥
- Ensure
- everyone knows how to contribute and test
- individuals know their integration points between each other
Not Steel Threaded - does not spark joy
To build a typical webapp, BOLDED are some significant differences
- Draw entire design diagram (high-level + low-level components)
- Pick and optimise tech stack, and assign scopes of work
- Basic setup
- Git repository made and shared, proper version control established
- Isolated development, each team member focuses on their subset:
- Backend built until core functionality achieved. Go get external APIs
- All API calls defined in Backend for Frontend (core functionality)
- Frontend built fully with user inputs/outputs flow
- Frontend iterations - with design input from Designer
- Stay on local
- Integrate intermittently
- Frontend calls multiple Backend defined APIs and throughout the sprint
- Figure out how to contribute work and integrate
- Tweak design and architecture
- Realise it’s 2 hours to the deadline
- Rush
- Integrate and test late
- Test consolidated local build for success
- Setup CI/CD pipeline and test
- Setup and test hosting
- Maybe, get live site that looks good and does some things 😎
- Realise everyone is stressed 🫠
Steel Thread Benefits
-
End-to-end implicit testing:
- so if something breaks on the live site, you know its because of you and can fix early.
-
Immediate Feedback Pipeline:
- Your team has a literal live product immediately
- Changes are immediately reflected and that allows immediate feedback in development.
- e.g.
- Oh, that button looks weird with that menu
- Ah, the user login doesn’t work
- Plus, at an early point, you can launch it to a small group of users for early feedback!
- e.g.
- Ah, the user can generate profane images – we better guardrail that.
-
Modular: Every aspect is somewhat isolated/modular once Steel Thread is established
- allows any developer to establish their own small world of sanity
- that’s powerful - because you need to move fast and having agency and boundaries helps
-
Alignment:
- Without significant time investment, it makes it super easy to relate a design diagram and the codebase from the get-go
- Any changes can be easy made to the design diagram as work gets done and discovery occurs
- = Maintaining alignment consistently
-
Extendable:
- Within, not only are the modules freely changeable in that component of ownership.
- But also, at the ends of each module.
- So let’s say I wanted to improve the frontend
- I could add more features first in my own layer
- Then, because the Backend and I have established and tested that simple API route between us.
- We both know that track between the mountain shack to the city, and can make more tracks easily.
- I can relate that back to the Backend with confidence and technical conciseness.
- There is an implicit path already established to add a new feature into the codebase.
-
Confidence: and Happiness
- Every single person on the team knows that we have already made our path from the mountain shack, to the city, to the rural outback, and to Ayer’s rock.
- We know we won’t get lost.
- We know who is responsible for what and how to make more similar paths as needed.
- We know how to update the map (design diagram)
-
Scalable: in the sense of increasing complexity/systems as needed:
- E.g. user auth, payments, cloud, security…etc
- Easy to add rooms and windows to your home when the foundation and walls are already there.
- It provides focus on the core first – great for MVP’ing
-
Defined Boundaries: establishes where something ends, and where something begins
-
To avoid wastage of effort/duplication of work/integration complexity
-
When an engineering team starts building something
-
there is a process that occurs - to understand where and what people should be working on and responsible for
-
because, let’s say you have 2 frontend and 3 backend engineers - there will be some overlap
-
especially, if you have +1 AI engineer, ML engineer
-
especially, for a new team, that hasn’t worked together before
-
There is more uncertainty and unknowns
- That will kill a team if not managed well
-
Now, speed is the significant priority in startups or hackathons
-
There is no time to go through this slowly and figure things out
-
Resource limitations: do not take kindly to duplication of work and effort wastage.
-
You need to establish clear boundaries (which may/may not be followed perfectly 😉)
-
Due to that, you need to as quickly as possible - make the steel thread and reach alignment
-
More info
I wrote this article straight from my brain and current reflections on my experience. It’s a good challenge to draw from my understanding.
So for a different take on it,
Check out https://www.rubick.com/steel-threads/ which I referred to when learning about Steel Threading years ago.
I’d love any comments and feedback to get your take and improve my own understanding.