software engineering functional programming data structures algorithms concurrency operating systems testing python java javascript rust haskell scala