THE FUTURE MARKETACADEMY
Your classroomRoom 07 · Tech Lab
School of Data & Tech

Python Engineering: disenyo, review at mentoring

Step 8 of 8 in Tech Lab

Next in your path: 7.6.4 Web Business Lead: manage client sites

What you'll be able to do
  • Magdisenyo ng Python code na madaling baguhin: isang pure core, isang manipis na panlabas na shell, at mga dependency na ipinapasa papasok.
  • Gumamit ng type hints, dataclass at protocol bilang malinaw na kontrata, at suriin ang mga ito gamit ang type checker.
  • Sumulat ng maikling coding standard para sa isang team, batay sa PEP 8 at PEP 257, at hayaan ang mga tool na magpatupad ng mga nakakabagot na bahagi.
  • Magpatakbo ng mga code review na nagpapabuti sa code at sa mga tao: ano ang hahanapin, paano magsulat ng mga komento, gaano kabilis sumagot.
  • Magbago ng code na ginagamit na ng ibang tao, nang ligtas: test muna, maliliit na hakbang at mga deprecation warning.
  • Mag-mentor ng mga baguhan: turuan silang magbasa ng traceback, gumamit ng debugger at matuto mula sa review.
  • Mag-set up ng codebase ng team: contribution guide, code owners, protected branches at onboarding checklist.

Ito ang expert na antas ng Python track. Noon, natutunan mong magsulat ng code na gumagana. Ngayon, matututo kang manguna: magdisenyo ng code na kayang pakisamahan ng isang team sa loob ng maraming taon, mag-review ng gawa ng iba nang patas, magtakda ng mga pamantayan at magturo. Ang mga example ay nagpapatuloy sa maliit na ordertools project mula sa course 7.5.3, na ngayon ay inaakalang tool na inaalagaan ng team na may apat na tao.

Bawat code example na may markang "tested" ay pinatakbo para sa course na ito gamit ang Python 3.9.6, pytest 8.4.2, Ruff 0.17.5 at mypy 1.19.1 sa Mac. Ang mga workflow file na may markang "from the docs" ay ipinapakita ayon sa paglalarawan ng opisyal na dokumentasyon at hindi pinatakbo rito, dahil kailangan nila ng GitHub repository. Sa Windows, i-type ang py o python kung saan sinasabi ng course ang python3.

Words in this course 58Open the Vocabulary Hall
01

Disenyo para sa pagbabago

In simple words

Isipin ang toaster na ang plug ay nakabuo na sa dingding. Gumagana ito, pero hindi mo ito mailipat, hindi mo ma-test sa mesa sa kusina at hindi mo mapalitan ang plug. Ang magandang disenyo ay nagbibigay ng plug sa bawat bahagi: ang bahaging nagto-toast ay may isang trabaho lang, at ang kuryente ay pumapasok sa pamamagitan ng kordon na puwede mong hugutin. Kaya mo na itong i-test kahit saan at magbago ng isang bahagi nang hindi nasisira ang iba.

Key facts
  • Bago ang course na ito: Python Projects: testing, packaging and version control (course 7.5.3). Dapat alam mo na ang mga module at ang src layout, sarili mong exception class, pytest na may fixture at parametrize, mga git branch at merge, pyproject.toml at semantic versioning. Hindi na uulitin ng course na ito ang mga iyon.
  • Malaking bahagi ng trabaho sa code ay nangyayari pagkatapos itong unang isulat: binabasa ito ng mga tao, inaayos at binabago. Simpleng sinasabi ng PEP 8, ang style guide ng Python: mas madalas basahin ang code kaysa isulat.
  • Ang Zen of Python (PEP 20, i-type ang import this sa Python para makita) ay nagbibigay ng maiikling patakaran sa disenyo na puwede mong banggitin sa mga review, halimbawa "Readability counts.", "Simple is better than complex.", "Errors should never pass silently." at "If the implementation is hard to explain, it's a bad idea."
  • Cohesion: ang lahat ng nasa isang function o module ay para sa isang trabaho. Coupling: gaano kalaki ang pag-asa ng isang bahagi sa mga detalye ng iba. Layunin ang mataas na cohesion at mababang coupling.
  • Pure core, manipis na shell. Ilagay ang mga kalkulasyon at desisyon sa mga pure function: parehong input, parehong output, walang pagpi-print, walang file, walang orasan, walang network. Ilagay ang panlabas na mundo (mga file, input(), pagpi-print, petsa ngayon, mga web call) sa manipis na panlabas na layer.
  • Ipasa papasok ang mga dependency. Kung kailangan ng function ang petsa ngayon, price list o file, ipasa ito bilang argument sa halip na abutin sa loob. Makakapagpasa na ang mga test ng nakapirming petsa o pekeng price list. Tinatawag itong dependency injection, at sa Python ay madalas na dagdag na argument lang na may makatwirang default.
  • Pangalanan ang mga bagay ayon sa kahulugan nila: mas mahusay ang WEEKEND_DISCOUNT = 0.10 kaysa hubad na 0.9 sa gitna ng formula. Ang mga constant na malaking letra na may underscore ay ayon sa PEP 8.
  • Huwag mag-over-engineer. Binabalaan ng code review guide ng Google ang mga reviewer na bantayan ang code na mas generic kaysa kailangan o nagdaragdag ng mga feature na hindi pa kailangan ng system. Magdisenyo para sa mga pagbabagong nakikita mong paparating, hindi para sa bawat posibleng hinaharap.
Halimbawa (tested): bago
import csv
from datetime import date


def report(path):
  total = 0
  for row in csv.DictReader(open(path)):
    total += int(row["qty"]) * float(row["price"])
  if date.today().weekday() == 5:
    total = total * 0.9
  print("Total:", round(total, 2))

Gumagana ito (Total: 33.0 para sa order file mula sa course 7.5.3 kapag Biyernes), pero ang isang function ay nagbabasa ng file, gumagawa ng math, tumitingin sa totoong kalendaryo at nagpi-print. Maite-test mo lang ang diskwento sa Sabado kapag Sabado, at hindi tahasang isinasara ang file.

Halimbawa (tested): pagkatapos
"""Order totals: pure logic, with the outside world passed in."""

import csv
from datetime import date

SATURDAY = 5
WEEKEND_DISCOUNT = 0.10


def read_lines(path):
  """Return (qty, price) pairs from an order CSV file."""
  with open(path, newline="", encoding="utf-8") as f:
    return [(int(r["qty"]), float(r["price"])) for r in csv.DictReader(f)]


def order_total(lines, day):
  """Return the total of the lines, with the Saturday discount on that day."""
  total = sum(qty * price for qty, price in lines)
  if day.weekday() == SATURDAY:
    total *= 1 - WEEKEND_DISCOUNT
  return round(total, 2)


def main(path, today=date.today):
  print(f"Total: {order_total(read_lines(path), today()):.2f}")

Hindi na umaasa ang mga test sa totoong kalendaryo:

from datetime import date

from after import main, order_total

LINES = [(10, 2.50), (2, 4.00)]


def test_friday_has_no_discount():
  assert order_total(LINES, date(2026, 11, 13)) == 33.0


def test_saturday_has_ten_percent_off():
  assert order_total(LINES, date(2026, 11, 14)) == 29.7


def test_main_with_a_fixed_day(tmp_path, capsys):
  f = tmp_path / "order.csv"
  f.write_text("product,qty,price\nPen,10,2.50\nNotebook,2,4.00\n", encoding="utf-8")
  main(f, today=lambda: date(2026, 11, 14))
  assert capsys.readouterr().out == "Total: 29.70\n"

Ang python3 -m pytest -q ay nag-print ng 3 passed. Ang 13 Nobyembre 2026 ay Biyernes at ang 14 Nobyembre 2026 ay Sabado. Ginagamit pa rin ng main ang totoong petsa kapag walang nagpasa ng today, kaya walang pagkakaibang makikita ang mga normal na user.

Step by step
  1. Gumawa ng folder na l1 at i-save ang "bago" na code bilang before.py, na ang huling linya ay report("order.csv"), at ang order.csv file mula sa course 7.5.3 sa tabi nito. Patakbuhin ito.
  2. Sa papel, ilista ang bawat trabahong ginagawa ng function na report. Dapat makakita ka ng hindi bababa sa apat (magbukas ng file, magbasa ng mga row, magkalkula, tumingin sa petsa, mag-print).
  3. I-save ang "pagkatapos" na code bilang after.py at ang mga test bilang test_after.py sa parehong folder.
  4. Patakbuhin ang python3 -m pytest -q at tiyaking nakikita mo ang 3 passed.
  5. Ituro ang pure core (order_total) at ang shell (read_lines, main). Sabihin nang malakas kung alin ang humahawak sa panlabas na mundo.
  6. Palitan ang WEEKEND_DISCOUNT ng 0.15 at patakbuhin ang mga test: isa ang babagsak. Iyan ang punto: ang patakaran ay nasa isang may-pangalang lugar, at binabantayan ito ng test. Ibalik ito.
  7. Check: kaya mong ipaliwanag kung bakit ang pagpapasa ng day sa order_total ay nagpapa-testable nito sa kahit anong araw ng linggo.
LESSON 01Disenyo para sa pagbabago
LESSON 01 / ANIMATED LESSON / ENGLISH VOICE00:00 / 01:00
Read the video script
[Host] "Mas madalas basahin ang code kaysa isulat. Kaya idisenyo ito para mabasa, at mabago."
[Screen: ang function na bago na may apat na trabahong naka-highlight] "Ang isang function na ito ay nagbubukas ng file, gumagawa ng math, tumitingin sa kalendaryo at nagpi-print. Maite-test mo lang ang Sabado kapag Sabado."
[Screen: order_total(lines, day)] "Hatiin ito. Ang pure core ang gumagawa ng math. Ang petsa ay pumapasok bilang argument."
[Screen: test na may date(2026, 11, 14) na pumapasa] "Ngayon, puwedeng magkunwari ang test na Sabado, kahit anong araw ng linggo."
[Text on screen: Mataas na cohesion. Mababang coupling. Walang gold plating.] "Isang trabaho bawat bahagi, kakaunting ugnayan sa pagitan ng mga bahagi, at walang feature na walang humiling."
Try it now

Kumuha ng isang script na isinulat mo sa course 7.5.2 o 7.5.3. Maghanap ng function na naghahalo ng kalkulasyon sa mga file, pagpi-print, orasan o network. Hatiin ito sa isang pure function at manipis na shell, ipasa ang panlabas na bagay bilang argument, at sumulat ng dalawang test para sa pure na bahagi. Sumulat ng tatlong pangungusap: ano ang mahirap i-test noon, ano ang binago mo, at ano ang mas madali na ngayon.

ClaudeStuck? Copy a ready-made prompt for Claude

Copy this, open Claude, paste it, and Claude will walk you through the lesson step by step.

For a grown-up: Claude is for adults (18+). Copy this, paste it into Claude, and use the answer to explain the lesson to your child.

I'm learning "Python Engineering: disenyo, review at mentoring" on The Future Market. Lesson 1: "Disenyo para sa pagbabago".

What the lesson teaches:
- Bago ang course na ito: Python Projects: testing, packaging and version control (course 7.5.3). Dapat alam mo na ang mga module at ang src layout, sarili mong exception class, pytest na may fixture at parametrize, mga git branch at merge, pyproject.toml at semantic versioning. Hindi na uulitin ng course na ito ang mga iyon.
- Malaking bahagi ng trabaho sa code ay nangyayari pagkatapos itong unang isulat: binabasa ito ng mga tao, inaayos at binabago. Simpleng sinasabi ng PEP 8, ang style guide ng Python: mas madalas basahin ang code kaysa isulat.
- Ang Zen of Python (PEP 20, i-type ang import this sa Python para makita) ay nagbibigay ng maiikling patakaran sa disenyo na puwede mong banggitin sa mga review, halimbawa "Readability counts.", "Simple is better than complex.", "Errors should never pass silently." at "If the implementation is hard to explain, it's a bad idea."
- Cohesion: ang lahat ng nasa isang function o module ay para sa isang trabaho. Coupling: gaano kalaki ang pag-asa ng isang bahagi sa mga detalye ng iba. Layunin ang mataas na cohesion at mababang coupling.
- Pure core, manipis na shell. Ilagay ang mga kalkulasyon at desisyon sa mga pure function: parehong input, parehong output, walang pagpi-print, walang file, walang orasan, walang network. Ilagay ang panlabas na mundo (mga file, input(), pagpi-print, petsa ngayon, mga web call) sa manipis na panlabas na layer.
- Ipasa papasok ang mga dependency. Kung kailangan ng function ang petsa ngayon, price list o file, ipasa ito bilang argument sa halip na abutin sa loob. Makakapagpasa na ang mga test ng nakapirming petsa o pekeng price list. Tinatawag itong dependency injection, at sa Python ay madalas na dagdag na argument lang na may makatwirang default.
- Pangalanan ang mga bagay ayon sa kahulugan nila: mas mahusay ang WEEKEND_DISCOUNT = 0.10 kaysa hubad na 0.9 sa gitna ng formula. Ang mga constant na malaking letra na may underscore ay ayon sa PEP 8.

The exercise I'm working on:
Kumuha ng isang script na isinulat mo sa course 7.5.2 o 7.5.3. Maghanap ng function na naghahalo ng kalkulasyon sa mga file, pagpi-print, orasan o network. Hatiin ito sa isang pure function at manipis na shell, ipasa ang panlabas na bagay bilang argument, at sumulat ng dalawang test para sa pure na bahagi. Sumulat ng tatlong pangungusap: ano ang mahirap i-test noon, ano ang binago mo, at ano ang mas madali na ngayon.

I'm stuck. Please:
1. Explain the main idea in plain, simple words with one everyday example.
2. Walk me through the exercise one small step at a time. Ask me what I've done so far before giving the next step.
3. Don't just give me the final answer. Help me do it myself, and check my work when I share it.
I'm a parent helping my child (about 8 years old) with a lesson called "Disenyo para sa pagbabago" from the course "Python Engineering: disenyo, review at mentoring".

Here's what the lesson says:
Isipin ang toaster na ang plug ay nakabuo na sa dingding. Gumagana ito, pero hindi mo ito mailipat, hindi mo ma-test sa mesa sa kusina at hindi mo mapalitan ang plug. Ang magandang disenyo ay nagbibigay ng plug sa bawat bahagi: ang bahaging nagto-toast ay may isang trabaho lang, at ang kuryente ay pumapasok sa pamamagitan ng kordon na puwede mong hugutin. Kaya mo na itong i-test kahit saan at magbago ng isang bahagi nang hindi nasisira ang iba.

The activity:
Kumuha ng isang script na isinulat mo sa course 7.5.2 o 7.5.3. Maghanap ng function na naghahalo ng kalkulasyon sa mga file, pagpi-print, orasan o network. Hatiin ito sa isang pure function at manipis na shell, ipasa ang panlabas na bagay bilang argument, at sumulat ng dalawang test para sa pure na bahagi. Sumulat ng tatlong pangungusap: ano ang mahirap i-test noon, ano ang binago mo, at ano ang mas madali na ngayon.

Please explain this so an 8-year-old understands: short sentences, a fun everyday example, and no hard words.
Then give me 3 simple questions I can ask my child to check they understood, and a way to do the activity together, one tiny step at a time.
Open Claude
Sources
My notes
02

Mga type, dataclass at protocol bilang kontrata

This lesson is part of full access: every course and every level for one payment.

03

Coding standard ng team, ipinapatupad ng mga tool

This lesson is part of full access: every course and every level for one payment.

04

Pagpapatakbo ng mga code review

This lesson is part of full access: every course and every level for one payment.

05

Pagbabago ng code na inaasahan ng iba

This lesson is part of full access: every course and every level for one payment.

06

Pag-mentor sa mga baguhan

This lesson is part of full access: every course and every level for one payment.

07

Pamumuno sa codebase ng team

This lesson is part of full access: every course and every level for one payment.

++

Final project

This lesson is part of full access: every course and every level for one payment.

??

Quiz

  1. Bakit dapat tumanggap ang function ng petsa ngayon bilang argument sa halip na tumawag ng date.today() sa loob?

  2. Ano ang ibig sabihin ng mataas na cohesion at mababang coupling?

  3. Pinipigilan ba ng Python ang program kapag may tawag na lumalabag sa type hint?

  4. Ano ang ginagawa ng frozen=True sa isang dataclass?

  5. Bakit gagamit ng Decimal na binuo mula sa mga string para sa pera?

  6. Bakit bug ang list bilang default argument?

  7. Ano ang dapat laman ng nakasulat na coding standard?

  8. Kailan dapat aprubahan ng reviewer ang isang pagbabago?

  9. Ano ang ibig sabihin ng label na "Nit:" sa review comment?

  10. Paano mo papalitan ng pangalan ang public na function nang hindi sinisira ang mga user?

  11. Aling linya ng traceback ang nagsasabi kung ano ang nagkamali?

  12. Ano ang ginagawa ng CODEOWNERS file?

EX

Final exam

This lesson is part of full access: every course and every level for one payment.

CE

Certificate

This lesson is part of full access: every course and every level for one payment.