Skip to content
PHP2Shell: The PHP Bug
Akshay Thakare

Data Engineer / GenAI & Agentic AI Builder

Portrait of Akshay Thakare
Fig. 1

AkshayThakare

Building scalable data pipelines, exploring intelligent AI systems, and sharing practical engineering knowledge.

Watch the tutorials on YouTube
Two disciplines, one enginehover a gear
SQLDataengineeringLLMsRAGAIengineeringwhere they mesh

Data engineering

Pipelines, warehouses and the reliability that makes data trustworthy.

Python, SQL, Apache Spark, Kafka, Apache Airflow, Snowflake, Databricks, AWS Glue

AI engineering

LLM apps, retrieval and agents that do useful work with that data.

LLMs, RAG, LangChain, LangGraph, MCP, Claude, Hugging Face

~/start

Start here

Pick the path that matches where you are today.

~/notes

Find your starting point

Pick a goal and where you are today. You get a short reading list, in order, that you can start right now.

My goal
Where I am

The tools behind every project

From ingestion and warehousing to retrieval and agents — taught with the same stack used in production.

  • Python
  • SQL
  • Apache Spark
  • AWS Glue
  • Amazon S3
  • AWS Lambda
  • Snowflake
  • Databricks
  • Apache Airflow
  • Kafka
  • PostgreSQL
  • MongoDB
  • Delta Lake
  • Step Functions
  • Power BI
  • Docker
  • LLMs
  • RAG
  • LangChain
  • LangGraph
  • MCP
  • Claude
  • Hugging Face
  • Ollama
  • Qdrant
  • Vector search
  • AI agents
  • CrewAI
  • MLflow
  • FastAPI
  • PyTorch
  • LoRA / QLoRA
~/projects

Flagship case study

One project documented end to end — architecture, code, failure handling and an honest record of what has and hasn’t been run.

🚀 Walmart Data Engineering Project | End-to-End AWS & Snowflake Pipeline

An end-to-end retail pipeline built on synthetic data. Point-of-sale transactions in PostgreSQL and inventory in MongoDB are extracted by arrival time. Every store-day is reconciled against the store's close report, and daily sales and inventory KPIs are MERGEd into Snowflake. The local reference is verified by 12 passing tests; the AWS and Snowflake code is supplied but not yet run in the cloud.

PythonPySparkPostgreSQLMongoDBDockerAWS GlueAmazon S3AWS LambdaDynamoDBSnowflake

3

Tested locally

9

Code supplied

1

Planned

10 chapters

  1. 01Overview & the retail problem
  2. 02Architecture & why each service
  3. 03Source systems & synthetic data
  4. 04Incremental extract & raw validation
  5. 05Reconciliation, late data & transformation
  6. 06Snowflake COPY INTO & MERGE
10 chapters
~/interview

Interview question of the day

One question a day. Think about your answer first, then check it.

· Data engineering

How does SCD Type 2 keep history?

More interview questions

~/notes

Technical notes

Short, precise explanations of the concepts that come up in real pipelines and real interviews.

All notes
~/new

What’s new

The latest notes, videos and projects, newest first.

RSS
  1. Video: PHP2Shell: The PHP Bug
  2. Note: Data Pipeline Observability: Freshness, Volume and Quality
  3. Note: Exactly-Once Is a Myth; Idempotency Is the Answer
  4. Note: System Design: A Daily Batch Pipeline, Step by Step
  5. Note: NULL in SQL: The Rules That Break Queries
  6. Note: Indexes and Query Plans: Why a Query Is Slow
~/roadmaps

Learning paths

Follow a sequence instead of a pile of links. Two tracks, one engineer: each step opens a note you can read today.

~/interview

Interview preparation

Answers that explain the decision, the reason, the evidence and the limit — not one-liners.

Choose a question

Swipe to browse
See all interview questions

Interview answer

01 / 06

Why can a JOIN silently inflate your totals?

Joining two child tables of the same parent multiplies rows.

One order line joined to two payment rows becomes two rows, so revenue doubles.

State the grain of every table and aggregate to a shared grain before joining.

Visual walkthrough

join fan-out
order_lines — one row per line
O101line 1₹300
payments — one row per attempt
O101P101FAILED
O101P102SUCCESS
lines JOIN payments ON order_id
line 1P101₹300
line 1P102₹300
SUM(line_revenue)₹0

Wrong: the single ₹300 line is counted once per payment attempt.

Fix: aggregate payments to one row per order first

line 1 · paid ✓ · ₹300 → SUM = ₹300

One order line, two payment attempts: a direct join doubles the revenue. Aggregating payments to order grain first keeps one row per line.
~/about

About me

Senior Data Engineer with experience of designing and delivering scalable data platforms, real-time streaming pipelines and production-grade AI systems. I work across PySpark, Databricks Lakehouse, Delta Lake, Apache Kafka and AWS, and I build with Generative AI — fine-tuning open LLMs with LoRA/QLoRA and shipping LangChain + FAISS RAG pipelines. I created Datainteg.io, an open-source data engineering lab, and I teach everything I build on my YouTube channel.

PySparkApache SparkDatabricksDelta LakeApache KafkaAWS GlueAWS EMRAmazon S3AWS LambdaSnowflakeApache AirflowPythonSQLPostgreSQL
Full profile

Get new projects and notes by email

I email when something substantial ships — by hand, not on a schedule. No tracking pixels, and every email has an unsubscribe link.