Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/radix-ai/awesome-machine-learning-engineer

πŸ€“ A curated awesome list of Machine Learning Engineering resources. Feel free to contribute!
https://github.com/radix-ai/awesome-machine-learning-engineer

artificial-intelligence awesome-list full-stack machine-learning machinelearning python

Last synced: 3 months ago
JSON representation

πŸ€“ A curated awesome list of Machine Learning Engineering resources. Feel free to contribute!

Awesome Lists containing this project

README

        

# Awesome Machine Learning Engineer

Awesome

For more awesomeness, check out [![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome).

## What is this and how do I use it?

- This is a curated list of delightful resources for everything you need to develop Machine Learning solutions.
- Each item in this list will teach you at least one distinct and significant skill or piece of information.
- There are three content levels:
1. :hatched_chick: Essential reading for all ML engineers
2. :snake: Advanced reading for professional ML engineers
3. :unicorn: Expert material for expert ML engineers
- Descriptions are written to complete the sentence *"After reading this article you will have learned ..."*.

## Contents

- [Communication](#communication)
- [Software Engineering](#software-engineering)
- [Machine Learning](#machine-learning)
- [DevOps](#devops)

## Communication

- :hatched_chick: [BLUF: The Military Standard That Can Make Your Writing More Powerful](https://www.animalz.co/blog/bottom-line-up-front/) - How to make your communication more powerful (5 min)
- :hatched_chick: [The XY Problem](http://xyproblem.info/) - How to focus on explaining your end goal when asking for help (5 min)
- :hatched_chick: [Bike-shedding: how mature are you as an engineer?](https://no-kill-switch.ghost.io/bike-shedding-how-mature-are-you-as-an-engineer/) - How to avoid and call out bike-shedding (5 min)
- :hatched_chick: [E-mail like a boss](https://pbs.twimg.com/media/D7LgaoMW4Acy6hL?format=jpg&name=large) - How to write better e-mails (5 min)
- :hatched_chick: [Stop Swiss Cheesing your calendar](https://thinkingthrough.substack.com/p/stop-swiss-cheesing-your-calendar?s=r) - How to manage your calendar so you can focus (15 min)
- :hatched_chick: [How to write in plain English](http://www.plainenglish.co.uk/how-to-write-in-plain-english.html) - How to write in plain English (30 min)
- :hatched_chick: [Presentation Rules](http://www.jilles.net/perma/2020/06/05/presentation-rules.html) - How to create a great slide deck (30 min)
- :snake: [SMART criteria](https://en.wikipedia.org/wiki/SMART_criteria) - How to define goals (15 min)
- :snake: [MECE principle](https://medium.com/@cielfearless/mece-principle-2ec64c746066) - How to fully decompose a problem into a structured list (15 min)
- :snake: [SCQA: What is it, how does it work, and how can it help me?](https://analytic-storytelling.com/scqa-what-is-it-how-does-it-work-and-how-can-it-help-me/) - How to structure your presentations, proposals, and sales outlines (15 min)
- :snake: [No More Misunderstandings](https://smallbigideas.substack.com/p/no-more-misunderstandings) - How to avoid miscommunication by paraphrasing (15 min)
- :unicorn: [Nonviolent communication](https://medium.com/s/please-advise/the-essential-guide-to-difficult-conversations-41f736e63ccf) - How to deliver constructive feedback in difficult situations (15 min)
- :unicorn: [The Halo effect](https://en.wikipedia.org/wiki/Halo_effect#Marketing) - How to recognize and use the Halo effect to your advantage (15 min)
- :unicorn: [Mythical Man Month](https://8thlight.com/blog/sue-kim/2013/01/31/mythical-man-month-cliff-notes.html) - The relationship between person-days and throughput time in a project (15 min)
- :unicorn: [Four-sides model](https://en.wikipedia.org/wiki/Four-sides_model) - How to communicate effectively by considering how the receiver interprets your message (30 min)

## Software Engineering

### API design

- :hatched_chick: [Semantic Versioning](https://semver.org/) - How to bump the version of your apps and packages (15 min)
- :hatched_chick: [`__all__` and wild imports in Python](http://xion.io/post/code/python-all-wild-imports.html) - How `__all__` defines the public API of your Python packages (15 min)
- :hatched_chick: [APIs for Machine Learning](https://madewithml.com/courses/mlops/api/) - How to design RESTful APIs for Machine Learning applications (30 min)
- :snake: [FastAPI docs](https://fastapi.tiangolo.com/tutorial/first-steps/) - How to build RESTful APIs that correspond one-to-one with an OpenAPI specification (1 day)
- :snake: [The Rule of Three](https://blog.codinghorror.com/rule-of-three/) - When to build reusable components and when not (15 min)
- :snake: [Falsehoods programmers believe about time](http://infiniteundo.com/post/25326999628/falsehoods-programmers-believe-about-time) - How to avoid common pitfalls about time (15 min)
- :snake: [Falsehoods programmers believe about names](https://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/) - How to avoid common pitfalls about names (15 min)
- :snake: [Command Line Interface Guidelines](https://clig.dev/#guidelines) - How to write great CLIs (1 hour)
- :unicorn: [Zalando's RESTful API guidelines](https://opensource.zalando.com/restful-api-guidelines/) - How to design RESTful APIs (1 day)

### Workflow

- :hatched_chick: [Poetry Cookiecutter](https://github.com/radix-ai/poetry-cookiecutter) - How to scaffold a modern Poetry-based development environment for Python packages and apps (30 min)
- :hatched_chick: [The seven rules of a great Git commit message](https://chris.beams.io/posts/git-commit/) - How to write great Git commit messages (15 min)
- :hatched_chick: [Learn Git Branching](https://learngitbranching.js.org/) - Practice Git from beginner to advanced (1 hour)
- :snake: [Keep a Changelog](https://keepachangelog.com/) - How to keep a changelog for your apps and packages (30 min)
- :snake: [Conventional Commits](https://www.conventionalcommits.org/) - How to prefix your commit messages to automate [Semantic Versioning](https://semver.org/) and [Keep a Changelog](https://keepachangelog.com/) (15 min)
- :snake: [Testing Python Applications with Pytest](https://stribny.name/blog/pytest/) - How to properly test a package with pytest (30 min)
- :snake: [A successful Git branching model](https://nvie.com/posts/a-successful-git-branching-model/) - How to release software with Git (15 min)
- :snake: [Code Review Best Practices](https://www.kevinlondon.com/2015/05/05/code-review-best-practices) - What to look for when reviewing a Pull Request (30 min)
- :snake: [Code Health: Respectful Reviews == Useful Reviews](https://testing.googleblog.com/2019/11/code-health-respectful-reviews-useful.html) - How to communicate code review comments respectfully (15 min)
- :snake: [The Code Review Pyramid](https://www.morling.dev/blog/the-code-review-pyramid/) - What to look for and what to automate when reviewing a Pull Request (15 min)
- :unicorn: [Poetry workspace plugin](https://github.com/jacksmith15/poetry-workspace-plugin) - How to create and manage a Poetry-based monorepo (15 min)

### Python patterns

- :hatched_chick: [PEP20 "The Zen of Python"](https://www.python.org/dev/peps/pep-0020/) - How to write idiomatic Python (15 min)
- :hatched_chick: [The Definitive Guide to Python import Statements](https://chrisyeh96.github.io/2017/08/08/definitive-guide-python-imports.html) - How to write import statements (30 min)
- :hatched_chick: [Understanding Python's logging module](https://www.electricmonk.nl/log/2017/08/06/understanding-pythons-logging-module/) - How to use the `logging` module effectively (30 min)
- :snake: [Don't run code at import time](https://www.benkuhn.net/importtime/) - Why you shouldn't run code at import time
- :snake: [Please fix your decorators](https://hynek.me/articles/decorators/) - Why you should probably use [`wrapt`](https://github.com/GrahamDumpleton/wrapt) to write your decorators (30 min)
- :unicorn: [Do not log](https://sobolevn.me/2020/03/do-not-log) - What you should be doing instead of logging (30 min)
- :unicorn: [The Little Book of Python Anti-Patterns](https://docs.quantifiedcode.com/python-anti-patterns/) - A collectiong of Python anti-patterns (X hours)
- :unicorn: [Effective Python](https://github.com/SigmaQuan/Better-Python-59-Ways/blob/master/README.md) - A collection of Python idioms (X hours)
- :unicorn: [Python Design Patterns](https://python-patterns.guide) - A collection of software architecture patterns (1 hour)
- :unicorn: [SOLID](https://en.wikipedia.org/wiki/SOLID) - A standard set of software architecture patterns (1 hour)
- :unicorn: [What the f*ck Python!](https://github.com/satwikkansal/wtfpython) - How to master Python by understanding its edge cases (1 day)

### Typing

- :snake: [The Comprehensive Guide to mypy](https://sadh.life/post/mypy-guide/) - How to write type annotations in Python (1 hour)
- :snake: [Pydantic overview](https://pydantic-docs.helpmanual.io/) - How to write type annotations for complex types instead of a meaningless `Dict[str, Any]` (1 hour)
- :snake: [Magic number](https://en.wikipedia.org/wiki/Magic_number_(programming)#Unnamed_numerical_constants) - Why _magic values_ are an anti-pattern (15 min)
- :snake: [Enums](https://pydantic-docs.helpmanual.io/usage/types/#enums-and-choices) - How to write `Enum`s in Python instead of type-unsafe magic values (15 min)
- :unicorn: [Mypy generics](https://mypy.readthedocs.io/en/stable/generics.html) - How to use `TypeVar`s to write generic types such as `List[T]` (30 min)
- :unicorn: [Mypy protocols](https://mypy.readthedocs.io/en/latest/protocols.html) - How to use `Protocol`s to define interfaces such as `Iterable` (30 min)

### Curated Python packages

#### Workflow

- :snake: [cookiecutter](https://github.com/cookiecutter/cookiecutter) - Scaffold new Python packages or apps quickly with a Cookiecutter template
- :snake: [cruft](https://github.com/cruft/cruft) - Update a Python package's underlying Cookiecutter scaffolding
- :snake: [commitizen](https://github.com/commitizen-tools/commitizen) - Check that commit messages satisfy [Conventional Commits](https://www.conventionalcommits.org/) and automate [Semantic Versioning](https://semver.org/) and [Keep a Changelog](https://keepachangelog.com/)
- :snake: [poetry](https://github.com/python-poetry/poetry) - Manage the packaging and dependencies of your Python project
- :snake: [poe](https://github.com/nat-n/poethepoet) - Define and run tasks in a Poetry project with Poe the Poet
- :snake: [poetry-workspace-plugin](https://github.com/jacksmith15/poetry-workspace-plugin) - Manage a Python monorepo with this Poetry plugin

#### Code quality

- :hatched_chick: [black](https://github.com/psf/black) - Automatically format your code
- :hatched_chick: [isort](https://github.com/PyCQA/isort) - Automatically sort your import statements
- :snake: [pre-commit](https://pre-commit.com/) - Automatically run code quality checks on commit
- :snake: [bandit](https://github.com/PyCQA/bandit) - Find common security issues
- :snake: [darglint](https://github.com/terrencepreilly/darglint) - Check that your docstrings match your function signature
- :snake: [flake8](https://github.com/PyCQA/flake8) - Check your code for bugs and that your code style is [PEP8](https://peps.python.org/pep-0008/)-compliant
- :snake: [flake8 extensions](https://github.com/DmytroLitvinov/awesome-flake8-extensions) - An awesome list of Flake8 extensions
- :snake: [mypy](https://github.com/python/mypy) - Check the type-correctness of your code
- :snake: [pre-commit hooks](https://github.com/pre-commit/pre-commit-hooks) - A collection of [pre-commit](https://pre-commit.com/) hooks that check file quality
- :snake: [pydocstyle](https://github.com/PyCQA/pydocstyle) - Check that your code is documented
- :snake: [pygrep hooks](https://github.com/pre-commit/pygrep-hooks) - A collection of [pre-commit](https://pre-commit.com/) hooks that check for common Python code smells
- :snake: [pytest-recording](https://github.com/kiwicom/pytest-recording) - Record and play back HTTP requests in your pytest tests
- :snake: [pyupgrade](https://github.com/asottile/pyupgrade) - Check that your code is written using the latest Python language features
- :snake: [safety](https://github.com/pyupio/safety) - Check that your dependencies don't have any known security vulnerabilities
- :snake: [shellcheck](https://github.com/shellcheck-py/shellcheck-py) - Check the quality of your shell scripts
- :snake: [coverage.py](https://github.com/nedbat/coveragepy) - Check your code's test coverage
- :unicorn: [hypothesis](https://hypothesis.readthedocs.io/en/latest/quickstart.html) - Write tests that automatically look for edge cases that break your code
- :unicorn: [hypothesis-auto](https://timothycrosley.github.io/hypothesis-auto) - Automate generate Hypothesis tests based on your code's type annotations

#### Application development

- :snake: [fastapi](https://github.com/tiangolo/fastapi) - Create RESTful APIs based on type annotations
- :snake: [typer](https://github.com/tiangolo/typer) - Create CLIs based on type annotations
- :snake: [streamlit](https://github.com/streamlit/streamlit) - Create web apps with a single Python file

#### Utilities

- :snake: [bump2version](https://github.com/c4urself/bump2version) - Release a new version of your package
- :snake: [coloredlogs](https://github.com/xolox/python-coloredlogs) - Increase your logs' readability with colour
- :snake: [hvplot](https://github.com/holoviz/hvplot) - Create interactive plots from pandas dataframes
- :snake: [mkdocs](https://github.com/mkdocs/mkdocs) - Create developer documentation for your project
- :snake: [pdoc](https://github.com/mitmproxy/pdoc) - Generate API documentation for your code
- :snake: [birdseye](https://github.com/alexmojaki/birdseye) - Graphically debug your Python code
- :snake: [scalene](https://github.com/emeryberger/scalene) - Profile your code's CPU and memory usage by line
- :snake: [viztracer](https://github.com/gaogaotiantian/viztracer) - Vizualize your code's performance with a [flamegraph](https://www.brendangregg.com/flamegraphs.html)
- :snake: [tqdm](https://github.com/tqdm/tqdm) - Easily add progress bars to long-running jobs

## Machine Learning

### Practical theory

- :snake: [Bias-variance tradeoff](https://en.wikipedia.org/wiki/Bias%E2%80%93variance_tradeoff) - How a model's total error is the sum of bias and variance (30 min)
- :snake: [The two different uses of cross-validation](https://stats.stackexchange.com/questions/64991/model-selection-and-cross-validation-the-right-way) - How to use nested cross-validation to combine the two different uses of cross-validation (30 min)
- :snake: [Modes, Medians and Means: A Unifying Perspective](https://www.johnmyleswhite.com/notebook/2013/03/22/modes-medians-and-means-an-unifying-perspective/) - Why minimizing the Mean Absolute Error (MAE) is more robust than minimizing the Mean Squared Error (MSE) (30 min)
- :snake: [Backpropagation is the chain rule to compute the gradient](https://ml-cheatsheet.readthedocs.io/en/latest/backpropagation.html) - How backpropagation is an algorithm to compute the objective function's gradient (30 min)
- :snake: [Stacked generalization](https://scikit-learn.org/stable/modules/ensemble.html#stacking) - How to stack models (30 min)
- :snake: [We have been using the wrong initialization for t-SNE and UMAP](https://twitter.com/rasbt/status/1356613391444500487?s=19) - How to initialize t-SNE and UMAP properly (15min)
- :unicorn: [From classic Fully Connected Networks to Transformers](https://nostalgebraist.tumblr.com/post/185326092369/1-classic-fully-connected-neural-networks-these) - How neural networks evolved from Fully Connected Networks to Transformers (30 min)
- :unicorn: [What is the .632+ rule?](https://stats.stackexchange.com/questions/96739/what-is-the-632-rule-in-bootstrapping) - How to measure generalization performance with bootstrapping (30 min)
- :unicorn: [Stacking strategies with and without leaks](https://www.kaggle.com/general/18793) - Different strategies to stack models (30 min)
- :unicorn: [Data Distribution Shifts and Monitoring](https://huyenchip.com/2022/02/07/data-distribution-shifts-and-monitoring.html#data-shifts) - How to detect and address the different types of data shift (1 hour)
- :unicorn: [Backprop is not just the chain rule](https://timvieira.github.io/blog/post/2017/08/18/backprop-is-not-just-the-chain-rule/) - How backpropagation relates to Lagrange multipliers (30 min)
- :unicorn: [Why ML algorithms are hard to tune](https://www.engraved.blog/why-machine-learning-algorithms-are-hard-to-tune/) - Optimize multiple objectives when the Pareto front is concave (30min)
- :unicorn: [Deep learning model compression](https://rachitsingh.com/deep-learning-model-compression/) - How quantization, pruning, and distillation can be used to compress models (30 min)

### Explainability

- :snake: [SHAP: SHapley Additive exPlanations](https://github.com/slundberg/shap) - How to explain a model's output with Shapley values (30 min)
- :unicorn: [Intro to Shapley and SHAP](https://edden-gerber.github.io/shapley-part-1/) - How Shapley values are approximated by SHAP (30 min)

### Unsupervised

- :snake: [UMAP: Uniform Manifold Approximation and Projection](https://github.com/lmcinnes/umap) - How to reduce dimensionality for visualization and modelling (30 min)
- :snake: [PyNNDescent](https://github.com/lmcinnes/pynndescent) - How to find nearest neighbours in huge datasets (15 min)

### Classification

- :hatched_chick: [Precision and recall](https://en.wikipedia.org/wiki/Precision_and_recall) - How precision and recall measure a classifier's performance (30 min)
- :snake: [Probability calibration](https://scikit-learn.org/stable/modules/calibration.html) - How and for which model types you should calibrate the model's output scores into probabilities (30 min)
- :snake: [You're all calculating churn rates wrong](https://catchjs.com/Blog/Churn) - Correctly define what churn is (30 min)

### Regression

- :unicorn: [Gaussian processes - From scratch](https://peterroelants.github.io/posts/gaussian-process-tutorial/) - How to build probabilistic regression models with Gaussian Processes (1 hour)

### Computer Vision

- :snake: [Microsoft's Document Image Transformer](https://github.com/microsoft/unilm/tree/master/dit) - A self-supervised pre-trained model that achieves SotA performance on [PubLayNet](https://github.com/ibm-aur-nlp/PubLayNet) and can be used for various downstream tasks (30 min)

### Natural Language Processing

- :snake: [Awesome Sentence Embedding](https://github.com/Separius/awesome-sentence-embedding) - A curated list of pretrained sentence and word embedding models (15 min)

### Time Series Analysis

- :snake: [The Prophet model](https://otexts.com/fpp3/prophet.html) - How Meta's Prophet model decomposes a time series into a trend, seasonality, and holiday components (30 min)
- :snake: [Darts - Time Series Made Easy in Python](https://github.com/unit8co/darts) - How to build forecasting models with `darts` (1 hour)

### Recommender Systems

- :snake: [Microsoft Recommenders](https://github.com/microsoft/recommenders) - A comparison of recommender system models (30 min)

### Tensor computation libraries

- :snake: [What I Wish Someone Had Told Me About Tensor Computation Libraries](https://eigenfoo.xyz/tensor-computation-libraries/) - How JAX, PyTorch, TensorFlow, and Theano are different (30 min)

### Pandas

- :snake: [Modern Pandas series (Part 1 - 7)](https://tomaugspurger.github.io/modern-1-intro.html) - Write idiomatic pandas (1 hour)
- :snake: [Awesome Pandas](https://github.com/tommyod/awesome-pandas) - An awesome list of Pandas resources (1 hour)

### Sci-kit learn

- :hatched_chick: [Using scikit-learn Pipelines and FeatureUnions](http://zacstewart.com/2014/08/05/pipelines-of-featureunions-of-pipelines.html) - How to use `Pipeline`s to build end-to-end models (30 min)
- :hatched_chick: [Transforming target in regression](https://scikit-learn.org/stable/modules/compose.html#transformed-target-regressor) - How to transform the target to build more robust models (15 min)
- :snake: [ColumnTransformer for heterogeneous data](https://scikit-learn.org/stable/modules/compose.html#column-transformer) - How to use `ColumnTransformer` to process pandas DataFrames in sklearn `Pipeline`s (30 min)
- :snake: [Custom Estimators](http://danielhnyk.cz/creating-your-own-estimator-scikit-learn/) - Create your own custom `Estimator` (30 min)
- :snake: [Hyperparameter optimization with successive halving](https://scikit-learn.org/stable/modules/grid_search.html#searching-for-optimal-parameters-with-successive-halving) - How to optimize hyperparameters with the most computationally efficient method (30 min)

### Labelling

- :snake: [Doccano](https://github.com/doccano/doccano) - A tool for labelling text (30 min)
- :snake: [CVAT: Computer Vision Annotation Tool](https://github.com/openvinotoolkit/cvat) - A tool for labelling images (30 min)
- :snake: [Awesome Data Labelling](https://github.com/heartexlabs/awesome-data-labeling) - An awesome list of data labelling tools (30 min)

## DevOps

### CI/CD

- :snake: [invoke](https://github.com/pyinvoke/invoke) - How to implement common tasks you run on your project as a CLI (30 min)
- :snake: [poe](https://github.com/nat-n/poethepoet) - How to implement common tasks you run on your project as a CLI (30 min)

### Environment and dependency management

- :hatched_chick: [Intro to packaging and dependency management for Python with Poetry](https://curvestone.io/intro-to-packaging-and-dependency-management-for-python-with-poetry/) - How to manage your Python package's dependencies and environment (30 min)
- :snake: [Intro to Pyenv for Machine Learning](https://wandb.ai/site/articles/pyenv-for-ml) - How to use pyenv to manage your Python interpreter (30 min)
- :snake: [Modern Python Environments - dependency and workspace management](https://testdriven.io/blog/python-environments/) - A comparison between pyenv, venv + pip, venv + pip-tools, poetry, pipenv, and conda (30 min)
- :unicorn: [Conda: Myths and Misconceptions](http://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/) - Common misconceptions about Conda (15 min)

### Docker

- :hatched_chick: [Docker Curriculum](https://docker-curriculum.com/) - How to use Docker (4 hours)
- :snake: [Docker layer caching](https://pythonspeed.com/articles/docker-caching-model/) - How to write Dockerfiles to benefit from layer caching (30 min)
- :snake: [Dockerfile best practices](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/) - How to write good Dockerfiles (1 hour)
- :snake: [Configuring Gunicorn for Docker](https://pythonspeed.com/articles/gunicorn-in-docker/) - How to best configure Gunicorn for a Docker image (30 min)
- :snake: [Speed up Docker with BuildKit’s new caching](https://pythonspeed.com/articles/docker-cache-pip-downloads/) - How to speed up Docker builds with a build cache (30 min)
- :unicorn: [Build secrets in Docker and Compose, the secure way](https://pythonspeed.com/articles/build-secrets-docker-compose/) - How to use secrets in a Docker build (15 min)
- :unicorn: [Security scanners for Python and Docker](https://pythonspeed.com/articles/docker-python-security-scan/) - How to scan your Docker image for security issues with your code and Docker image (30 min)
- :unicorn: [The security scanner that cried wolf](https://pythonspeed.com/articles/docker-security-scanner/) - How to scan your Docker image for security issues without false positives (15 min)
- :unicorn: [Awesome Docker](https://github.com/veggiemonk/awesome-docker) - An awesome list of Docker resources (30 min)

### Data pipelines

- :snake: [Great Expectations](https://github.com/great-expectations/great_expectations) - How to test and document your data and data pipelines (30 min)

### Shell

- :snake: [Cron best practices](https://blog.sanctum.geek.nz/cron-best-practices/) - How to best use cron to schedule tasks (30 min)
- :snake: [A visual guide to SSH tunnels](https://robotmoon.com/ssh-tunnels/) - How to forward ports and create tunnels with SSH (30 min)
- :snake: [Safe ways to do things in bash](https://github.com/anordal/shellharden/blob/master/how_to_do_things_safely_in_bash.md) - How to write safe and robust shell scripts (1 hour)
- :unicorn: [Your terminal is not a terminal: An Introduction to Streams](https://lucasfcosta.com/2019/04/07/streams-introduction.html) - How your terminal is a tool to manipulate streams (30 min)
- :unicorn: [Bash Heredoc](https://linuxize.com/post/bash-heredoc/) - How to pass multiline arguments to commands with a heredoc (30 min)
- :unicorn: [Please stop writing shell scripts](https://pythonspeed.com/articles/shell-scripts/) - Why you shouldn't write shell scripts for CI/CD or Docker images (30 min)

### Terraform

- :hatched_chick: [An Introduction to Terraform](https://blog.gruntwork.io/an-introduction-to-terraform-f17df9c6d180) - How to use Terraform (1 hour)
- :snake: [Terraform best practices](https://github.com/ozbillwang/terraform-best-practices) - Terraform best practices (1 hour)
- :unicorn: [Terraform pre-commit hooks collection](https://github.com/antonbabenko/pre-commit-terraform) - How to automate Terraform code quality checks with pre-commit (1 hour)
- :unicorn: [Awesome Terraform](https://github.com/shuaibiyy/awesome-terraform) - An awesome list of Terraform resources (30 min)
- :hatched_chick: [Terraform Tutorial](https://spacelift.io/blog/terraform-tutorial) - How to get started with Terraform (1 hour)

### Infrastructure

- :hatched_chick: [Using Redis In-Memory Storage for your Python Applications](https://hackersandslackers.com/redis-py-python/) - How to use Redis as an in-memory cache for your Python application (30 min)
- :snake: [Python Kafka Consumers: at-least-once, at-most-once, exactly-once](https://www.thebookofjoel.com/python-kafka-consumers) - How to write different types of Kafka consumers in Python (30 min)
- :unicorn: [Kafka Exactly-Once-Semantics](https://github.com/confluentinc/confluent-kafka-python/releases/tag/v1.4.0) - How to produce and consume messages exactly once (1 hour)
- :unicorn: [RabbitMQ: a message queue library with persistance](https://www.rabbitmq.com/tutorials/tutorial-one-python.html) - RabbitMQ is a messaging system with a message broker (4 hours)
- :unicorn: [ZeroMQ: a socket library with message queue primitives](https://zguide.zeromq.org/) - ZeroMQ is a lightweight messaging system without a message broker (8 hours)

## Curated by Radix

[Radix](https://radix.ai) is a Belgium-based Machine Learning company.

We invent, design and develop AI-powered software. Together with our clients, we identify which problems within organizations can be solved with AI, demonstrating the value of Artificial Intelligence for each problem.

Our team is constantly looking for novel and better-performing solutions and we challenge each other to come up with the best ideas for our clients and our company.

Here are some examples of what we do with Machine Learning, the technology behind AI:
- Help job seekers find great jobs that match their expectations. On the [Belgian Public Employment Service website](https://www.vdab.be), you can find our job recommendations based on your CV alone.
- Help hospitals save time. We extract diagnosis from patient discharge letters.
- Help publishers estimate their impact by detecting copycat articles.

We work hard and we have fun together. We foster a culture of collaboration, where each team member feels supported when taking on a challenge, and trusted when taking on responsibility.