Meal Planner (frond end)

Manage your own recipes, plan your meals for the week and automatically create a groceries list. This is an over-engineered application for learning new technologies and concepts that will make me a better developer overall. See also the back end repo: https://github.com/vincentbuit/mealplanner-back-end.

Technologies and concepts to master in the front end

Technologies

  • Modern React (framework)
    • React default state management
    • Typescript (type checking js)
      • Advanced type definitions
      • Setting up tsconfig
      • ESLint (lint)
      • Prettier (beautifyer)
  • Cypress (testing)
  • ReactiveX: RxJS (reactive programming)
  • Webpack (bundling)
  • Flexbox (responsiveness & layout)
  • Husky (git hooks)
  • Git (version control)
    • Small and atomic commits
    • Branches which are easy to review and follow an easy to understand narrative
    • Splitting, combining commits and everything else related to interactive rebase
    • Using git history to your advantage by searching through previous commit messages and code changes using git log and git blame

Concepts

  • Functional programming: https://github.com/MostlyAdequate/mostly-adequate-guide
    • Pure functions
    • Currying
    • Coding by composing
    • Hindley-Milner type system
    • Functors
    • Monads
  • Design, styling, UI/UX
  • Standards: Don’t allow bad designs, wrong decisions or poor code. (The Pragmatic Programmer p6)
  • Documentation: Restrict non-API commenting to discussing why something is done, its purpose and its goal. (The Pragmatic Programmer p23)
  • Easy To Change (ETC): Isolate concerns, single responsibility, good naming and write replaceable code. (The Pragmatic Programmer p28)
  • Don’t Repeat Yourself (DRY): No duplication in code, documentation, data and APIs. (The Pragmatic Programmer p30)
  • Reusibility: Make code easy to reuse. (The Pragmatic Programmer p37)
  • Orthogonality: Eliminate effects between unrelated things. (The Pragmatic Programmer p39)
  • Flexibility: There are no final decisions, remain as flexible as you can. (The Pragmatic Programmer p48)
  • Tracer bullets: Quickly, visibly and repeatably get from requirements to some aspect of the final system. (The Pragmatic Programmer p50)
  • Estimate: Iterate the schedule with the code to better communicate when projects are finished. (The Pragmatic Programmer p65)
  • Engineering daybook: Learn from choices, bugs for the future by writing it down. (The Pragmatic Programmer p100)
  • Design by Contract (DBC): Think about preconditions, postconditions and repercussions. (The Pragmatic Programmer p104)
  • Memory leaks: Prevent them by acting locally. (The Pragmatic Programmer p121)
  • Parameterization: Using external configuration to control your app. (The Pragmatic Programmer p166)
  • Refactoring: Doing it early and doing it often. (The Pragmatic Programmer p209)
  • Test driven development. (The Pragmatic Programmer p214)
  • Naming: Name well and rename when needed. (The Pragmatic Programmer p238)

Plan

Stage 1: Setup project

Step 2: Design

Step 3: Write front end