software techniques