software fundamentals