Coder Social home page Coder Social logo

refactoring-workshop's Introduction

Refactoring Code Smells

This is an interactive, remote-friendly workshop that teaches refactoring.

The overall flow of the workshop goes like this:

  • (10 minutes) Facilitator gives a presentation defining refactoring and code smells.
  • (15 minutes) Participants individually identify specific structural problems in a 70-line Ruby file, posting their observations in a chatroom.
  • (2 hours) Participants mob-program to fix one problem at a time, with the facilitator typing code and promoting discussion.
  • (30 minutes) The group debriefs with another presentation and time for questions and discussion.

Prerequisites and Limitations

  • You'll need a facilitator with strong refactoring skills.
  • You'll need some way of video conferencing and collecting participant suggestions in a chat log. I've used Zoom for this.
  • In theory, the workshop should scale up to many participants (dozens? hundreds?) but I have not tried it on large groups yet.
  • I recommend you use IntelliJ or RubyMine as your editor. You'll need a paid license, or the program will quit every 30 minutes. Other editors will work, but I haven't used one with better support for refactoring and tests than RubyMine.

Goals

The goal of this workshop is to practice removing code smells via small, targeted refactorings, using frequent test runs as a safety rail. The emphasis is on the practice of refactoring, i.e. safely and incrementally changing the design of code without changing its observable behavior.

A breakdown of the goals:

  • Persuade participants that...
    • refactoring is a mutually beneficial activity, furthering the goals of individual programmers, the team, the company, its customers, and the users of the product.
    • you don't need to have the perfect design in mind before starting to refactor.
    • you do need tests before you can refactor safely.
  • Give participants time to practice...
    • identifying code smells.
    • focusing on one refactoring at a time.
    • incrementally improving a codebase, avoiding big-bang rewrites.
    • using the language of code smells to discuss design tradeoffs.
    • communicating the motivation for a change in Git commit messages.
    • making backwards-compatible changes to an interface (e.g. creating a class to hold formerly global methods, leaving the existing global methods as middlemen).
  • Demonstrate...
    • getting fast feedback by running all the tests after every change.

Anti-Goals

This workshop can't do everything—after all, we only have three hours. Some things we're intentionally not going to cover:

  • Writing tests. The example code comes with tests, which are supposed to be complete. The facilitator should communicate to participants that he/she trusts the tests and will not need to add more.
  • Refactoring test code. If the group ends up looking at the test code for any reason, the facilitator should mention that the tests are not exemplary, but that refactoring them is out of scope. Refactoring tests presents its own set of pitfalls, and we'd rather not address them in this workshop. It might be worth pointing out to participants that the tests do not have to be pretty for refactoring to work. They just have to fail when the code has a bug.
  • Fixing bugs. The participants might find bugs in the code, or behaviors they think should be changed. The facilitator should remind them that the goal of refactoring is to hold behavior constant while changing structure. By making the bugfix or feature change later, in a separate commit, we'll more clearly communicate our intent to programmers who work on this code in the future.

Facilitator Guide

See FACILITATING.md

Definitions

  • Code Smell: "a surface indication that usually corresponds to a deeper problem in the system". Source: martinfowler.com
  • Refactoring: (noun) "a change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior". Source: refactoring.com
  • Refactoring: (verb) "to restructure software by applying a series of refactorings without changing its observable behavior". Source: refactoring.com

refactoring-workshop's People

Contributors

benchristel avatar professor avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.