software knowledge