অধ্যায় 5 · প্রজেক্ট ও পরের ধাপ
সারসংক্ষেপ, চিট শিট ও এরপর কী
- পৃষ্ঠা 22 / 22
- 14 মিনিট পড়া
এই টিউটোরিয়াল শুরু করার সময় আপনি Git ব্যবহার করেননি, সার্ভারও বানাননি। এখন আপনি টার্মিনালে কাজ করতে পারেন, প্রজেক্টকে Git হিস্ট্রিতে রাখতে পারেন, প্রকাশ করতে পারেন, Python থেকে নিরাপদে ওয়েব API কল করতে পারেন, FastAPI দিয়ে নিজের API বানিয়ে ভ্যালিডেট করতে পারেন, আর টেস্ট দিয়ে প্রমাণ করতে পারেন যে সেটা কাজ করে। এই পাতায় সবকিছু এক জায়গায়: কাজের সময় খুলে রাখার চিট শিট, একটা শব্দকোষ, যে ভুলগুলোতে নতুনদের সবচেয়ে বেশি সময় যায়, আর এরপর কী।
যা শিখবেন
- পুরো বিগিনার টিউটোরিয়ালের কমান্ড আর ধারণা এক পাতায়, কাজ ধরে সাজানো।
- AI ব্যাকএন্ডের কাজে বারবার সামনে আসবে এমন শব্দের শব্দকোষ।
- নিজেকে যাচাই করার জন্য সাধারণ ভুলের তালিকা, আর কীভাবে অনুশীলন চালিয়ে যাবেন।
- অ্যাডভান্সড টিউটোরিয়ালে কী আছে, আর AI পথ এরপর কোথায় যায়।
এখন আপনি যা পারেন
- টার্মিনালে চলাফেরা, এনভায়রনমেন্ট ভেরিয়েবল সেট করা, ভার্চুয়াল এনভায়রনমেন্ট বা uv প্রজেক্ট বানানো, আর সিক্রেট কোডের বাইরে রাখা।
- স্পষ্ট বার্তাসহ কমিট বানানো, হিস্ট্রি ও ডিফ পড়া, কাজ না হারিয়ে ভুল শোধরানো, আর ব্রাঞ্চ ও মার্জ ব্যবহার করা।
- রিমোটে push করা, পুল রিকোয়েস্ট খোলা, আর কাজের README লেখা।
- রিকোয়েস্ট ও রেসপন্স ব্যাখ্যা করা, ঠিক মেথড ও স্ট্যাটাস কোড বেছে নেওয়া, আর
curlদিয়ে API পরীক্ষা করা। - টাইমআউট, রিট্রাই ও পেজিনেশনসহ Python থেকে API কল করা, আর ইনপুট ভ্যালিডেট করে ঠিক এরর ফেরত দেওয়া FastAPI সার্ভিস বানানো।
- নকল আপস্ট্রিম দিয়ে pytest টেস্ট লেখা, আর রিভিউ হওয়া পুল রিকোয়েস্টের মাধ্যমে ফলাফল প্রকাশ করা।
চিট শিট ১: টার্মিনাল, এনভায়রনমেন্ট ও প্যাকেজ
| কাজ | কমান্ড |
|---|---|
| আমি কোথায়, এখানে কী আছে | pwd, ls -la |
| চলাফেরা | cd folder, cd .., cd ~, cd - |
| বানানো, কপি, সরানো, মোছা | mkdir -p a/b, touch f, cp a b, mv a b, rm f, rm -r folder (ফেরানোর উপায় নেই: রিসাইকেল বিন নেই) |
| ফাইলের ভেতরটা দেখা | cat f, head -n 5 f, tail -n 5 f, grep -n "text" f |
| পাইপ ও রিডাইরেকশন | cmd1 | cmd2 (আউটপুট ইনপুটে), > f (ওভাররাইট), >> f (শেষে যোগ), 2>&1 (এররসহ) |
| সাহায্য | cmd --help, man cmd |
| এনভায়রনমেন্ট ভেরিয়েবল | export KEY=value, echo "$KEY", Python-এ os.environ["KEY"] বা os.getenv("KEY") |
| ফাইলে সিক্রেট | .env (কখনো কমিট নয়), python-dotenv দিয়ে পড়া; নকল মানসহ .env.example কমিট করুন |
| venv ও pip | python -m venv .venv, source .venv/bin/activate, pip install -r requirements.txt, pip freeze > requirements.txt |
| uv | uv init, uv add requests, uv add --dev pytest, uv sync, uv run python main.py; ফাইল pyproject.toml ও uv.lock |
| Windows-এ | Git Bash / WSL / macOS / Linux | PowerShell |
|---|---|---|
| ভেরিয়েবল সেট করা | export KEY=value | $env:KEY = "value" |
| venv চালু করা | source .venv/bin/activate | .venv\Scripts\Activate.ps1 |
| ফাইল দেখা | cat f | Get-Content f |
চিট শিট ২: Git ও GitHub
| কাজ | কমান্ড |
|---|---|
| একবারের সেটআপ | git config --global user.name "Nadia Rahman", git config --global user.email "nadia@example.com", git config --global init.defaultBranch main |
| রিপোজিটরি শুরু | git init, অথবা git clone URL |
| অবস্থা দেখা | git status, git status --short |
| স্টেজ ও কমিট | git add file, git add -p, git commit -m "Add course filter" |
| হিস্ট্রি | git log --oneline --graph --decorate --all, git show <hash> |
| পার্থক্য | git diff (স্টেজ না করা), git diff --staged, git diff main...feature |
| ফাইল উপেক্ষা | .gitignore; যাচাই git check-ignore -v file; ট্র্যাকিং বন্ধ git rm --cached file |
| স্টেজ না করা পরিবর্তন বাতিল | git restore file |
| স্টেজ থেকে নামানো | git restore --staged file |
| শেষ কমিট ঠিক করা | git commit --amend (push না করা থাকলে) |
| কমিট ফেরানো | git reset --soft HEAD~1 (পরিবর্তন স্টেজড থাকে), --mixed (ডিফল্ট, পরিবর্তন থাকে), --hard (পরিবর্তন ফেলে দেয়); শেয়ার করা হিস্ট্রিতে git revert <hash> |
| ব্রাঞ্চ | git branch, git switch -c feature/x, git switch main, git branch -d feature/x |
| মার্জ | git switch main, git merge feature/x (মার্জ কমিটের জন্য --no-ff); কনফ্লিক্ট হলে চিহ্নিত ফাইল ঠিক করুন, git add, git commit |
| রিমোট | git remote add origin URL, git remote -v, git push -u origin branch, git fetch, git pull |
| পুল রিকোয়েস্টের প্রবাহ | ব্রাঞ্চ, কমিট, push, বিবরণসহ PR খোলা, রিভিউ, ফিক্স push, মার্জ, ব্রাঞ্চ মোছা |
| GitHub CLI | gh pr create, gh pr view --web |
| লগইন | fine-grained personal access token দিয়ে HTTPS, অথবা ed25519 কি দিয়ে SSH |
টেবিলের বেশির ভাগের পেছনের নিয়ম: git restore আর git reset --hard আপনার ওয়ার্কিং ফোল্ডারের ফাইল বদলায়, git revert একটা নতুন কমিট যোগ করে, আর push না করা কমিট এখনো amend করা যায়। নিশ্চিত না হলে আগে একটা ব্রাঞ্চ বানিয়ে নিন: git switch -c backup-এ কোনো খরচ নেই।
চিট শিট ৩: HTTP, curl ও requests
| মেথড | অর্থ | বডি আছে | সাধারণ সফল কোড |
|---|---|---|---|
| GET | রিসোর্স পড়া | না | 200 |
| POST | রিসোর্স বানানো, বা কোনো কাজ চালানো | হ্যাঁ | 201 (তৈরি হয়েছে) বা 200 |
| PUT | রিসোর্স পুরোপুরি বদলে দেওয়া | হ্যাঁ | 200 বা 204 |
| PATCH | রিসোর্সের একটা অংশ বদলানো | হ্যাঁ | 200 |
| DELETE | রিসোর্স সরানো | সাধারণত না | 204 বা 200 |
| স্ট্যাটাস | অর্থ | কী করবেন |
|---|---|---|
| 200 / 201 / 204 | ঠিক আছে / তৈরি হয়েছে / সফল, বডি নেই | এগিয়ে যান |
| 301, 304 | স্থায়ীভাবে সরে গেছে, বদলায়নি (নিজের ক্যাশের কপি ব্যবহার করুন) | নতুন URL অনুসরণ করুন, ক্যাশ ব্যবহার করুন |
| 400 | রিকোয়েস্টের গড়নে গোলমাল | রিকোয়েস্ট ঠিক করুন |
| 401 | পরিচয় প্রমাণ হয়নি (ক্রেডেনশিয়াল নেই বা ভুল) | ঠিক কি বা টোকেন পাঠান |
| 403 | পরিচয় প্রমাণ হয়েছে, কিন্তু অনুমতি নেই | অনুমতি চান; আবার চেষ্টা করে লাভ নেই |
| 404 | এমন রিসোর্স নেই | URL আর আইডি দেখুন |
| 409 | বর্তমান অবস্থার সাথে সংঘাত | সংঘাত মেটান (যেমন ডুপ্লিকেট) |
| 422 | গড়ন ঠিক, কিন্তু মানগুলো অবৈধ | এররের তালিকা পড়ুন, ফিল্ড ঠিক করুন |
| 429 | অনেক বেশি রিকোয়েস্ট | Retry-After পর্যন্ত অপেক্ষা করে আবার চেষ্টা করুন |
| 500 | সার্ভারে বাগ আছে | আপনার রিকোয়েস্টের দোষ নয়: জানান, দরকারে রিট্রাই করুন |
| 502, 503 | Bad Gateway (আপস্ট্রিম থেকে খারাপ রেসপন্স), Service Unavailable (সার্ভিস সাময়িকভাবে বন্ধ) | ব্যাকঅফসহ রিট্রাই করুন |
প্রথম অঙ্কটা পরিবার: 2xx সফল, 3xx রিডাইরেক্ট, 4xx ক্লায়েন্ট ভুল করেছে, 5xx সার্ভার ভুল করেছে। তাই 4xx সাধারণত রিট্রাই করার যোগ্য নয়, কিন্তু 429 বা 503 তা-ই।
| কাজ | curl | requests |
|---|---|---|
| GET | curl -s URL | requests.get(url, timeout=5) |
| কোয়েরি স্ট্রিং | curl -s "URL?level=beginner" | params={"level": "beginner"} |
| হেডার | -H "X-API-Key: key" | headers={"X-API-Key": key} |
| বেয়ারার টোকেন | -H "Authorization: Bearer TOKEN" | headers={"Authorization": f"Bearer {token}"} |
| JSON বডি | -X POST -H "Content-Type: application/json" -d '{"a": 1}' | requests.post(url, json={"a": 1}, timeout=5) |
| স্ট্যাটাস ও হেডার | -i (হেডারসহ), -v (পুরো আদান-প্রদান), -w "%{http_code}" | r.status_code, r.headers |
| বডি পার্স করা | | python -m json.tool | r.json() |
| 4xx/5xx-এ ব্যর্থ হওয়া | --fail | r.raise_for_status() |
| নির্ভরযোগ্যতার নিয়ম | কোডে |
|---|---|
| সবসময় টাইমআউট দিন (requests-এ ডিফল্ট কোনো টাইমআউট নেই) | timeout=5, বা কানেক্ট ও রিডের জন্য (3, 10) |
| ঠিক এরর ধরুন | requests.exceptions.Timeout, ConnectionError, HTTPError, সবই RequestException-এর নিচে |
| যা পরে সফল হতে পারে শুধু তা-ই রিট্রাই করুন | 429, 502, 503, 504 আর টাইমআউট; কখনো 400, 401, 403, 404, 422 নয় |
| রিট্রাইয়ের মাঝে ব্যাকঅফ | ১ সেকেন্ড, ২ সেকেন্ড, ৪ সেকেন্ড, ... অপেক্ষা করুন, আর Retry-After মানুন |
| কানেকশন আবার ব্যবহার | session = requests.Session() |
| সব পেজ পড়া | রেসপন্সে next_page থাকা পর্যন্ত লুপ, পেজের সীমাসহ |
| কি আসে এনভায়রনমেন্ট থেকে | os.environ["API_KEY"], কোডে কখনো স্ট্রিং নয় |
চিট শিট ৪: FastAPI, Pydantic ও pytest
| কাজ | কোড |
|---|---|
| অ্যাপ বানানো, চালানো | app = FastAPI(); fastapi dev (রিলোডসহ, ডেভেলপমেন্টের জন্য), fastapi run main.py --port 8000 (চালানোর জন্য) |
| একটা রাউট | @app.get("/courses/{course_id}") তারপর def get_course(course_id: int): ... |
| কোয়েরি প্যারামিটার | def list_courses(level: str | None = None, page: int = 1) |
| রিকোয়েস্ট বডি | def create(review: ReviewIn), যেখানে ReviewIn(BaseModel) |
| সীমাবদ্ধতা | rating: int = Field(ge=1, le=5), text: str = Field(min_length=3, max_length=500) |
| রেসপন্সের আকার | @app.post("/reviews", response_model=ReviewOut, status_code=201) |
| এরর ছোড়া | raise HTTPException(status_code=404, detail="Course not found") |
| স্বয়ংক্রিয় ডকুমেন্টেশন | /docs (Swagger UI), /redoc, /openapi.json |
| টেস্ট ক্লায়েন্ট | client = TestClient(app), তারপর client.get("/health"); ইনস্টল pip install pytest httpx2 বা uv add --dev pytest httpx2 |
| টেস্ট চালানো | pytest -q, pytest -k name, pytest -x (প্রথম ব্যর্থতায় থামে) |
| ডিপেন্ডেন্সি নকল করা | monkeypatch.setattr(module, "function", fake); নামটা প্যাচ করুন যেখানে সেটা খোঁজা হয় |
| অনেক কেস, একটা টেস্ট | @pytest.mark.parametrize("value, expected", [...]) |
| সবার জন্য সেটআপ | conftest.py-এর ফিক্সচার |
রাউট ডেটা ফেরত দেয়, আর FastAPI সেটাকে ঠিক Content-Type-সহ JSON বানিয়ে দেয়। অবৈধ ইনপুট আপনার ফাংশন পর্যন্ত পৌঁছায় না: Pydantic সেটাকে 422 দিয়ে ফিরিয়ে দেয়, যেখানে প্রতিটা সমস্যা তালিকাভুক্ত। রিকোয়েস্টের জীবনচক্র সব ব্যাকএন্ডে একই: রিকোয়েস্ট পার্স করা, ভ্যালিডেট করা, নিজের লজিক চালানো, রেসপন্স সাজানো, স্ট্যাটাস কোড বসানো।
কোডে চিট শিট চেষ্টা করুন
যে চিট শিট শুধু পড়া হয়, এক সপ্তাহে ভুলে যাওয়া হয়। এই ছোট প্রোগ্রাম আপনাকে স্ট্যাটাস কোড নিয়ে কুইজ করে। এতে কোডের একটা নির্দিষ্ট তালিকা আছে, তাই যতবার চালান, উত্তর একই আসবে:
STATUS = {
200: "OK",
201: "Created",
204: "No Content",
400: "Bad Request",
401: "Unauthorized",
403: "Forbidden",
404: "Not Found",
409: "Conflict",
422: "Unprocessable Content",
429: "Too Many Requests",
503: "Service Unavailable",
}
FAMILY = {2: "success", 3: "redirection", 4: "client error", 5: "server error"}
def describe(code):
return f"{code} {STATUS[code]} ({FAMILY[code // 100]})"
def should_retry(code):
# শুধু যে সমস্যা নিজে থেকে মিটে যেতে পারে, সেটাই রিট্রাই করার যোগ্য।
return code in (429, 502, 503, 504)
for code in (200, 404, 422, 429, 503):
print(describe(code), "-> retry" if should_retry(code) else "-> do not retry")200 OK (success) -> do not retry
404 Not Found (client error) -> do not retry
422 Unprocessable Content (client error) -> do not retry
429 Too Many Requests (client error) -> retry
503 Service Unavailable (server error) -> retryলক্ষ করুন, রিট্রাইয়ের নিয়মটা মাত্র একটা লাইন। নিয়মটা ফাংশন হিসেবে লিখে রাখা আর চিট শিটে লিখে রাখা একই অভ্যাস, শুধু ফাংশনটা আপনি টেস্ট করতে পারেন। দ্বিতীয় একটা হেল্পার, যা এই টিউটোরিয়ালকে একটা চেকলিস্টে বদলে দেয়, রিভিউ চাওয়ার আগে পুল রিকোয়েস্টের বিবরণে পেস্ট করার জন্য:
CHECKS = {
"Code": ["Tests pass with the upstream faked", "Every outbound call has a timeout"],
"Git": ["Small commits with clear messages", "No .env, .venv or data files in the diff"],
"Docs": ["README explains what, run, use, test, configure"],
}
def checklist(title):
lines = [f"## Ready to merge: {title}"]
for area, items in CHECKS.items():
lines.append(f"### {area}")
lines.extend(f"- [ ] {item}" for item in items)
return "\n".join(lines)
print(checklist("Data Explorer API"))## Ready to merge: Data Explorer API
### Code
- [ ] Tests pass with the upstream faked
- [ ] Every outbound call has a timeout
### Git
- [ ] Small commits with clear messages
- [ ] No .env, .venv or data files in the diff
### Docs
- [ ] README explains what, run, use, test, configureশব্দকোষ
| শব্দ | অর্থ |
|---|---|
| টার্মিনাল / শেল | যে উইন্ডোতে কমান্ড টাইপ করেন / যে প্রোগ্রাম কমান্ড পড়ে চালায় (bash, zsh, PowerShell) |
| এনভায়রনমেন্ট ভেরিয়েবল | কোডের বাইরে থাকা নামযুক্ত সেটিং, যেমন API_KEY, রানের সময় পড়া হয় |
| ভার্চুয়াল এনভায়রনমেন্ট | একটা প্রজেক্টের জন্য আলাদা Python প্যাকেজের ব্যক্তিগত ফোল্ডার |
| লক ফাইল | ঠিক কোন ভার্সনগুলো ইনস্টল হয়েছিল (uv.lock), যাতে প্রতিটা মেশিন একই ভার্সন পায় |
| রিপোজিটরি | প্রজেক্ট ফোল্ডার আর তার পুরো হিস্ট্রি, .git-এ রাখা |
| ওয়ার্কিং ট্রি / স্টেজিং এরিয়া | আপনার ফাইল এখন যেমন আছে / পরের কমিটের জন্য বেছে নেওয়া পরিবর্তনের সেট |
| কমিট | প্রজেক্টের একটা স্ন্যাপশট, সাথে বার্তা, লেখক আর তার প্যারেন্টের দিকে একটা পয়েন্টার |
| ব্রাঞ্চ | এক সারি কমিটের একটা সরানো যায় এমন নাম |
| মার্জ কনফ্লিক্ট | দুই ব্রাঞ্চ একই লাইন বদলেছে; ফলাফল আপনি ঠিক করেন |
| রিমোট / origin | রিপোজিটরির আরেকটা কপি, সাধারণত GitHub-এ / তার ডিফল্ট নাম |
| পুল রিকোয়েস্ট | ব্রাঞ্চ মার্জ করার অনুরোধ, বিবরণ আর রিভিউয়ের জায়গাসহ |
| ক্লায়েন্ট / সার্ভার | যে প্রোগ্রাম জিজ্ঞাসা করে / যে প্রোগ্রাম উত্তর দেয় |
| রিকোয়েস্ট / রেসপন্স | সার্ভারে একটা বার্তা (মেথড, URL, হেডার, বডি) / উত্তর (স্ট্যাটাস, হেডার, বডি) |
| এন্ডপয়েন্ট / রাউট | আপনার API-র উত্তর দেওয়া একটা URL ও মেথড, আর তার পেছনের ফাংশন |
| JSON | API যে টেক্সট ফরম্যাটে অবজেক্ট, তালিকা, স্ট্রিং ও সংখ্যা পাঠায় |
| REST | একটা ধরন, যেখানে URL রিসোর্সের নাম বলে আর HTTP মেথড ক্রিয়াপদ |
| API কি / বেয়ারার টোকেন | কলারকে চিহ্নিত করা একটা সিক্রেট, হেডারে পাঠানো |
| টাইমআউট | উত্তরের জন্য আপনি সর্বোচ্চ যতক্ষণ অপেক্ষা করবেন |
| রিট্রাই / ব্যাকঅফ | ব্যর্থতার পর আবার চেষ্টা / প্রতিবার আরও বেশি অপেক্ষা |
| পেজিনেশন | লম্বা তালিকা পেজে পেজে ফেরত দেওয়া |
| আপস্ট্রিম | আপনার সার্ভিস যে সার্ভিসের ওপর নির্ভর করে (ডেটা API, LLM প্রোভাইডার) |
| ভ্যালিডেশন | ব্যবহারের আগে ইনপুট নিয়মের সাথে মেলানো (FastAPI-র জন্য Pydantic করে) |
| ফিক্সচার / মক / নকল | টেস্টের সবার জন্য সেটআপ / একটা বদলি অবজেক্ট / সহজ কিন্তু কাজ করা বদলি, যেমন নকল আপস্ট্রিম |
| CI | কন্টিনিউয়াস ইন্টিগ্রেশন: যে সার্ভার প্রতিটা push-এ আপনার টেস্ট চালায় |
সাধারণ ভুল: একটা পুনরালোচনা
- সিক্রেট কমিট করা। একবার push হলে সেটা ফাঁস, পরে ফাইল মুছলেও। সমাধান: আগে
.gitignore, গড়ন দেখাতে.env.example, আর তবু হয়ে গেলে সবকিছুর আগে কি-টা রোটেট করুন। - না দেখে
git reset --hardবাrm -rচালানো। দুটোই চূড়ান্ত। সমাধান: আগেgit statusআরgit diff, বা একটা ব্যাকআপ ব্রাঞ্চ। - যে হিস্ট্রি অন্যদের কাছে আছে তা নতুন করে লেখা। push হওয়া কমিটে
amendআরresetসহকর্মীদের ঝামেলায় ফেলে। সমাধান: শেয়ার করা ব্রাঞ্চেgit revert। - সরাসরি
main-এ কাজ করা। সমাধান: প্রতিটা পরিবর্তনের জন্য একটা ব্রাঞ্চ, পুল রিকোয়েস্টের মাধ্যমে মার্জ। - টাইমআউট ছাড়া API কল। একটা ধীর আপস্ট্রিম আপনার পুরো সার্ভিস আটকে দিতে পারে। সমাধান: প্রতিটা কলে টাইমআউট, আর তা ঘটলে স্পষ্ট এরর।
- সবকিছু রিট্রাই করা। 401 বা 422 আবার পাঠিয়ে লাভ নেই, আর রেট লিমিটেড সার্ভিসে ঝাঁপিয়ে পড়লে অবস্থা খারাপ হয়। সমাধান: শুধু 429, 5xx আর টাইমআউট রিট্রাই করুন, ব্যাকঅফসহ।
- আপস্ট্রিম যা ফেরত দেয় তা বিশ্বাস করা। ফিল্ড না থাকা, ভুল টাইপ, HTML এরর পেজ, সবই ঘটে। সমাধান: ব্যবহারের আগে Pydantic মডেল দিয়ে রেসপন্স ভ্যালিডেট করুন।
- ভুল স্ট্যাটাস কোড ফেরত দেওয়া।
{"error": ...}-সহ 200 ক্লায়েন্ট ও মনিটরের কাছ থেকে ব্যর্থতা লুকিয়ে রাখে। সমাধান: 201, 404, 422 ও বাকিগুলোর অর্থ আছে; সেগুলো ব্যবহার করুন। - শুধু সুখের পথ টেস্ট করা, বা আসল সার্ভিসের বিরুদ্ধে টেস্ট করা। সমাধান: আপস্ট্রিম নকল করুন, আর টাইমআউট, খারাপ ডেটা ও অবৈধ ইনপুটও টেস্ট করুন।
- কখনো নতুন ক্লোন থেকে না চালানো। সমাধান: শেষ বলার আগে ক্লোন,
uv sync,uv run pytest।
অনুশীলন চালিয়ে যাবেন যেভাবে
- যা-ই লিখুন, Git-এ রাখুন, নোট আর ছোট স্ক্রিপ্টও। অভ্যাস আসে পুনরাবৃত্তি থেকে, পড়া থেকে নয়।
- Data Explorer API বাড়ান: নতুন একটা এন্ডপয়েন্ট, নতুন ফিল্টার, আরও একটা ব্যর্থতার কেস, প্রতিটার জন্য একটা ব্রাঞ্চ, একটা টেস্ট আর একটা পুল রিকোয়েস্ট।
- অন্যদের প্রজেক্ট পড়ুন: GitHub-এ পরিচিত একটা Python রিপোজিটরি খুলে তার README,
.gitignore, টেস্ট আর কমিট হিস্ট্রি পড়ুন। - ইচ্ছে করে ভাঙুন: Practice API বন্ধ করে আপনার টাইমআউট আর এরর দেখুন; ইচ্ছে করে একটা মার্জ কনফ্লিক্ট বানিয়ে মেটান; একটা ফেলনা রিপোজিটরিতে নকল সিক্রেট কমিট করে পরিষ্কার করার অনুশীলন করুন।
- আপনার পছন্দের একটা API (আবহাওয়া সার্ভিস, পাবলিক ডেটাসেট) নিজের ছোট FastAPI সার্ভিসে মুড়ে নিন, ভ্যালিডেশন আর টেস্টসহ।
- অন্য কাউকে বলার আগে নিজের পুল রিকোয়েস্ট নিজে রিভিউ করুন, প্রজেক্টের চেকলিস্ট ধরে।
এরপর কী
পরের টিউটোরিয়াল AI-এর জন্য Git, API ও ব্যাকএন্ড: অ্যাডভান্সড। এটা একই টুলগুলোকে প্রোডাকশন স্তরে নিয়ে যায়, ছয়টা অধ্যায়ে:
- পেশাদারের মতো Git ও GitHub: stash, ইন্টারঅ্যাক্টিভ rebase, cherry-pick, reflog, ট্যাগ ও রিলিজ, টিমের ওয়ার্কফ্লো, আর AI প্রজেক্টের জন্য Git (LFS, DVC, ফাঁস হওয়া সিক্রেট সরানো)।
- API ডিজাইন ও API ক্লায়েন্ট: HTTP গভীরভাবে, OAuth ও টোকেন, পেজিনেশন, রেট লিমিট, আইডেমপোটেন্সি, ওয়েবহুক ও স্ট্রিমিং, আর httpx ও async ক্লায়েন্ট।
- প্রোডাকশন FastAPI: প্রজেক্টের আর্কিটেকচার, ডিপেন্ডেন্সি ও lifespan, মিডলওয়্যার, SQLAlchemy ও Alembic, অথেনটিকেশন, ক্যাশিং ও রেট লিমিটিং, আর পেশাদার টেস্টিং।
- AI সার্ভিস ও নিরাপত্তা: মেশিন লার্নিং মডেল সার্ভ করা, স্ট্রিমিং ও খরচ ট্র্যাকিংসহ LLM অ্যাপ্লিকেশনের ব্যাকএন্ড, আর API নিরাপত্তা।
- চালু করুন: Docker, Docker Compose, GitHub Actions আর ডিপ্লয়মেন্ট।
- অনুশীলন ও ক্যাপস্টোন: নম্বর দেওয়া একটা প্র্যাকটিস ল্যাব, আর একটা ক্যাপস্টোন: প্রোডাকশন-প্রস্তুত একটা AI ব্যাকএন্ড।
তারপর পথ এগোয় Prompt Engineering-এ, যেখানে শেখা হয় LLM থেকে নির্ভরযোগ্য ফল পাওয়া, আর তারপর AI Engineer পথে: LLM API, RAG, এজেন্ট, MCP, ইভ্যালুয়েশন ও LLMOps। এর প্রতিটা বিষয় দাঁড়িয়ে আছে আপনি এখানে যা অনুশীলন করেছেন তার ওপর: নিরাপদে API কল করা, নিজের API সার্ভ করা, আর টেস্ট ও পরিচ্ছন্ন Git হিস্ট্রিসহ সেটা চালু করা।
সারসংক্ষেপ
- টার্মিনাল, এনভায়রনমেন্ট ও uv প্রতিটা প্রজেক্টকে নিজস্ব টুল দেয় আর সিক্রেট কোডের বাইরে রাখে।
- Git স্ন্যাপশট রাখে; ব্রাঞ্চ, পুল রিকোয়েস্ট আর রিভিউ নিরাপদে বদলাতে দেয়, আর restore, reset ও revert ভুল শোধরায়।
- HTTP মানে মেথড, স্ট্যাটাস কোড, হেডার আর বডি;
curlওrequestsদিয়ে তাতে কথা বলা যায়, প্রতিবার একটা টাইমআউট, একটা রিট্রাইয়ের নিয়ম আর ভ্যালিডেশনসহ। - FastAPI ও Pydantic Python ফাংশনকে ঠিক স্ট্যাটাস কোডসহ ভ্যালিডেটেড এন্ডপয়েন্ট বানায়; নকল আপস্ট্রিমসহ pytest সেগুলোকে সৎ রাখে।
- আসল প্রজেক্টে অনুশীলন করুন, আর যখন পাতা না খুলেই Data Explorer API শূন্য থেকে বানাতে পারবেন, তখন অ্যাডভান্সড টিউটোরিয়ালে এগিয়ে যান।
এরপর: AI-এর জন্য Git, API ও ব্যাকএন্ড: অ্যাডভান্সড, তারপর Prompt Engineering।