Python course Β· Module 12: Final Project
Career Preparation
In this lesson5
Congratulations! You have completed Python Safari. You have twelve locations behind you, but a certificate alone has never hired anyone. A recruiter has a few dozen seconds for your CV, and a technical interview will include questions that check whether you understand what you write. Now it is time to turn your skills into a first job. We will prepare a CV, a LinkedIn profile, answers to typical questions and a list of places worth searching for offers.
CV for a Python Developer
A good developer CV is short and concrete: contact details with a link to GitHub, a one-sentence summary, skills grouped into categories and projects with results. Here is a template:
1# John Smith
2Python Developer | AI/ML Specialist
3
4john@example.com | linkedin.com/in/john | github.com/john
5
6## Summary
7Python developer with experience in building AI/ML applications.
8Specialization: RAG systems, FastAPI, Machine Learning.
9
10## Skills
11
12**Languages:** Python, JavaScript, SQL
13**Frameworks:** FastAPI, Django, React
14**AI/ML:** LlamaIndex, LangChain, PyTorch, scikit-learn
15**Databases:** PostgreSQL, Qdrant, Redis
16**Tools:** Docker, Git, GitHub Actions, AWS
17
18## Projects
19
20### AI Document Assistant | [GitHub](link) | [Demo](link)
21- RAG system for searching documents
22- Tech: FastAPI, LlamaIndex, Qdrant, OpenAI
23- Results: <2s response time, 92% accuracy
24
25### ML Pipeline | [GitHub](link)
26- End-to-end ML pipeline with MLflow
27- Tech: scikit-learn, XGBoost, MLflow, Docker
28- Results: 15% improvement in accuracy
29
30## Education
31
32**Python Safari** - CodeWorlds (2024)
33- 12-module Python and AI course
34- Capstone: AI Document Assistant
35
36## Certifications
37- [Certificate name]The Projects section matters more than Education, because it shows what you have built. The numbers in the "Results" fields show the format, they are not ready values: enter only what you really measured in your project. A recruiter may ask about any number in the interview. Early in your career, keep the CV to one page and send it as a PDF so the formatting does not fall apart on the other side.
LinkedIn Optimization
LinkedIn works like a search engine, recruiters search by keywords in the headline and the About section. The headline is not just a job title, it is a list of technologies:
1## Headline
2Python Developer | AI/ML | FastAPI | Building intelligent applications
3
4## About
5Passionate Python developer specializing in AI applications.
6
7RAG Systems & LLM Integration
8FastAPI & Async Python
9Machine Learning Pipelines
10
11Currently building: AI Document Assistant - semantic search for documents.
12
13Open to opportunities in AI/ML development.
14
15## Featured
16- Link to your best project
17- An article/post about technology
18- A certificate/diplomaThe Featured section is the place for a link to your best project. One well-described project with a demo says more than a list of twenty technologies. Also add a link to GitHub in your contact details, because that is exactly where a recruiter will go looking for proof of your skills.
Interview Preparation
A technical interview for a Python developer usually covers four areas. Let's go through them one by one. The first is language fundamentals, and the classic question is about the GIL:
1# Typical technical questions
2
3# 1. Python fundamentals
4def explain_gil():
5 """
6 GIL (Global Interpreter Lock) - a mechanism in CPython
7 that allows only one thread to execute
8 Python bytecode at any given time.
9
10 Solutions:
11 - multiprocessing for CPU-bound tasks
12 - asyncio for I/O-bound tasks
13 - alternative interpreters (PyPy)
14 """
15 passIn standard CPython, the GIL (Global Interpreter Lock) allows only one thread at a time to execute Python bytecode. Threads therefore will not speed up CPU-heavy computation. It is worth adding that since Python 3.13 there is a separate free-threaded build without the GIL (PEP 703), officially supported in 3.14 (PEP 779) but still optional. The second area is asynchronous programming:
1# 2. Async Python
2async def explain_async():
3 """
4 async/await - Python's concurrency model.
5 - async def - defines a coroutine
6 - await - waits for the result of an async operation
7 - Ideal for I/O-bound operations
8 """
9 passThe asyncio module provides support for async/await. The rule to remember: async/await for I/O-bound operations (network, database, files), multiprocessing for CPU-bound work. The third area is design patterns, which you know from the architecture lesson:
1# 3. Design Patterns
2def explain_patterns():
3 """
4 Most important patterns:
5 - Repository Pattern - data access abstraction
6 - Dependency Injection - loose coupling
7 - Factory Pattern - object creation
8 - Observer Pattern - reactivity
9 """
10 passIn an interview, the name of a pattern is not enough, show an example from your own project, such as DocumentRepository. The fourth area is system design:
1# 4. System Design
2def design_rag_system():
3 """
4 Components:
5 1. API Gateway - routing, auth
6 2. RAG Service - query processing
7 3. Vector Database - embeddings storage
8 4. LLM Service - text generation
9 5. Cache - Redis for frequent queries
10 6. Monitoring - Prometheus + Grafana
11 """
12 passThis is exactly the architecture of your capstone project. Explain why you chose each component, because that is what they will ask about.
There will also be questions about tools. You create a virtual environment with python -m venv .venv and activate it on Linux and macOS with source .venv/bin/activate. The requirements.txt file lists the dependencies with their versions. In FastAPI, Pydantic validates data and defines request and response models. By default, pytest discovers test_*.py and *_test.py files.
Where to Look for Jobs
The last step is knowing where to hunt for offers. Job sites change over time (GitHub Jobs and Stack Overflow Jobs no longer exist), so treat this list as a starting point:
1## Junior/Mid Python Developer
2
31. **LinkedIn Jobs** - best source
42. **NoFluffJobs** - Polish IT market
53. **JustJoinIT** - startups and corporations
64. **Bulldogjob** - Polish IT job board
75. **Wellfound** (formerly AngelList Talent) - startups, international offers
8
9## Freelance
10
111. **Upwork** - long-term projects
122. **Toptal** - premium, requires verification
133. **Fiverr** - smaller projects
14
15## Open Source
16
171. Contribute to projects you use
182. Build your reputation
193. Network with developersOpen source is an often underrated path: a contribution to a library you use is public proof of your skills and a way to meet experienced developers.
Next Steps
The plan for the coming weeks is simple: complete the Capstone Project, publish it on GitHub, update your CV and LinkedIn, apply for positions and keep learning. My advice: do not wait until you feel "ready". Apply once you have one solid project, because interviews themselves are the best training.
Remember: this is not the end, it is the beginning of your Python adventure, and every future expedition starts with the map you drew in this module.
Code for this lesson: main.py
1# ===========================================
2# Safari Capstone: Core Service Layer
3# ===========================================
4# Implement the core business logic service that
5# manages wildlife operations and analytics.
6
7from dataclasses import dataclass, field
8from datetime import datetime
9from typing import Optional
10import json
11
12# --- Models ---
13@dataclass
14class Animal:
15 animal_id: str
16 species: str
17 name: str
18 weight_kg: float
19 region: str
20
21@dataclass
22class Observation:
23 obs_id: str
24 animal_id: str
25 latitude: float
26 longitude: float
27 observer: str
28 timestamp: str = ""
29
30# --- Repository ---
31class AnimalRepository:
32 def __init__(self):
33 self._data = {}
34
35 def save(self, animal): self._data[animal.animal_id] = animal
36 def get(self, aid): return self._data.get(aid)
37 def get_all(self): return list(self._data.values())
38 def delete(self, aid): return self._data.pop(aid, None) is not None
39 def find_by_species(self, sp):
40 return [a for a in self._data.values() if a.species.lower() == sp.lower()]
41
42# --- Core Service ---
43class SafariService:
44 """Core business logic for the safari management system."""
45
46 def __init__(self, repo: AnimalRepository):
47 self.repo = repo
48 self.observations: list[Observation] = []
49 self._next_obs_id = 1
50
51 def register_animal(self, species, name, weight_kg, region) -> Animal:
52 """Register a new animal in the system."""
53 prefix = species[:2].upper()
54 count = len(self.repo.find_by_species(species)) + 1
55 animal_id = f"{prefix}-{count:03d}"
56 animal = Animal(animal_id, species, name, weight_kg, region)
57 self.repo.save(animal)
58 return animal
59
60 def record_observation(self, animal_id, lat, lon, observer) -> Optional[Observation]:
61 """Record a new wildlife observation."""
62 animal = self.repo.get(animal_id)
63 if not animal:
64 return None
65 obs = Observation(
66 obs_id=f"OBS-{self._next_obs_id:04d}",
67 animal_id=animal_id,
68 latitude=lat,
69 longitude=lon,
70 observer=observer,
71 timestamp=datetime.now().isoformat()
72 )
73 self.observations.append(obs)
74 self._next_obs_id += 1
75 return obs
76
77 def get_species_stats(self) -> dict:
78 """Get population statistics grouped by species."""
79 stats = {}
80 for animal in self.repo.get_all():
81 species = animal.species
82 if species not in stats:
83 stats[species] = {"count": 0, "total_weight": 0.0, "regions": set()}
84 stats[species]["count"] += 1
85 stats[species]["total_weight"] += animal.weight_kg
86 stats[species]["regions"].add(animal.region)
87 # Convert sets to lists for JSON compatibility
88 for sp in stats:
89 stats[sp]["avg_weight"] = round(stats[sp]["total_weight"] / stats[sp]["count"], 1)
90 stats[sp]["regions"] = list(stats[sp]["regions"])
91 return stats
92
93 def get_observation_count(self, animal_id: str) -> int:
94 """Count observations for a specific animal."""
95 return sum(1 for o in self.observations if o.animal_id == animal_id)
96
97 def generate_report(self) -> str:
98 """Generate a summary report of all wildlife data."""
99 stats = self.get_species_stats()
100 total_animals = self.repo.get_all()
101 lines = [
102 "=== Safari Wildlife Report ===",
103 f"Total animals tracked: {len(total_animals)}",
104 f"Total observations: {len(self.observations)}",
105 f"Species tracked: {len(stats)}",
106 ""
107 ]
108 for species, data in stats.items():
109 lines.append(f"{species}: {data['count']} animals, "
110 f"avg {data['avg_weight']} kg, "
111 f"regions: {', '.join(data['regions'])}")
112 return "\n".join(lines)
113
114# --- Demo ---
115repo = AnimalRepository()
116service = SafariService(repo)
117
118# Register animals
119service.register_animal("Lion", "Simba", 195.0, "Savanna")
120service.register_animal("Lion", "Nala", 130.0, "Savanna")
121service.register_animal("Elephant", "Tembo", 5200.0, "Forest")
122service.register_animal("Cheetah", "Duma", 52.0, "Grassland")
123
124# Record observations
125service.record_observation("LI-001", -2.33, 34.83, "Dr. Darwin")
126service.record_observation("LI-001", -2.34, 34.84, "Dr. Darwin")
127service.record_observation("EL-001", -2.41, 34.92, "Ranger Kate")
128
129# Generate report
130print(service.generate_report())
131print(f"\nSimba observations: {service.get_observation_count('LI-001')}")
132print(f"\nSpecies stats:")
133print(json.dumps(service.get_species_stats(), indent=2))
134
135# TODO: Add a method to find the most observed animal
136# def most_observed_animal(self) -> Optional[str]:
137# counts = {}
138# for obs in self.observations:
139# counts[obs.animal_id] = counts.get(obs.animal_id, 0) + 1
140# if not counts:
141# return None
142# return max(counts, key=counts.get)
143
144# TODO: Add data export functionality
145# def export_data(self, format="json") -> str:
146# data = {
147# "animals": [vars(a) for a in self.repo.get_all()],
148# "observations": [vars(o) for o in self.observations],
149# "stats": self.get_species_stats()
150# }
151# return json.dumps(data, indent=2, default=str)
152Spotted a mistake in this lesson?
Check yourself
Answer the questions from this lesson. Pick an answer to see right away whether it is correct.
1. What is GIL in Python?
2. What does asyncio provide in Python?
These are 2 of 5 questions for this lesson. Solve the rest in the game.
Hands-on tasks in the game
- Horizontal ordering
Arrange the command to create a Python virtual environment:
- Click in order
Click the elements to build the venv activation command (Linux/Mac):
- Code editor
Write a GitHub Actions configuration for CI of a Python project
- Code editor
Create the initial structure of the Capstone Project with the main module and configuration
- Code editor
Implement the core AI service with a prediction method
- Code editor
Create a REST API layer using FastAPI for the capstone project
- Code editor
Write tests for the capstone project using pytest