operating system design patterns for beginners