See also List of materials about Software Design in Haskell
| Junior | Middle | Senior | Architect | |
|---|---|---|---|---|
| Haskell level | Basic Haskell | Intermediate Haskell | Advanced Haskell | Language-agnostic |
| Haskell knowledge scope | Learn you a Haskell | Get programming with Haskell | Haskell in Depth | Knows several languages from different categories |
| Get programming with Haskell | Haskell in Depth | Functional Design and Architecture | ||
| Soar with Haskell | Soar with Haskell | Pragmatic Type-Level Design | ||
| Production Haskell | ||||
| Other books on Software Engineering in Haskell | ||||
| Haskell | Lambdas, functions, composition | Advanced composition (point free, applicatives, functors, monads) | Some type-level features usage (not implementation): 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...) | TH, FFI | ||
| 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 | Laziness & its implications | ||
| Pattern Matching | Advanced type classes (Foldable, Traversable...) | |||
| Basic type classes (Show, Eq, Ord) | Higher-kinded types | |||
| Recursion | ||||
| Base high-order functions (map, filter...) | ||||
| Base collections (List, Map...) | ||||
| General knowledge scope | Basic programming | Clean Code / Code Complete | Domain specific languages | Books on Software Architecture |
| Refactoring | Domain-Driven Design | |||
| Data structures and algorithms | Test Driven Development | |||
| 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 | Communications with stakeholders | |||
| Establishing coding standards | Architecture governance | |||
| 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 | ||||
| Ability to handle uncertainty | ||||
| 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 | ||||
| Integration patterns (circuit breaker, leaky bucket...) | ||||
| Testable architecture | ||||
| Accidental & essential complexities | ||||
| In-project testing frameworks & environment |
@sobolevn, thanks