# Haskeller Competency Matrix | | Junior | Middle | Senior | Architect | |- |- |- |- |- | | **Haskell level** | Basic Haskell | Intermediate Haskell | Advanced Haskell | Language-agnostic | | **Haskell knowledge scope** | [Learn you a Haskell](http://learnyouahaskell.com/) | [Get programming in Haskell](https://www.manning.com/books/get-programming-with-haskell) | [Haskell in Depth](https://www.manning.com/books/haskell-in-depth) | Knows several languages from different categories | | | [Get programming in Haskell](https://www.manning.com/books/get-programming-with-haskell) | [Haskell in Depth](https://www.manning.com/books/haskell-in-depth) | [Functional Design and Architecture](https://leanpub.com/functional-design-and-architecture) | | | | | | [Thinking with types]() | | | | | | | | | **Haskell** | Lambdas, functions, composition | Advanced composition (point free, applicatives, functors, monads) | Some type-level Haskell (TH, Generics, GADTs, FunDeps, Type Families, HKDs...) | More focussed on the big picture rather on the language features | | | Base types (String, Int, Float...) | General types (Text, ByteString...) | High-kinded types | | | | Main ADTs (Maybe, Bool, Either...) | Basic lenses | Parametrized types | | | | Basic IO in the IO monad | Main monads (State, Reader, Writer, List, Either, Maybe) | FRP | | | | Lists, tuples | Monad transformers & monad stacks | Concurrency (STM, MVar, threads) | | | | ADTs | Advanced IO | | | | | Pattern Matching | Advanced type classes | | | | | Basic type classes (Show, Eq, Ord) | | | | | | Recursion | | | | | | Base high-order functions (map, filter...) | | | | | | Base collections (List, Map...) | | | | | | | | | | | **General knowledge scope** | Basic programming | Clean Code | Domain specific languages | Books on Software Architecture | | | | Code Complete | Domain-Driven Design | | | | | Refactoring | Test Driven Development | | | | | Data structures and algorithms | Software Development methodologies | | | | | | Books on Design Patterns | | | | | | | | | **Main activity** | Learning | Writing code | Requirements gathering | Understanding business problems, strategy and direction | | | | Testing | Understanding project tasks | Cross-project communications | | | | Writing documentation | Designing the code, interfaces, subsystems, services | Cross-team communications | | | | | Managing the complexity | Architecturing cross-project systems, frameworks, foundation libraries | | | | | Organizing the project | | | | | | Establishing coding standards | | | | | | Managing the development process | | | | | | Managing the risks | | | | | | Communications with stakeholders | | | | | | | | | **Responsibility** | | Responsible for own code & its quality | Responsible for project, its parts & design | Responsible for multiple projects | | | | | Responsible for achieving goals by the team | | | | | | | | | | | | | | | **Teamwork skills** | Working with mentor | Team player, relative independence | Team leading & mentoring | Cross-team leading | | | | | Completely independent | | | | | | Able to drive the project from start to end | | | | | | | | | **Problem solving skills** | Can solve simple, local, small problems | Can solve local problems within the well-established project | Can define project-wide problems and solve them | Can define cross-project problems and solve them | | | | | Ability to not fall into perfectionism | | | | | | Ability to refrain from playing with Haskell | | | | | | | | | **Fancy stuff** | Doesn't know about it | Can recognize it | Knows how to avoid it | | | | | Can follow ready patterns of usage | Can use it when unavoidable | | | | | | Mitigates its impact | | | | | | Provides patterns of usage | | | | | | | | | **Code quality, testability and maintainability** | | KISS, DRY, YAGNI | SOLID, The Law of Demetr, Rule of Least Power | | | | | Testing within a ready testing environment | Low coupling / High cohesion | | | | | Property-based testing | IoC & DI approaches | | | | | Functional, integration, unit testing | Application architectures (3-layer cake, onion architecture...) | | | | | Performance & load testing | Layering & separation of concerns | | | | | | Design Patterns | | | | | | Testable architecture | | | | | | Accidental & essential complexities | | | | | | In-project testing frameworks & environment | |