Wajid Rashid

Junior backend developer · Islamabad, Pakistan

I'm learning backend development full time and building as I go. I use Ubuntu every day. Below is what I've built so far, with the real code, and a log of what I'm learning now.

Work

backup.sh packs a folder into ~/backups as a timestamped .tar.gz and keeps only the 5 newest backups. test.sh runs it on a temporary folder and checks that the archive was created. Both stop at the first error (set -euo pipefail).

Done through GitHub the way a team works: an issue, a branch, and pull requests that close it.

  • Bash
  • tar, find, mapfile
  • 5 commits
backup.sh · 28 lines
shell-practice/backup.shlines 1–28 @ 8521105 ↗
#!/usr/bin/env bash
set -euo pipefail
TARGET_DIR="${1:-}"
if [[ -z "$TARGET_DIR" ]]; then
    echo "Usage: $0 <folder_to_backup>"
    exit 1
fi
if [[ ! -d "$TARGET_DIR" ]]; then
    echo "Error: Directory '$TARGET_DIR' does not exist."
    exit 2
fi
BACKUP_DIR="$HOME/backups"
mkdir -p "$BACKUP_DIR"
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_FILE="$BACKUP_DIR/backup_$TIMESTAMP.tar.gz"
tar -czf "$BACKUP_FILE" -C "$(dirname "$TARGET_DIR")" "$(basename "$TARGET_DIR")"
cleanup_old_backups() {
    mapfile -t backups < <(find "$BACKUP_DIR" -maxdepth 1 -type f -name "backup_*.tar.gz" | sort -r)
    if (( ${#backups[@]} > 5 )); then
        rm -f "${backups[@]:5}"
    fi
}

cleanup_old_backups

BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
echo "Backup complete: $BACKUP_FILE ($BACKUP_SIZE)"
test.sh · 21 lines
shell-practice/test.shlines 1–21 @ 8521105 ↗
#!/usr/bin/env bash
set -euo pipefail

TEST_DIR=$(mktemp -d)
echo "test" > "$TEST_DIR/sample.txt"

OUTPUT=$(./backup.sh "$TEST_DIR")
echo "$OUTPUT"

CREATED_FILE=$(echo "$OUTPUT" | awk '{print $3}')

if [[ -f "$CREATED_FILE" ]]; then
    echo "Test passed: $CREATED_FILE was created."
else
    echo "Test failed: Backup file not found."
    rm -rf "$TEST_DIR"
    exit 1
fi

rm -rf "$TEST_DIR"

The 10 programs that write most to the system log:

shell-practice/ANSWERS.mdline 19 @ 8521105 ↗
cut -d ' ' -f 5 system.log | cut -d '[' -f 1 | cut -d ':' -f 1 | sort | uniq -c | sort -rn | head -n 10

Learning log

I'm working through a study plan of 143 hands-on tasks, from the terminal to APIs, databases and deployment. I started on 3 November 2026.

Now Practise branches, conflicts and fixing mistakes in Git

  1. Write Bash scripts that do real work shell-practice ↗
  2. Find anything with pipes and grep shell-practice ↗
  3. Put your first project on GitHub dev-setup ↗
  4. Set up Anki and learn how to remember what you learn
  5. Learn to move around in the terminal
The whole plan · 22 parts

Backend

  1. Getting started5/9
  2. Python by doing12
  3. Working in a team on GitHub14
  4. Docker4
  5. MySQL by doing8
  6. Data analysis with Jupyter and pandas4
  7. How the web works3
  8. Your first APIs3
  9. orderflow: the API4
  10. orderflow: orders and payments8
  11. Django12
  12. orderflow: speed and scale7
  13. Security and quality10
  14. A full project from nothing5

DevOps

  1. Linux servers6
  2. Your own network and Git server5
  3. Automation4
  4. Shipping your code5
  5. Keeping it running6
  6. Kubernetes8
  7. Cloud5
  8. A full project from nothing1

Tools I've used

SQL and MySQL 8
Tables with foreign keys, CHECK and UNIQUE rules, joins, subqueries, grouping, views, functions, triggers and scheduled events. (PakBites)
Bash
Pipes, grep, cut, sort and uniq, find, tar, and scripts that check their input and stop on errors. (shell-practice)
Git and GitHub
Branches, issues, pull requests and fixing a merge conflict. (PakBites, shell-practice)
Linux (Ubuntu)
My daily system. journalctl, ps and kill, file permissions. (shell-practice)
Up next
Python by doing, from my study plan.

Contact

I'm looking for remote work. Email me at i.wajidrashid18@gmail.com, or see my code on GitHub. My CV is here (PDF).