software understanding