Jason Shifflet 2-3-11

Host Team: Boban Josipovic, Dan Klufas, Paul Tagliamonte

HOME

Professional Bio

Jason Shifflet started his computing career by attending a technology high school where he completed two years of networking classes. He started in the Computer Science program at John Carroll University in 2003 and graduated with a B.S. in Computer Science in 2008. While at John Carroll, Jason worked with Drs. Palmer and Kirschenbuam on everything from swarm logistics algorithms, to network intrusion detection, and neural network models of schizophrenia. While part of the Swarm Research group, he co-authored and authored several student and national conference papers. After graduating, Jason worked for University Hospitals of Cleveland as part of the medical informatics group developing operating room management systems. Currently, Jason is working at Pikimal, an internet technology start-up attempting to bring decision support and data transparency to consumer information. At Pikimal he leads the agile process and spends most of his day stabilizing and coding new features for the site.

Pikimal

Topic

  • Transition from an aging codebase to one that supports well-defined internal APIs and interfaces
  • Focus on the use of refactoring to support innovation and product/market differentiation

Talking Points

1. TDD versus BDD (Test Driven Development versus Behavior Driven Development)
2. Why tests?
3. Scenario Examples, these are very similar to Cucumber acceptance tests
4. Why refactor?
5. Innovation is not just creativity
6. Startup environments

Presentation

TDD vs BDD

TDD

Test Driven Development (TDD) is a software development process that uses automated unite tests to drive the design of the software. It also relies on the repetition of a very short development cycle.

  1. Programmer writes a test case that will fail if a new improvement is not met
  2. Writes code that will pass the test case
  3. Refactors the new code to accept standards
Test-driven_development.PNG

Benefits of TDD

  • Programmers write more tests and they tend to be more productive
  • Programmers feel that they rarely need to use a debugger
  • Programmer is concerned withe the interface before the implementation

Drawbacks of TDD

  • Unit tests are usually created by the programmer that will also write the code and therefore share the same blind spots
  • Passing unit tests can bring a false sense of security

BDD

Behavior Driven Development (BDD) is a more agile development technique that calls for collaboration between developers, QA and non-technical/business participants. Test cases are written in natural language which allows that programmer to focus on why the code should be created instead of the technical details.

BDD Practices:
  • Establish goals of different stakeholders
  • draw out features which will achieve goals
  • Involve stakeholders in implementation process
  • Use examples to describe behavior of the application
  • automating examples for quick feedback
  • Use "should" to describe the behavior of software
  • Use "ensure" to describe the responsibility of software

Pikimal uses BDD because it allows everyone in the company/business to have a say in their next feature/product. They also have a company Wiki that encourages employees, no matter what position they are in the company, to add ideas that are later on reviewed and maybe implemented. One of BDD's main points is if it does not add value to a product do not implement it. They use Cucumber for their behavior driven development which enables them to write high level descriptions of the software's functionality. It allows to write the descriptions using plain text in native language.

Cucumber Code Example:

# language: en
Feature: Division
  In order to avoid silly mistakes
  Cashiers must be able to calculate a fraction

  Scenario: Regular numbers
    * I have entered 3 into the calculator
    * I have entered 2 into the calculator
    * I press divide
    * the result should be 1.5 on the screen
class Calculator
  def push(n)
    @args ||= []
    @args << n
  end

  def add
    @args.inject(0){|n,sum| sum+=n}
  end

  def divide
    @args[0].to_f / @args[1].to_f
  end
end

Testing

  • No dedicated QA person
  • Bring in users to test prototypes
    • record every step of the user and ask questions (why they clicked on this or that?)
    • find out where users get stuck at or confused on the site and work to improve it
  • Use Capybara and Selenium for testing
    • Capybara – do a mock session with the website - records users actions
    • Can use them to run a website behind the scenes

Software Craftsman Model

http://manifesto.softwarecraftsmanship.org/

  • Approach to software development that is based on the coding skills of the actual software developers.
  • Titles range from "Apprentice" to "Master"
    • Apprentice - main job is to pair program with a Journeyman or Master to learn quickly
      • Code walkthroughs
      • Data visualization
    • Journeyman - goal is to help the apprentices and learn more from the masters
    • Master - main goal is to educate lower levels
  • Needs of the apprentices pushes the Journeymen and the Masters
  • Encourages both the apprentice and master to learn from one another
  • Software is like a guild, collaboration of co-equals

Pikimal

  • Start up company
  • Have had to redo the project three times
    • IT WORKED EVERY TIME THOUGH
    • Different from academic programming - if it works you are done
  • Limitations in their staff due to being a start up
    • Currently limited to one apprentice
    • Problem finding programmers that are willing to learn other programming languages- Ruby on Rails