Daily Exercises vs. Big Projects: Which is Better for Learning Python?
The Problem
I spent three months grinding Codewars katas. I could solve 6-kyu problems in my sleep. But when I tried to build a simple web scraper? I froze. I didn’t know how to structure a real project, handle dependencies, or organize code across multiple files.
Then I tried the opposite approach. I jumped straight into building a Django web app. Two weeks later, I had copied hundreds of lines of Stack Overflow code I didn’t understand. The app worked, but I learned nothing.
Which approach was right? Neither. I was asking the wrong question.
The Real Answer: It Depends on Your Stage
Daily exercises and big projects serve completely different purposes. Exercises build syntax fluency and pattern recognition. Projects teach architecture and real-world integration. You need both, but the ratio changes as you progress.
Here’s what I discovered after talking to dozens of successful Python learners and analyzing what actually worked.
Phase 1: Foundation (Weeks 1-4)
When you’re starting out, you need daily exercises. Not because they’re fun, but because they build muscle memory.
I started with Codewars at the 8-kyu level, the easiest. My first kata was embarrassingly simple:
# Kata: Return the sum of two numbers# Difficulty: 8-kyu (beginner)def add(a, b): return a + bTrivial, right? But doing 5-10 of these daily taught me:
- How to read function signatures
- Basic Python syntax
- Common patterns (returning values, type conversion)
Within two weeks, I progressed to 7-kyu problems:
# 7-kyu: Reverse words in a stringdef reverse_words(text): return ' '.join(word[::-1] for word in text.split(' '))This taught me string manipulation, list comprehensions, and built-in methods. Each kata took 10-30 minutes, perfect for daily practice.
Time commitment: 30-60 minutes daily
Focus areas: Syntax, built-in functions, basic data structures
Platforms that worked:
| Platform | Best For | Difficulty |
|---|---|---|
| Codewars | Daily exercises | 8-kyu (easy) to 1-kyu (hard) |
| Advent of Code | Structured puzzles | Progressive day by day |
| Exercism | Mentor-guided practice | Multiple tracks |
Phase 2: Integration (Weeks 5-8)
Once I had syntax down, exercises alone felt hollow. I could reverse strings all day, but I couldn’t build anything useful. This is where mini-projects bridge the gap.
Mini-projects apply 2-3 concepts together. Not complicated applications, just small things that connect what you’re learning to actual outcomes.
My first mini-project was a file organizer for my messy Downloads folder:
import osfrom pathlib import Path
def organize_downloads(source_dir, rules): """Move files to folders based on extension.""" for file in Path(source_dir).iterdir(): if file.is_file(): ext = file.suffix.lower() for folder, extensions in rules.items(): if ext in extensions: target = Path(source_dir) / folder target.mkdir(exist_ok=True) file.rename(target / file.name) break
# Usagerules = { 'Images': ['.jpg', '.png', '.gif'], 'Documents': ['.pdf', '.docx', '.txt'], 'Code': ['.py', '.js', '.html']}
organize_downloads('/Users/username/Downloads', rules)This project taught me:
- The
pathlibmodule (I’d only used strings before) - File operations and safety checks
- How to structure a script with functions
- Real debugging (I broke things multiple times)
I continued daily exercises but at higher difficulty (6-kyu). The key was balance: exercises for skills, mini-projects for context.
Phase 3: Application (Weeks 9+)
After two months of exercises and mini-projects, I was ready for something bigger. But here’s the trap: most beginners pick projects they don’t care about.
A Reddit user said it perfectly: “I got bored making calculator apps and web apps to store recipes, but I can do ML stuff all day long.”
Your big project needs to align with your actual interests. For me, that was tracking prices on products I wanted to buy:
import requestsfrom bs4 import BeautifulSoupimport sqlite3import timefrom datetime import datetime
class PriceTracker: def __init__(self, db_path='prices.db'): self.conn = sqlite3.connect(db_path) self._init_db()
def _init_db(self): cursor = self.conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS prices ( id INTEGER PRIMARY KEY, product_name TEXT, url TEXT, price REAL, checked_at TIMESTAMP ) ''') self.conn.commit()
def track(self, url, selector, name): """Add a product to track.""" cursor = self.conn.cursor() cursor.execute( 'INSERT INTO prices (product_name, url) VALUES (?, ?)', (name, url) ) self.conn.commit()
def check_prices(self): """Check all tracked products.""" cursor = self.conn.cursor() cursor.execute('SELECT id, product_name, url FROM prices') products = cursor.fetchall()
for product_id, name, url in products: try: response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') price_element = soup.select_one('.price') # Adjust selector if price_element: price = float(price_element.text.replace('$', '')) cursor.execute( 'INSERT INTO prices (product_name, url, price, checked_at) VALUES (?, ?, ?, ?)', (name, url, price, datetime.now()) ) self.conn.commit() except Exception as e: print(f"Error checking {name}: {e}")
def get_history(self, product_name): """Return price history for analysis.""" cursor = self.conn.cursor() cursor.execute( 'SELECT price, checked_at FROM prices WHERE product_name = ? AND price IS NOT NULL ORDER BY checked_at', (product_name,) ) return cursor.fetchall()
def close(self): self.conn.close()This project connected everything:
- Web scraping with
requestsandBeautifulSoup - Database operations with
sqlite3 - Class design and object-oriented programming
- Error handling for real-world scenarios
- Scheduling and automation
I still did daily exercises, but only as warm-ups. The project became my main learning vehicle.
Why This Hybrid Approach Works
The debate between exercises and projects misses the real issue: engagement. A project you care about (even small) beats a large project you find boring. Daily exercises build “muscle memory” for syntax, but projects teach you how pieces fit together.
Here’s the progression that worked for me and many others:
- Exercises first: Build syntax fluency before tackling architecture
- Mini-projects second: Connect concepts in realistic contexts
- Interest-driven project third: Sustained motivation through genuine interest
Common Mistakes I Made
Starting Too Big
I tried to build a full web app before understanding functions. Result: copy-pasting without learning. Start with projects that fit in one file.
Exercise Addiction
I did only Codewars katas for three months. I could solve algorithm puzzles but couldn’t build anything complete. Projects teach what exercises can’t.
Generic Projects
Building yet another to-do list when I had no interest in productivity apps. These projects die within a week because you don’t care about the outcome.
Skipping Fundamentals
Jumping to Django/Flask without understanding Python’s standard library. The framework does the work; you don’t learn.
No Progression
Staying at the same difficulty level instead of gradually increasing challenge. Growth happens at the edge of comfort.
Platform Recommendations by Goal
| Your Goal | Start With | Progress To |
|---|---|---|
| Job interviews | LeetCode easy | LeetCode medium + system design |
| Data science | Basic exercises | Kaggle competitions |
| Web development | Flask basics | Django + deployment |
| Automation | os/pathlib exercises | Real workflow scripts |
| General Python | Codewars 8-kyu | Advent of Code + personal projects |
A 30-Day Action Plan
Week 1: Build the habit
- 30 minutes daily on Codewars (start at 8-kyu)
- No projects yet
- Focus on reading error messages
Week 2: Increase difficulty
- Move to 7-kyu and 6-kyu problems
- Start your first mini-project (file organizer, calculator, simple scraper)
- Spend 20 minutes exercises, 40 minutes project
Week 3: Bridge the gap
- Continue exercises as warm-up only
- Finish mini-project
- Plan your interest-driven project
Week 4: Apply everything
- Start your big project
- Use exercises only for specific skills you lack
- Build something you actually want to use
The Bottom Line
Start with daily exercises to build syntax fluency. Progress to mini-projects that connect concepts. Then tackle a project aligned with your genuine interests.
The key isn’t choosing between exercises and projects. It’s choosing the right approach for your current stage, then evolving as you grow.
What matters most: choose projects that motivate you. I can slog through boring exercises for weeks, but a boring project kills my momentum in days. Your passion project is your fastest path to competence.
Final Words + More Resources
My intention with this article was to help others share my knowledge and experience. If you want to contact me, you can contact by email: Email me
Here are also the most important links from this article along with some further resources that will help you in this scope:
- 👨💻 Codewars
- 👨💻 Advent of Code
- 👨💻 Kaggle
- 👨💻 r/learnpython
- 👨💻 LeetCode
Oh, and if you found these resources useful, don’t forget to support me by starring the repo on GitHub!
Comments