if esto ▁for ▁Software ▁C raft sm ans hip , ▁writing ▁well - craft ed ▁and ▁self - ex plan atory ▁software ▁is ▁almost ▁as ▁important ▁as ▁writing ▁working ▁software . ▁Using ▁interfaces ▁to ▁further ▁describe ▁the ▁intent ▁of ▁the ▁software ▁is ▁often ▁a ▁good ▁idea . ▁ ▁A ▁system ▁may ▁become ▁so ▁couple d ▁at ▁multiple ▁levels ▁that ▁it ▁is ▁no ▁longer ▁possible ▁to ▁make ▁a ▁change ▁in ▁one ▁place ▁without ▁necess it ating ▁many ▁additional ▁changes . ▁Using ▁an ▁interface ▁or ▁an ▁abstract ▁class ▁can ▁prevent ▁this ▁side ▁effect . ▁ ▁Origin ▁ ▁The ▁I SP ▁was ▁first ▁used ▁and ▁form ulated ▁by ▁Robert ▁C . ▁Martin ▁while ▁consult ing ▁for ▁X ero x . ▁X ero x ▁had ▁created ▁a ▁new ▁printer ▁system ▁that ▁could ▁perform ▁a ▁variety ▁of ▁tasks ▁such ▁as ▁st ap ling ▁and ▁f ax ing . ▁The ▁software ▁for ▁this ▁system ▁was ▁created ▁from ▁the ▁ground ▁up . ▁As ▁the ▁software ▁grew , ▁making ▁modifications ▁became ▁more ▁and ▁more ▁difficult ▁so ▁that ▁even ▁the ▁smallest ▁change ▁would ▁take ▁a ▁re deploy ment ▁cycle ▁of ▁an ▁hour , ▁which ▁made ▁development ▁nearly ▁impossible . ▁ ▁The ▁design ▁problem ▁was ▁that ▁a ▁single ▁Job ▁class ▁was ▁used ▁by ▁almost ▁all ▁of ▁the ▁tasks . ▁When ever ▁a ▁print ▁job ▁or ▁a ▁st ap ling ▁job ▁needed ▁to ▁be ▁performed , ▁a ▁call ▁was ▁made ▁to ▁the ▁Job ▁class . ▁This ▁resulted ▁in ▁a ▁' f at ' ▁class ▁with ▁mult itudes ▁of ▁methods ▁specific ▁to ▁a ▁variety ▁of