Make files are a great way to get things done efficiently, if you know what they are and they make sense to you. My entry into makefiles started when I took C programming in the late 80’s. You would write code in C, then use a Makefile to turn that code into an executable program. Since it takes several intermediate steps and creation of different kinds of files along the way, a Makefile manages all these steps using recipes laid out in blocks. The blocks are designed to create output files from input files. You specify the names of the output files, and the names of the input files, and a set of rules for how to use one to create the other.
Snakemake is this same idea, implemented through python. Here’s a simple example.
all: alignment.bam # We have to populate this part with the files we want to create align: input: input.fastq # [FileSystem] Does this file exist? # Is there some rule to create it? output: alignment.bam # Does this part match any part of "all"? # [FileSystem] Does this file already exist? shell: bowtie input.fastq | samtools > alignment.bam