All blogs / Software / engineering practice
Chelsea Troy
Software / engineering practiceEngineering management / careersAI / MLTesting / QA
- Posts
- 444 from 21 Jun 2014 to 29 Sep 2025
- Posting
- now and then
- Kind
- personal blog
- Feed
- https://chelseatroy.com/feed/
2025 4
- CS for a Nation: A conversation with Simon Peyton Jones about computer science education
- What can we expect of LLMs as Software Engineers?
- How to survive the apocalypse: a conversation with Tim O’Reilly about Generative AI
- The Homework is the Cheat Code: GenAI Policy in my Computer Science Graduate Classroom
2024 8
- What layoffs teach us about technical leadership
- How to flub (and not flub) group decision-making on technical teams
- Decision-Making Pitfalls for Technical Leaders
- Does AI benefit the world?
- The Programmers’ Identity Crisis: how do we use our powers for ‘good’?
- How do we build the future with AI?
- How does AI impact my job as a programmer?
- How do we evaluate people for their technical leadership?
2023 9
- What do we do with the Twitter-shaped hole in the internet?
- What do conference talks mean for you and your project?
- Building Online Workshops: An AMA
- Building an Independent Teaching Practice
- What’s the point of tech conferences?
- How do tech companies make money?
- Money doesn’t buy class…privilege
- Testing: A Heuristic Hunting Conversation with Rebecca Wirfs-Brock
- On Code Coverage Tools
2022 16
- On the Psychology of “Tech Money”
- Spotting Misinformation in “Studies Have Shown”
- What it Takes to Make a Language “Object-Oriented” (or at least object-literate)
- What should we be asking about machine learning studies?
- How I do (and don’t) prepare a talk for a tech conference
- On Boundaries: When You Have to Say “No,” Professionally
- Outsmarting Zinger Fever on the Internet
- “Best Practice” is not a reason to do something
- Coffee and Me: A Seven Year Love Affair
- Python’s Sneaky Default Argument Behavior and What to Do About It
- On offering help that’s actually helpful
- Why Compilers Don’t Autocorrect “Obvious” Parse Errors
- Implementing a Shortest Path Program from Scratch
- Adding Error Productions to the Lox Compiler
- How to Authenticate for a Dual Platform Mobile Deployment on an Existing App
- Emulating Objects in Functionally-Oriented Languages (The Real Midwives of Haskell)
2021 49
- The Hard Thing About Nested Scopes: Tracking State in an Interpreter
- Notes and Illustrations: Grokking Machine Learning
- Introduction to the Roc Compiler
- An Applied Programming Instructor Commentates an Algorithms Class, Pt. 2
- CodeSync Fireside Chat: Escalating Technical Risk
- RubyConf 2021: What did participants say in the Tackling Technical Debt workshop?
- Compilers 5: Code Generation
- A Rubric for Evaluating Team Members’ Contributions to a Maintainable Code Base
- Notes from the Second Half of Andrew Ng’s Machine Learning Yearning
- An Applied Programming Instructor Commentates an Algorithms Class, Pt. 1
- YOW! Keynote: What Counts as a Programming Language?
- Critique, The Internet, and You
- Compilers 4: Exploring a Parser
- The Art of Documentation
- Talk at Blue Team Con: Analyzing Application Risk
- Compilers 3: Let’s Debug an Interpreter Together!
- The Oxymoron of “Data-Driven Innovation”
- Compilers 2: Compiling Backwards
- Building a Career and Teaching a Skill: Podcast Interview with Elixir Wizards
- Compilers 1: Anatomy of a Machine
- The Siren Song of the ‘User’ Model
- Interview on “Teaching with Aisha” about designing a course
- What Pride Means to Me in Practice
- Implementing Function Declaration and Invocation in a Programming Language
- Understanding and Using “Instructional Code”
- How to Implement Variable Assignment in a Programming Language
- Handling Errors with Grace (and sometimes without it)
- For real though, what is the Visitor Pattern and why do I care?
- Designing Assignments for Programming Classes
- Learning from Academic “Open Courses” Online
- Detecting Trouble Spots in Programming Homework Assignments
- Largest Simultaneous Software Risk Analysis Ever Done?
- What Counts as a Programming Language: Recorded Q&A
- Quantitative Programming Knife Skills, Part 2
- Should I use functional or object-oriented programming?
- Technology and Psychology of Refactoring: Recorded Q&A
- Data Safety: The “Knife Skills” of Quantitative Programming
- Functional vs. OO: The Debate that Imprecise Language Destroyed
- Improving Your API Design Skills with Open Source Examples
- Why Learn Python?
- What Can Technologists Learn from Dr. Martin Luther King, Jr.?
- Reducing Technical Debt
- Avoiding Technical Debt
- Solving Logic Problems with Python Decorators
- Quantifying Technical Debt
- Live Stream Director’s Cut: Extracting a Service Superclass
- Not your Daddy’s Intro to Version Control with Git
- Elevators in Python are harder than they sound (Part 2)
- Live Stream Director’s Cut: Parent and Child View Controllers
2020 96
- Elevators in Python are harder than they sound (Part 1)
- Reader’s Guide: Natural Language Processing with PyTorch
- How to Be a 10x Developer
- Another Announcement
- RubyConf Workshop: Analyzing Risk in a Software System
- Inheritance in Python
- The dangers of the exclusive “or”
- Live Stream Director’s Cut: A Collection Onscreen
- Why use (or not use) interfaces in Python?
- Debugging: Podcast Interview with Ruby Rogues
- What counts as a programming language?
- Interview on Greater than Code
- How do Python objects do stuff?
- Live Stream Director’s Cut: Extracting Custom Views
- Clean Structural Verification with Alloy
- Collaborating with Students on Code Assignments
- Structural Verification: Catching Data Model Clusterfumbles Before They Happen
- Does Daddy Know Best?
- Live Stream Director’s Cut: Pretty Designs and Functional Menus
- Techtivism 3: Biding Time, Boycotts, and Beyond
- Raft 14: The Grand Finale About the Barking Spider Circus
- Designing a Course 9: Iterating on the Course
- Raft 13: Configuration Changes
- Advanced Debugging with XCode and LLDB, Part 3
- Raft 12: Maintenance Repairs
- Data Persistence on Android with GreenDAO
- Raft 11: Leader Elections, Part 2
- Only One Right Way
- Raft 10: Leader Elections, Part 1
- A Conversation About Tech Jobs, Mobile Development, and Blogging
- Worship of the Written Word
- Raft 9: Log Replication, Part 3
- Techtivism 2: The Four Levers
- Designing a Course 8: Use of Surveys
- Live Stream Director’s Cut: Adding Interactivity
- Raft 8: Log Replication, Part 2
- Designing a Course 7: Planning Collaborative Activities
- Code Reviewer Briefing for Zooniverse Mobile Application
- Live Stream Director’s Cut: From Views to Code
- Mobile Software Development: About this Class
- Quantity over Quality
- Raft 7: Log Replication, Part 1
- Clean Surveys in Android
- Appearance on Podcast: “Conversations in Software Development”
- Designing a Course 6: Dividing Students into Groups
- The Scottish Gaelic Tattoo App: A Case Study in iOS Autolayout and Constraints
- How to Jump-Start Learning a New Programming Language
- The Role of Empathy in Mobile Apps for Care Management
- What We Lose When We Get Defensive
- Uploading Metadata: A Case Study in Adjusting Undocumented Behavior on Legacy Code Bases
- Anti-Racist Pedagogy in a Graduate Computer Science Class
- Designing a Course 5: Why Use Group Work?
- Advanced Debugging with XCode and LLDB, Part 2
- Haste Makes Waste
- Lessons from Space: Edge Free Programming
- So you have to do a layoff.
- Signing In: A Case Study for Android
- Designing a Course 4: Teaching Methods for Remoteness
- Question: How does git detect renames?
- Lessons From Space: Debugging Plants
- Transcript – Debugging: Techniques for Uncertain Times
- Designing a Course 3: What will we do in a session?
- Q&A: How can I mentor marginalized colleagues?
- Talking about Feedback on the CTO Connection Podcast
- Swift Question: Dictionaries with Keys of Arbitrary Type
- Designing a Course 2: How will the sessions go?
- Advanced Debugging with XCode and LLDB, Part 1
- Lessons from Space: Roadmaps
- Lessons from Space: Requirement Gathering
- A Technical Tour of the NASA Landsat Data Processing Pipeline
- Lessons from Space: Avoiding Catastrophe
- Lessons From Space: Pre-Launch Testing
- Lessons from Space: Who’s Who, and Why it Matters
- Lessons from Space: Why Delay a Launch?
- Designing a Course 1: What will students learn?
- Perfect is the Enemy of…Even Marginally Adequate
- Raft 6: Terms and Leadership
- Advance Your Tech Career: Networking
- One-Page Notes: The Command Line
- Live Coding: Authenticating an Imagery Request
- The Price of Whiteness in Tech: Introduction
- Adventures in Process Design: A Case Study on Automated Classification, Pt. 1
- Learning Circles: What I Have Learned
- The Case of the Failing Upload, Part 2
- The Case of the Failing Upload, Pt. 1
- Raft 5: Taking Stock
- Sharing Context on Slack (or similar)
- Pairing After Hours with Avdi and JessiTRON
- Raft 4: Bare Minimum Log Replication
- PoSD 4: Don’t knock things you haven’t tried
- A Framework for Debugging
- Raft 3: Threads, Processes, and State Machines
- Storing Context in Commit Messages
- PoSD 3: Debugging Tactics
- Raft 2: Setting Up Socket Servers
- Boundaries 2: Assisted Processing
2019 69
- PoSD 2: What causes insidious bugs?
- The Raft Algorithm: What, Why, and How
- Reviewing Pull Requests
- Philosophy of Software Design: Pt. 1
- Submitting Pull Requests
- Boundaries
- SICP 7: Nondeterministic Programming
- Listening 7: Deliberate Appreciation
- SICP 6: Metalinguistic Abstraction
- On Becoming a Presence in the Software Community
- SICP 5: Modularity, Objects, and State
- Listening 6: Deliberate Inquisition
- SICP 4: Objects, Functions, and Change
- Live Coding: Ship It!
- Listening, 5: Optimizing for Impact
- SICP 3: Representing Data Structures
- Listening, 4: No One Listens
- Building a Parser
- Listening, 3: Optimizing for Learning
- SICP 2: State and Modularity
- Hosting a Conference
- SICP, Introduction: On Learning the Abstract
- Listening, 2: A Penny (foregone) for Your Thoughts
- Techtivism 1: Eyes on the Mountain
- Building a Scanner
- Listening, Part 1: Introduction
- Drawings of How Compilers Work
- Planning an Engaging Conference Program
- On Writing Informative Programming Texts
- On Building an Inclusive Tech Conference
- Live Coding: The Abstraction Gradient
- 20 Minute Talk: Giving and Receiving Feedback
- Iterating on a Speech/Talk
- Live Coding: Exploring an API
- Crafting and Outlining a Speech/Talk
- Live Coding: Reactive Themes for React Native Components
- Would you like to watch me code? Now you can.
- Identifying a Speaking Niche
- Resources for Programming Instructors
- 20 Minute Talk: Leveling Up as a Technologist
- Planning (and surviving) a 3 Hour Lecture
- A Podcast on Leveling Up, Machine Learning, and Inclusion
- Learning to Teach a Programming Course
- An Announcement
- Reducing Job Interview Anxiety, Part 3: Interviewing with the Right Companies
- Time and Space Efficiency, an Applied Example: Part 3
- Reducing Job Interview Anxiety, Part 2: Establishing Success Metrics
- Time and Space Efficiency, An Applied Example: Part 2
- Reducing Job Interview Anxiety, Part 1: Increasing Touch Points
- Time and Space Efficiency: An Applied Example, Part 1
- Transcript from Lecture: Giving and Receiving Feedback
- Thanks, Mom: A Personal “Ask Me Anything” (AMA)
- Transcript from Keynote: Leveling Up
- Applied Data Science Case Study, Part 6: Error Analysis
- Applied Data Science Case Study, Part 5: Fitting Models
- Modifying Authentication Behavior in Devise
- Behind the Scenes: Ruby By the Bay Civic Hack
- Leveling Up, 20th Post Corollary: Mentors and Sponsors
- Applied Data Science Case Study, Part 4: Performant Processing
- PearConf Keynote – The Technology and Psychology of Refactoring
- Leveling Up Skill #19: Getting Mentors
- Applied Data Science Case Study, Part 3: Exploratory Analysis
- Applied Data Science Case Study, Part 2: Assessing the Data
- Neural Style Transfer with Latte Art, Part 1: Layer Depth
- Leveling Up Skill #18: Who to Ask, How to Ask
- Applied Data Science Case Study, Part 1: Assessing Business Value
- Leveling Up Skill #17: Asking for Help
- A Framework for Feature Engineering, Part 3: Evaluating Features
- Leveling Up Skill #16: Operationalizing Feedback
2018 67
- Behind the Scenes: Planning a Lecture
- Risk-Oriented Testing (From RubyTapas Screencast)
- Leveling Up Skill #15: Receiving Feedback
- Behind the Scenes: Screencast with RubyTapas
- A Framework for Feature Engineering, Part 2: Shattering Classes
- Leveling Up Skill #14: Attracting Feedback
- A Framework for Feature Engineering, Part 1: Intuition
- Behind the Scenes: Syllabus Design
- Code Mechanic: Numpy Vectorization
- Leveling Up Skill #13: Framing Feedback
- Leveling Up Skill #12: Identifying Safe Opportunities for Feedback
- Leveling Up Skill #11: Evaluating Whether to Give Feedback
- Behind the Scenes: Podcast Interview with Greater Than Code
- Hiring for Fit
- Code Mechanic: The Scipy CSR Sparse Matrix
- Leveling Up Skill #10: Reflecting on Mistakes
- Git Commit Messages: Options and Approaches
- Adventures in Process Design: A Case Study on Data Import
- Leveling Up Skill #9: High-Level Reflection
- Design Patterns for Data Science, Part 2: Paper vs. Ceramic
- Design Patterns for Data Science, Part 1: Python Files and Notebooks
- Build Graceful Processes: An Approach to App Design
- Proxy Models in Django: An Example and a Use Case
- Level Up Skill #8: Active Reading
- API Design, Part 3: GraphQL and the Future
- API Design, Part 2: The Arrival of REST
- Leveling Up Skill #7: Approaching Academic Papers
- API Design, Part 1: Before There Was REST
- Seniority Means Saying No
- Leveling Up Skill #6: Commit Tracing
- Leveling Up Skill #5: Warm-Up Reading
- Leveling Up Skill #4: Warm-Up Activities
- Streamlining your Automated Test Strategy with Risk Maps
- Leveling Up Skill #3: Tracking our Progress with Accountability Calendars
- Leveling Up Skill #2: Removing Reliance on Motivation
- Can we rethink imposter syndrome?
- A Rubric for Evaluating Team Members’ Contributions to an Inclusive Culture
- Leveling Up Skill #1: Setting Goals
- Questions for Prospective Managers
- Progress Report on Error Analysis Visualizations: Classification Added!
- What growing your tech team means for your app
- Designing Code for Testing: An Example Implemented in Python
- Leveling Up: A Guide for Programmers
- But what if I can’t tap my remote employee on the shoulder?
- Why Your Efforts to Fix your Pipeline Aren’t Fixing Your Pipeline
- Analyzing Relationships Between ESG Data and Stock Performance
- Performance Optimization: An Example Implemented in Ruby
- How do we make remote meetings not suck?
- One Page Notes: Statistics Done Wrong, Part 2
- Why do remote meetings suck so much?
- One Page Notes: Statistics Done Wrong, Part 1
- Why are there always technical problems in remote meetings?
- Don’t people slack off when they work remotely?
- Analyzing Relationships Between ESG Data and Stock Performance, Part 3
- If remote work is so awesome, why does it make my job as a leader harder?
- How to Socialize Big Changes at Work, Part 3: Timing
- Data Visualization in Python: A Project-First Approach
- How to Socialize Big Changes at Work, Part 2: Scale Up Your Effort
- Why do large companies keep abandoning remote work?
- How to Socialize Big Changes at Work, Part 1: Start at the Grassroots Level
- Analyzing Relationships Between ESG Data and Stock Performance, Part 2
- Contributing to Open Source
- Natural Language Processing: A Project-First Approach
- Analyzing Relationships between ESG Data and Stock Performance, Part 1
- Book Review of Feminist Fight Club: An Office Survival Manual for a Sexist Workplace
- Managing Humans: Biting and Humorous Tales of a Software Engineering Manager
- One-Page Notes: Confident Ruby, by Avdi Grimm
2017 41
- Tips for Building on Graph Databases (Neo4j)
- Disrupting Management: A Fix for Tech Culture?
- Computer History Video of the Week: The Laptop
- Edge-Free Programming, by Michael Feathers
- The Bullshit Rule for Tech Managers
- Computer History Video of the Week: ENIAC
- Progress Report on Multivariate Linear Regression Visualizations
- Computer History Snippet of the Week: The IBM Selectric II
- Anger and Sadness in the Workplace
- Computer History Video of the Week: APL
- Computing History Video of the Week: The Qwerty Keyboard
- Puzzles: how a social experiment built coworking community
- The Numpy API: Resources, Idiosyncracies, Examples
- ‘Everybody Lies’ Review Part 2: Dangerous Methodology
- ‘Everybody Lies’ Review Part 1: Takeaways
- A Visual for High-Dimension Regression Data
- Advance Your Tech Career: What are stock options, and how do I use them?
- Building a Motion Detector to Learn OpenCV
- Tech Leadership: Fault vs. Responsibility
- “Smart” is Not a Hiring Criterion
- Takeaways: Machine Learning Yearning by Andrew Ng, Chapters 1-14
- Writing an Alexa App in 8 Hours
- The Seeds of a Great Company Culture
- How your Dudebros are Losing You Money: The Microcosmic Impact of Inclusion on your Bottom Line
- Dear Corporations: Read this before you sponsor Pride
- Advance Your Tech Career: A Guide to Evaluating Total Compensation
- But Isn’t Pair Programming Expensive?
- Advance Your Tech Career: Why make yourself replaceable, and how?
- Leading a Software Rewrite at Your Company
- Adding Members to Your Software Team
- Advanced Pair Programming: Learning From Your Pair
- Advanced Pair Programming: Enabling Your Pair
- Advanced Pair Programming: Pairing Remotely
- Test-Driven iOS: Testing Asynchronous Network Calls with FutureKit
- Do iterations make business sense?
- A Survival Guide for Women Working in Male-Dominated Companies
- Machine Learning Intuition: Understanding Taylor Series Approximation
- Machine Learning Intuition: Using Derivatives to Minimize the Cost Function
- Machine Learning Intuition: Cost Function Optimization
- Test-Driven iOS: Passing Information With Segues
- One-Page Notes: Weapons of Math Destruction, by Cathy O’Neil
2016 26
- Test-Driven iOS: Mocking Dependencies
- One-Page Notes: On Intelligence, by Hawkins and Blakeslee
- Test-Driven iOS: Using Segues
- Machine Learning: Using Regression Analysis to Detect Biases in Compensation
- Test-Driven iOS: Introduction to Feature Tests
- Test-Driven iOS: Dependency Injection
- Test-Driven iOS: Testing an App with Storyboard UI
- Machine Learning: Wine Recommender
- Diagramming Data, Part 3: Preventing and Curing Data Deficiencies
- Diversity, Inclusion, and Money.
- Diagramming Data, Part 2: Reversible and Irreversible Data Issues
- Diagramming Data, Part 1: Simple Code Depends on Nice Data
- Bias doesn’t start with skin color.
- Android How-To: Card Flip Animation in API 23
- Test-Driven Android: Testing Multiple Cursor Loaders for One Activity/Fragment
- When Not to Use Microservices
- Allyship in Times of Crisis
- Spring Batch with Java Config: An Example
- Spring Integration with Java Config: An Example from Spring Integration in Action
- Test-Driven iOS: Enabling Unit Testing with a Code-Only UI
- Material Design: An Experience Report by Andy Detskas
- If I had a quarter for every time I have seen this damn dagger error…
- Machine Learning, Part 2: Classification
- Professionalism
- Test-Driven Android: Tab Layouts
- Remote Pair Programming: Best Practices
2015 20
- Machine Learning, Part 1: Regression
- Test-Driven Android: When and How I Use Robolectric
- Test-Driven Android: Testing Context-Dependent Components with a Provider
- Test-Driven Android: Separating Dagger from Robolectric in Test Suites
- Staging Area for External Post Review
- Test-Driven Android: RecyclerViews
- On Decency
- SpringOne: The Bootiful Microservice as a Microcosm for a Larger Discussion of Spring
- SpringOne: Modern Java Component Design with Spring 4.2
- Test-Driven Android: Testing Layout Elements with Subclass and Override
- Android Programming for the More Curious: Diving into Concepts from the Big Nerd Ranch Guide
- Professional UX Design: An Experience Report
- What Software Teams Can Learn from Improv Comedy
- A Reading Companion to Steve Krug’s “Don’t Make Me Think”
- Set up an Android Project with Robolectric
- Choices in UI: A Goofus and Gallant Example
- “UI Design for Programmers” by Joel Spolsky
- Roles Don’t Matter, Skills Do: Balanced Team Summit, Grand Rapids
- “The Clean Coder” by Uncle Bob Martin
- The First Two Weeks at Pivotal Labs
2014 39
- Pairing with Coraline, Entry 3: Recommendations for “Spiking” and the Skeleton of a Ruby Project
- A Reading Companion to Caleb Doxsey’s Book on Golang
- Learning Java from TDD by Kent Beck
- Geekfest: Ray Hightower Dumps a Robot into Lake Michigan
- My Five Favorite Things About SASS (The CSS Extension Language)
- DCamp Code Retreat: Lessons Learned
- How to Make the Most of DCamp
- Hacking Chart.JS: A Crash Course in Down-and-Dirty Front End (Part 3)
- Chicago Ruby: VIM for Ruby
- Pairing with the Pros: A Day at Pivotal Labs
- Pairing with Coraline, Entry 2: Ternary Operators and a Healthy Dose of Scope
- Hacking Chart.js: A Crash Course in Down-and-Dirty Front End (Part 2)
- API Strategy and Practice Conference: Intro to APIs with Kin Lane and Kirsten Hunter
- Pairing with Coraline, Entry 1: Ruby Syntax, Level 2 Spells, and POROs
- A Contemplative Review: Extreme Programming Explained, by Kent Beck and Cynthia Andres
- Hacking Chart.js: A Crash Course in Down-and-Dirty Front End (Part 1)
- OpenGov Hack Night: Dan Platt and Craig Booth on Chicago Crime Stories
- Geekfest: Brian Kung—”What Dance Taught Me About Programming”
- Justin Love on SQRL (and the post-password authentication movement in general)
- Matt Polito on Why Cucumber is Still Relevant
- Dave Hoover on Developing Developers
- Jessica Kerr Talks TDD at Windy City Rails
- Chris Powers on Building Apps for Chromecast
- Dinshaw Gobhai on Speeding up Rails at Constant Contact
- Dr. Nic Williams on Orchestration
- Sean Griffin’s Functional Web Talk, Plus Further Reading
- Rubinius X: Everything you wish Ruby could do?
- Windy City Rails: Yan Pritzker on Domain Driven Rails
- Windy City Rails: Daliah Saper on Development and the Law
- Windy City Rails: Mark Menard on Upfront Design
- Windy City Rails: Lucas Mazza on Devise
- How Being an Athlete Prepared Me for Programming
- My First Ruby Gem!
- API Support for World-Changing Datasets
- Zero to Bit.ly (with analytics!) in 8 Hours
- It’s not magic.
- Why Break the Rules of Front-End Development?
- Drawing a Computer Program
- Coding the Fibonacci Sequence