Learning to build useful, valuable software in a team
Alexander Bird
Vancouver BC, Canada
alex@alexanderbird.software
https://alexanderbird.software
Bio
— Strengths, values, and motivators
Hey, if you're here for content, head over to /blog.
Or, carry on for my slightly out of date resume 👇🏻.
Growing In
I'd like to be on a team where these practices and philosophies are established. I would like to work with some folks who have experience in these areas who will challenge me to grow in them.
Philosophies and Practices
Inspect and Adapt: the best team processes come from regularly taking time as a team to look back on how we've been working and come up with ideas for how we can work more effectively.
Lean Flow: improve effectiveness, speed, quality, and agility by reducing the amount of work in progress. In software, work in progress includes unreleased features, unimplemented designs, unbuilt product backlogs, feature branches, and research for unbuilt features.
Cohesive Teams: the apparent speed-up created by having folks work independently is generally outweighed by the communication overhead of independent work streams. Since the thinking and learning we do *is* the work, we should set up our teams to think and learn together (instead of doing our “work” in isolation and having set times to synchronize).
Plan to Adapt: it's not possible to design, estimate, or test our way to a zero-surprise system. Instead of attempting to eliminate the unexpected, embrace it. Design with an intent to learn; estimate with the expectation that scope changes; supplement traditional testing with product metrics that detect unexpected failure.
Customer-Involved Development: when we design, we incorporate feedback from real, specific customers. When we deliver, we let customers use it (instead of demoing it to customers)
Can Teach
I'd like to be on a team where these things are accepted as reasonable (even if the team isn't currently practicing them). I have experience teaching these things and am comfortable being the advocate for them on a team.
Philosophies and Practices
Example Driven Development (TDD, ATDD, and BDD): usually, the highest value code comes from authoring a single example of how it is used (in the form of an automated test) before authoring the code.
Domain Driven Design: for business-critical code, we can produce the highest quality (and most adaptable) code by developing a spoken language to discuss the system that all team members share, and we should structure our code to align with that spoken language.
Refactoring: since we can't predict the future, the code we wrote last year/month/week is not perfectly suited for the new things we're building. Rather than forcing new behaviour into a system which it doesn't fit, we ought to continuously update the structure of our code without changing the behavior so that it is easier to add new capabilities. This is aptly put by Kent Beck: "Make the change easy (this might be hard) then make the easy change".
Story Slicing by Customer Capability: instead of dividing our work by technical chunks, we identify small, customer-valuable slices of capabilities and deliver one of them (end to end) before working on the next slice of customer value. Only when there is truly no way to split customer slices smaller do we slice on technical boundaries.
Story Counting Instead of Numeric Estimates: when we discuss what's entailed in building the next slice, instead of generating a number representing the size of the story, rework the stories until they are all roughly the same size. If we learn there are many aspects to the story, we slice it into many stories. If we learn that there are many risks with the story, we slice off a time-boxed experiment instead of taking on the whole story. When we need to forecast, we count the remaining stories and compare that to the number of stories delivered per unit time in the recent past.
Experience
2021-presentSoftware Engineer (SDE 2)Amazon Web Services
2021Software Engineer, Acting Manager (SDE 2)Amazon Web Services
2020-2021Software Engineer (SDE 2)Amazon Web Services
2019Senior Software DeveloperShareworks by Morgan Stanley
2013 (4 months)Software Developer / Research AssistantSoftware Engineering Decision Support LabUniversity of Calgary
administrator customers
⇅public AWS API
existing service
existing service
⇅method call
⇅method call
new code (hexagonal architecture)
⇅message queue
new code and infrastructure (hexagonal architecture)
⇅API call
existing storage service (with modifications)
⇅public AWS API
consuming customers
Design & Lead High Scale Feature
Role:
Employer: Amazon Web Services
7 people
since January 2022
Software Development Engineer II
leading the team in adding a new system capability which allows customers to perform the work of 1000s of API calls through a single gesture (API / CloudFormation update / Console action)
apply distributed system design principals to integrate this 1000x scale with the existing system which is not designed for that scale
navigate tradeoffs between upgrading existing systems (to safely handle scale) and delivering in a timely manner. We are making some upgrades and leaving some systems unchanged.
apply hexagonal architecture to isolate the core business logic from the integration points (as we increase the scale later in the project, this architecture allows us to move the core logic from an existing service to a new service without rewriting or retesting core logic)
mentor, train, and guide the team so everyone can contribute to the design and coding
Leading Our Growing Team Through A Transition
Role:
Employer: Amazon Web Services
12 people
8 months
Acting Software Development Manager
mentoring and supporting 10+ engineers with weekly 1:1s
supporting onboarding of 4+ engineers
coaching several engineers who are mentoring interns for the first time
of the 4 summer interns, 3 returned to our team summer 2022
actively participating in most team code reviews
promoting technical practices like refactoring, domain driven design, and customer-centric design
spearheading the team's ramp-up on a neighboring system as our area of ownership doubled
⇅public AWS API
⇅HTTP via SDKs
Enhancing AWS Service Catalog
Role:
Employer: Amazon Web Services
9 people
15 months
Software Development Engineer II
redesign core data processing component of our system from procedural and error prone to highly scalable / retryable queue & lambda architecture
introduce pairing and mobbing to our team to accelerate knowledge/skill transfer and increase code quality
established contract testing on the team to
reduce time to add tests for a big feature from months to days
increase stability of tests in the build pipeline
increase the percentage of testing we can do through unit tests (reducing iteration time from minutes to seconds)
led the investigation and mitigation of several customer-impacting operational incidents while oncall
established User Story Mapping on the team to make our design activities more customer-centric.
⇅HTTP
Modifying a Legacy Application
Role:
Employer: Shareworks by Morgan Stanley
> 100 people
6 months
Sr. Developer
Mob and pair programming to add features to a legacy Java application
Familiarized myself with a new area of code each month (every team can be assigned to work on any area of the code)
Story-splitting and user story mapping
Refactored partially tested legacy code (safely) to make it easier to change
Demoed weekly to clients
Took initiative to improve shared automation and tooling
published a command line interface (with tab completion) to abstract, document, and improve common developer commands (people actually use it and submit PRs)
wrote a small Ruby on Rails tool to make test failure results easier to triage (still in trial/demo stage)
⇅HTTP
⇅HTTP
⇅various protocols
Well-site sensors
Real-Time Well Monitoring Dashboard
Role:
Employer: Arcurve Inc
Client:
Oilfield services
(publicly traded)
2 people
4 months
Tech Lead
Led Domain Driven Design style modelling session with team (incl. user researcher, UX, and PM) to clarify the problem statement and approach
Prototyped experimental data visualizations with Highcharts from provided mockups
Setup project build & test infrastructure (using Lerna to manage the monorepo; auto-generating the Angular SDK from the API Swagger doc)
Built inexpensive demo infrastructure so we can deploy before the upstream integration points (external team) are available
Conducted job interviews
CSS
JavaScript
AngularJS
⇅HTTP
Express
Node
Mongo DB
Axios
⇅HTTP
other services
Reverse Engineering
Role:
Employer: Arcurve Inc
Client:
Corporate minutebook management
(startup)
1 person
5 months
Tech Lead
Built an import utility for a proprietary data format: inferred the domain model/rules from the data, wrote a custom parser.
Integrated this component with our client's code
Provided extensive documentation and training so their development team was comfortable maintaining the import utility
Updated team processes to increase knowledge sharing and collaboration between team members
Identified a way to temporarily reuse legacy components in order to release sooner
Conducted job interviews
React
CSS
JavaScript
React Native
JavaScript
⇅HTTP
JavaScript
Cypher
Node
Neo4j
JavaScript
Node
Heroku
Architected for Reuse
Role:
Employer: Arcurve Inc
Client:
Professional certification auditing
(startup)
3 people
3 months
Developer
Architected and unit tested the application in a way that allowed us to salvage most of the
application when the client drastically changed their application after several months (new UI,
new data model)
Maintained respectful, constructive communication with our client in a challenging team
environment
Consumer JavaScript (3rd party)
TypeScript
Browser WebRTC API
Stanza.io (XMPP)
⇅WebRTC
⇅WebSocket
Selective Forwarding Unit
Signalling service (XMPP)
⇅various protocols
Browser
Desktop
Embedded
Browser WebRTC Protocol Deep Dive
Role:
Employer: Arcurve Inc
Client:
Video conferencing
(private corporation)
2 people
12 months
Developer
Integrated the emerging WebRTC protocol with our client's custom video
conferencing infrastructure via a proof-of-concept JavaScript library
Enabled video calling between a browser and multiple embedded and/or
desktop clients
Collaborated constructively and respectfully with my technical lead in
the face of many differences of opinion
CSS
HTML
Kendo UI
JavaScript
⇅HTTP
C#
.NET MVC
SQL
IIS
Microsoft SQL Server
Following Patterns; Accepting Feedback
Role:
Employer: Arcurve Inc
Client:
Land acquisition service provider
(private corporation)
2 people
4 months
Developer
Followed patterns set by previous developers
Collaborated through code reviews — receiving
(accepting, adopting) feedback, discussing my approach