Writing project and internship points with impact
35 min · Intermediate
Need help? Ask a tutor on WhatsApp (opens in a new tab)In an interview, the first project question is read straight from your bullet: "How did you get this number?" Strong, true bullets lead to questions you are ready for.
The formula: action verb + what you built + tech + result
An action verb is the first word of a resume bullet that says what you did, such as built, designed, added or reduced. A strong bullet is: action verb + what you built + technology + result.
The example splits one strong bullet into its four parts, then joins them into the line a reviewer reads.
Example 1 · The formula applied
verb: Builtwhat: a hall-ticket download portal for 2,400 final-year studentstech: with Python and MySQLresult: served all downloads on exam week with zero downtime- Built a hall-ticket download portal with Python and MySQL for 2,400 final-year students; it served all downloads during exam week with zero downtime.
What this code does
- Each part answers one reviewer question: what did you do, what is it, how, and so what.
- The numbers are specific and checkable: a reviewer can ask "how did you handle 2,400 students downloading at once?"
Weak bullets describe duties ("Responsible for backend") or feelings ("Learned a lot about Python"). Those say nothing a reviewer can check or ask about.
Writing rules:
- Good verbs: built, designed, implemented, added, wrote, automated, reduced, improved, migrated, deployed, tested, fixed.
- Avoid starters: "responsible for", "worked on", "helped with", "involved in", "learned".
- One idea per bullet, one or two lines long; 2-3 bullets per project.
Before and after: rewriting weak points
Here are five weak bullets, and the same true facts rewritten. Each rewrite adds what exactly, which technology, for whom and what result.
Example 2 · Five weak bullets rewritten
1. Responsible for backend of library project.2. Worked on database.3. Learned Python and OOP.4. Made registration tool for college fest.5. Did testing.1. Built the issue and return functions of a library system in Python, covering 1,500 sample books and 600 members. 2. Designed a normalised MySQL schema of 7 tables with foreign keys and indexes for the library system. 3. Implemented 14 validation rules with custom exceptions and clear error messages in Python. 4. Built the registration tool for our college fest in Python with a CSV export; 850 students registered in 5 days. 5. Wrote 38 pytest tests for the service layer, reaching 82% line coverage measured with coverage.py.
What this code does
- Every rewrite starts with a strong verb and adds the missing parts: what exactly, which technology, and a number.
- The numbers in this sample are made up for the example. In your own resume, use only numbers you counted or measured.
A rewrite keeps the same true facts but makes them specific. Ask four questions of every weak bullet: what exactly did I make, using what, for whom, and what was the measurable outcome?
If you cannot answer "what was the result", use the scale (how many users, records or functions) or the quality (tests, security, speed). Even a college project has a scale: 60 students in a class, 500 books in the library, 3 departments.
Quantifying honestly: users, records, response time
To quantify a bullet is to add a number you counted or measured: users served, records handled, functions, tests, or response time before and after. Never invent one.
This checker gives a bullet one point each for a starting verb, a number and a named technology. Predict a few results before reading the example.
Example 3 · A bullet-point checker
VERBS = {"built", "designed", "implemented", "added", "wrote", "reduced", "improved", "automated", "deployed", "fixed", "migrated", "tested"}TECH = ["python", "mysql", "sql", "pytest", "json", "csv", "git"]
def check(bullet): lower = bullet.lower() verb = lower.split()[0] in VERBS number = any(ch.isdigit() for ch in bullet) tech = any(word in lower for word in TECH) flag = lambda ok: "y" if ok else "n" return f"{verb + number + tech}/3 verb={flag(verb)} number={flag(number)} tech={flag(tech)}"
bullets = [ "Responsible for backend of library project", "Worked on Python project", "Built 14 classes in Python with MySQL storage", "Reduced report query time from 2.1 s to 0.4 s by adding a MySQL index",]for bullet in bullets: print(f"{check(bullet)} | {bullet}")0/3 verb=n number=n tech=n | Responsible for backend of library project 1/3 verb=n number=n tech=y | Worked on Python project 3/3 verb=y number=y tech=y | Built 14 classes in Python with MySQL storage 3/3 verb=y number=y tech=y | Reduced report query time from 2.1 s to 0.4 s by adding a MySQL index
What this code does
- The checker gives one point each for a starting action verb, a number and a named technology: the three parts a reviewer can see at a glance. In Python,
True + Trueis 2, so adding the three checks gives the score. - A high score does not prove the bullet is true or good; it only catches vague lines. You still need the honesty test from the last section.
Example 4 · Measuring before you write a number
import time
def slow_sum(marks): total = 0 for i in range(len(marks)): for j in range(i + 1): if j == i: total += marks[i] return total
def fast_sum(marks): return sum(marks)
marks = [i % 100 for i in range(3_000)]
start = time.perf_counter()a = slow_sum(marks)middle = time.perf_counter()b = fast_sum(marks)end = time.perf_counter()
print("Same result:", a == b)print(f"Before: {round((middle - start) * 1000)} ms, after: {round((end - middle) * 1000)} ms")print("Bullet: Replaced a nested-loop total with one pass; measured on 3,000 records.")Same result: True Before: 108 ms, after: 0 ms Bullet: Replaced a nested-loop total with one pass; measured on 3,000 records.
What this code does
slow_sumis deliberately wasteful, standing in for the old code. Time the code before and after a change, on the same data, and check the result is still correct. The milliseconds differ on every computer, which is why the output is a sample.- Write the number you measured and the data size you measured it on. "Measured on 3,000 records" is honest; "10x faster for all users" is not.
Every number must come from something you actually measured or counted. "Reduced response time from 1.8 s to 300 ms" needs a before and after measurement you can describe. If you only tested with sample data, say "tested with 10,000 sample records", not "used by 10,000 users".
Which numbers are safe:
- Countable and safe: functions, tables, tests, records in your test data, students who used it.
- Measured: response time, query time, build time, before and after a change.
- Never invent percentages such as "improved efficiency by 40%" without a measurement.
An Online Store API project in three bullets
A scope bullet says what the system does and how big it is. A depth bullet adds one hard technical part, such as security or performance, and a quality bullet shows tests, CI or deployment.
Your Online Store API project fits in three bullets. Start from the facts in your own repository, then write one bullet for each strength.
Example 5 · Online Store API in three bullets
Project facts (your own repository):- Python service for products, categories, customers and orders, 20+ operations, MySQL- Customer and admin roles, salted password hashes- 45 pytest tests, GitHub Actions on every push, requirements.txt for setupOnline Store API - orders and stock service | Python 3.12, MySQL, pytest | github.com/your-name/online-store-api - Built 20+ operations for products, categories, customers and orders with input validation and clear error messages. - Added customer and admin roles with a check on every operation; stored passwords as salted hashes. - Wrote 45 pytest tests run by GitHub Actions on every push; saved data in MySQL with parameterised queries.
What this code does
- Bullet 1 shows scope, bullet 2 one hard technical part (security), bullet 3 quality and delivery. Together they cover what interviewers ask about Python projects.
- Change the numbers to match your repository exactly: count your operations and tests before you write them.
Three bullets are enough for one main project if each covers a different strength. Online Store API gives you all three: operations and data, roles with password hashing, and tests with automatic runs. The project heading line carries the name, the main technologies and the repository link.
Revise the work behind each bullet: A clean Python project others can run (opens in a new tab) and Quick checks with assert (opens in a new tab).
Never claim work you cannot explain
Two common over-claims are shown below, each with the honest version that is still strong and easy to defend.
Example 6 · Honest team and tutorial bullets
- Developed a full e-commerce website with payment gateway and admin panel. (Team of 4; you built the cart functions only.)- Built a weather app using Python. (Followed a video tutorial; you added a saved-cities list and city search.)- Built the cart and checkout functions (Python, MySQL) for a 4-member e-commerce project, including stock checks before order placement. - Extended a tutorial-based weather app in Python with a saved-cities list stored in a JSON file and city search.
What this code does
- The honest versions still sound strong, and now every line can be explained in depth. The original lines invite questions about payments and admin panels you never built.
- Saying a project started from a tutorial is fine when you clearly list what you added yourself.
Anything on your resume is fair game in an interview: the interviewer may ask how it works, why you chose it or what you would change. A bullet you cannot explain for two minutes does more harm than good, because it makes the reviewer doubt the rest.
For team projects, say what you did: "Built the payment and order APIs (team of 4)". For tutorial-based projects, list what you added beyond the tutorial. Copying a project from GitHub and listing it as your own is easy to detect and can lead to rejection.
Next step
Check your understanding
12 quick questions