My biggest take-aways were all conceptual...All the problems we have with things "breaking" and being generally not (automatically) repeatable come from us not takng the time to mitigate certain common risks:
Risk Aversion
- Automated Testing is acknowledgement that coding bugs can and will occur.
- Versioning is acknowledgement that shared files can and will be overwritten.
- Agile is acknowledgment that Requirements Gathering can and will fail.
- Continuous Integration is acknowledgment that deployments can and will break.
- TDD is (in a way) acknowledgement that refactoring will constantly occur.
- ...
If you don't take these risks into account in your process, the problems will all end up getting solved individually for each project (ugh) or worse -- swept under the rug until it's too late. The more common risks we can acknowledge and plan solutions for, the easier our jobs will be.