Resume, Portfolio & GitHub Profile Module 3 – Writing content that proves your work
Projects, education and certifications
How to write resume project entries with your part and a result, give a degree and CGPA with its scale, and list certifications a reader can verify.
What you will learn
- Write project entries that state the problem, your role, the stack and the result
- Present degrees, CGPA and coursework clearly for campus and lateral roles
- List certifications and achievements so that a reader can verify them
- Distinguish a course you completed from an exam you passed under supervision
Before you start
What you’ll learn · Before you start
What you will learn
- Write project entries that state the problem, your role, the stack and the result
- Present degrees, CGPA and coursework clearly for campus and lateral roles
- List certifications and achievements so that a reader can verify them
- Distinguish a course you completed from an exam you passed under supervision
Before you start
On this page
“Canteen app (React, Node)” gives a reader two names and nothing to check. Google advises recent university graduates, and anyone with little work experience, to add projects from their studies or coursework that show relevant skills, so for many readers these lines are most of the resume.
This lesson writes the three kinds of entry that follow the jobs on a page: project entries with your part and a result, education lines with a grade and its scale, and certifications with a link a reader can check.
A project entry states the problem, your part, the stack and the result
MIT’s careers office counts class projects, competitions and personal projects as experience, as long as you describe them in terms that make their relevance clear. Projects get the same treatment as jobs, in a pattern of six parts, which is MySmartCoPilot guidance: a name, a one-line purpose, your role, the stack, a measured result and a link to the code or a demo. GitHub’s tutorial on job searching suggests linking your GitHub profile on your resume and pinning the projects you are proudest of.
The program checks three versions of one invented project entry against the six parts, then an education line and three credentials against theirs, and prints each the way a resume would show it:
# Checks resume entries for the parts a reader needs (MySmartCoPilot's pattern for each kind of entry), then prints
# each entry the way a resume would show it. The project is the invented canteen queue tracker in three versions, from
# weak to strong; the education and credential lines belong to Meera, an invented student, and every issuer is
# invented. Press Edit, describe an entry of your own in MINE, and run it.
PARTS = {
"project": ["name", "purpose", "role", "stack", "result", "link"],
"education": ["degree", "institution", "years", "grade"],
"credential": ["name", "issuer", "year", "verify"],
}
ENTRIES = [
("project", {"name": "Canteen app", "stack": "React, Node"}),
("project", {"name": "Canteen queue tracker", "purpose": "a token queue for the college canteen",
"role": "one of three students; built the token queue and its tests", "stack": "Flask, SQLite"}),
("project", {"name": "Canteen queue tracker", "purpose": "a token queue for the college canteen",
"role": "one of three students; built the token queue and its tests", "stack": "Flask, SQLite",
"result": "the average lunch-hour wait fell from 14 to 6 minutes over four weeks",
"link": "https://github.com/meera-iyer-example/canteen-queue"}),
("education", {"degree": "B.Tech. Computer Science", "institution": "Example Institute of Technology",
"years": "2023 to 2027 (expected)", "grade": "CGPA 8.4/10",
"coursework": "Database Systems, Operating Systems"}),
("credential", {"name": "Certified Cloud Associate", "issuer": "Example Cloud Academy", "year": "2025",
"verify": "https://verify.example.com/credential/7K2Q-91XD", "exam": True}),
("credential", {"name": "Introduction to SQL", "issuer": "Example Learning", "year": "2024", "exam": False,
"verify": "https://learn.example.com/records/55120"}),
("credential", {"name": "Certified Python Developer", "issuer": "Example Bootcamp", "year": "2024", "exam": False}),
]
MINE = [] # your own entries, for example ("project", {"name": "…", "purpose": "…", …})
def problems(kind, entry):
"""The parts an entry lacks, and the rules it breaks."""
found = [f"no {part}" for part in PARTS[kind] if not entry.get(part)]
for key in ("link", "verify"):
if entry.get(key) and not entry[key].startswith("https://"):
found.append(f"its {key} does not start with https://")
if kind == "credential" and not entry.get("exam") and "certified" in entry["name"].lower():
found.append('"certified" for a course with no exam')
return found
def show(kind, entry):
"""The entry as a resume shows it: a line, and a second one when there is more to say."""
if kind == "project":
head = " · ".join(x for x in (entry["name"], entry.get("stack"), entry.get("link", "").removeprefix("https://")) if x)
body = "; ".join(x for x in (entry.get("purpose"), entry.get("role"), entry.get("result")) if x)
return [head] + ([body[0].upper() + body[1:] + "."] if body else [])
if kind == "education":
line = f"{entry['degree']}, {entry['institution']}, {entry['years']} · {entry['grade']}"
return [line] + ([f"Coursework: {entry['coursework']}"] if entry.get("coursework") else [])
line = f"{entry['name']}, {entry['issuer']}, {entry['year']}"
if not entry.get("exam"):
line = "Completed: " + line
return [line + (f" · {entry['verify'].removeprefix('https://')}" if entry.get("verify") else "")]
for kind, entry in ENTRIES + MINE:
found = problems(kind, entry)
have = sum(1 for part in PARTS[kind] if entry.get(part))
print(f"{kind}, {have} of {len(PARTS[kind])} parts" + (f": {'; '.join(found)}" if found else ": complete"))
for line in show(kind, entry):
print(f" {line}")
print() Output
project, 2 of 6 parts: no purpose; no role; no result; no link
Canteen app · React, Node
project, 4 of 6 parts: no result; no link
Canteen queue tracker · Flask, SQLite
A token queue for the college canteen; one of three students; built the token queue and its tests.
project, 6 of 6 parts: complete
Canteen queue tracker · Flask, SQLite · github.com/meera-iyer-example/canteen-queue
A token queue for the college canteen; one of three students; built the token queue and its tests; the average lunch-hour wait fell from 14 to 6 minutes over four weeks.
education, 4 of 4 parts: complete
B.Tech. Computer Science, Example Institute of Technology, 2023 to 2027 (expected) · CGPA 8.4/10
Coursework: Database Systems, Operating Systems
credential, 4 of 4 parts: complete
Certified Cloud Associate, Example Cloud Academy, 2025 · verify.example.com/credential/7K2Q-91XD
credential, 4 of 4 parts: complete
Completed: Introduction to SQL, Example Learning, 2024 · learn.example.com/records/55120
credential, 3 of 4 parts: no verify; "certified" for a course with no exam
Completed: Certified Python Developer, Example Bootcamp, 2024
Recorded with Python 3.14.8 on macOS 26 arm64. To run it yourself: mise exec python@3.14.8 -- python3 entries.py
Runs on this device, in your browser. The first run downloads Python (about 13.5 MB), which is kept for the next runs.
Your run, in this browser
The first version is two names, 2 of 6 parts. The second says what the project is and which part was Meera’s, 4 of 6. The third adds the result, the wait falling from 14 to 6 minutes, and the link, so a reader can check both. The role keeps a team project honest: one of three students, who built the token queue and its tests.
Key idea
A project entry is a job entry for work nobody paid for: name, purpose, your part, the stack, a measured result and a link a reader can follow.
Checkpoint
Check: The six parts of a project entry
Education: the degree as awarded, and coursework only when it helps
The UK’s National Careers Service lists what the education section holds: the names of your qualifications, the school, college or university, and the dates you attended. Add the grade exactly as it was awarded, with its scale, as in “CGPA 8.4/10”, and mark a degree still in progress with its expected year. Convert a CGPA: Cumulative grade point average: the average of a student's grade points over all the courses taken so far, usually on a 10-point scale. More in “Resume rules by country: photo, age, length” to a percentage only when an employer asks, by your university’s own rule, which the lesson on conventions by country works through.
CGPA to Percentage Calculator (India) When a form asks for a percentage, convert a CGPA by the rule of the university that awarded it.| Entry | Written as | Why |
|---|---|---|
| Degree in progress | B.Tech. Computer Science, Example Institute of Technology, 2023 to 2027 (expected) | The reader sees it is not finished |
| Grade | CGPA 8.4/10 | A number without its scale cannot be read |
| Coursework | Database Systems, Operating Systems | Only courses the posting would value |
Coursework and a thesis earn a line only when they are evidence for the posting, and in MySmartCoPilot’s guidance two or three courses are enough. Early in a career, education sits near the top of the page; with years of work, it moves to the end, as the lesson on sections and length explains.
Checkpoint
Check: Degrees, grades and coursework
Certifications a reader can check
Certifications get a short section of their own when they hold evidence for the posting. Each line names the credential as the issuer writes it, the issuer, the year, and a credential ID: The code an issuer gives a certificate or badge, so that anyone can look the credential up on the issuer's own site and confirm that it is real and current. or a link that lets a reader confirm it. Issuers make that easy: the Linux Foundation, for one, runs a public tool that confirms a candidate’s certification from a last name and a certification ID.
Use a word that matches what you did. A credential you earned by passing an exam keeps its own name, “Certified” and all; a course you finished is “Completed”, whatever its badge says. The program’s last line shows the slip: a bootcamp’s “Certified Python Developer” for a course with no exam.
Checkpoint
Check: Certifications a reader can check
Project entries a reader can check in two minutes Pro: opens with a Pro, Premium or Ultimate pass
A project link is an invitation to look, and a reader accepts it for a short time. This part follows what a reader does with the link, then handles the two hardest cases: team projects and projects that nobody used.
In this part:
- What a reader does with your link, step by step
- Team projects, and projects nobody used
1 diagram · about 5 minutes
Opening this part with your pass…
This part opens with any MySmartCoPilot pass.
- Pro pass · 1 week₹79$2.99
- 30 days₹179$5.99
- 1 year₹1,699$45
One payment; a pass never renews. The price shown is the total you pay: no fees or charges are added at checkout.
Passes can’t be bought right now, so this part can’t be opened at the moment. The free part above stands on its own. If you have a pass, enter your licence key.
It also opens every other in-depth part in Learn and every Pro tool. Sales are final, except where the law gives you a right to withdraw, for example in the EU and the UK (refund policy).
Completed courses and passed exams: what each proves, worded honestly Pro: opens with a Pro, Premium or Ultimate pass
Credentials differ in what they prove, and a reader who knows the difference reads the wording closely. This part sets out what an issuer checks before it issues each kind, and how each is written on a resume.
In this part:
- What an issuer checks before it issues a credential
- Verification, renewal and wording, line by line
about 4 minutes
Opening this part with your pass…Pro part. It opens with the same pass as the part above.
Achievements, contests and publications a reader can verify Pro: opens with a Pro, Premium or Ultimate pass
Achievements are the most inflated lines on student resumes, because they are hard to check. This part gives each kind the detail that makes it checkable, and shows the vague line it replaces.
In this part:
- A rank, a field size and a link for every achievement
- Where achievements go, and what stays off
- Every achievement is an interview question
about 3 minutes
Opening this part with your pass…Pro part. It opens with the same pass as the part above.
Practise: fix six entries from the records
Arjun, an invented final-year student, wrote six entries in a hurry. Fix them from his records; the sample tests check every part, the links, the years, the grades and the wording of his two credentials:
Exercise · Easy · Python
Fix six project, education and credential entries
Arjun, an invented final-year student, has six entries in ENTRIES in entries.py, written in a hurry. His records say what is true:
<!-- learn-lint-allow credential: the records quote a credential whose own name holds the word --> 1. Library seat booker, his project: a booking site for the college library's reading-room seats, built with Django and PostgreSQL. He wrote it alone. No-shows fell from 31 % to 12 % in one semester. Code: https://github.com/arjun-mehta-example/seat-booker 2. Mess feedback form, a team project of three: a two-question feedback form for the hostel mess, built with Flask and SQLite. He designed the form and its summary page. It collected 1,860 responses in one term, and the committee changed three dishes. Code: https://github.com/arjun-mehta-example/mess-feedback 3. B.Tech. Computer Science, Example Institute of Technology, 2023 to 2027, still in progress: CGPA 8.1 on a 10-point scale. 4. Minor in Data Science, Example Institute of Technology, 2024 to 2027, still in progress: CGPA 8.6 on a 10-point scale. 5. Certified Cloud Associate, Example Cloud Academy, 2025: a proctored exam he passed. Verify at https://verify.example.com/credential/7K2Q-91XD 6. Introduction to Machine Learning, Example Learning, 2024: an online course with no exam. Record at https://learn.example.com/records/55120
Fix the six entries, in the same order and of the same kinds, so that every rule below holds:
<!-- learn-lint-allow credential: the rule says when the word may appear, for a passed exam --> - every part of each kind is filled in (the parts are listed in PARTS), and every link or verify starts with https://; - years reads "<start> to <end>", the end no earlier than the start, with " (expected)" after a degree still in progress; a grade gives its scale, as in "CGPA 8.1/10"; - a project's role names Arjun's own part without "we", "our" or "I", and its result holds only numbers his records hold; - a credential's name is written exactly as his records write it, its exam says what his records say, and the word "certified" appears only in a credential he earned by passing an exam ("exam": True).
Starter code · entries.py
# Arjun's six entries, written in a hurry. Fix each one from his records in the prompt.
PARTS = {
"project": ["name", "purpose", "role", "stack", "result", "link"],
"education": ["degree", "institution", "years", "grade"],
"credential": ["name", "issuer", "year", "verify"],
}
ENTRIES = [
("project", {"name": "Seat booker", "stack": "Django"}),
("project", {"name": "Mess feedback form", "purpose": "a feedback form for the hostel mess", "role": "we made it",
"stack": "Flask", "result": "lots of responses", "link": "http://github.com/arjun-mehta-example/mess-feedback"}),
("education", {"degree": "B.Tech. Computer Science", "institution": "Example Institute of Technology",
"years": "2027 to 2023", "grade": "8.1"}),
("education", {"degree": "Minor in Data Science", "years": "2024 to 2027", "grade": "CGPA 8.6/10"}),
("credential", {"name": "Cloud Associate", "year": "2025", "exam": True}),
("credential", {"name": "Certified in Machine Learning", "issuer": "Example Learning", "year": "2024",
"verify": "https://learn.example.com/records/55120", "exam": False}),
] The sample tests · test_entries.py
import re
from entries import ENTRIES, PARTS
KINDS = ["project", "project", "education", "education", "credential", "credential"]
RECORDS = [
"Library seat booker, Django and PostgreSQL, alone; no-shows fell from 31 % to 12 % in one semester",
"Mess feedback form, Flask and SQLite, team of three; 1,860 responses in one term; three dishes changed",
"B.Tech. Computer Science, Example Institute of Technology, 2023 to 2027 (expected), CGPA 8.1/10",
"Minor in Data Science, Example Institute of Technology, 2024 to 2027 (expected), CGPA 8.6/10",
"Certified Cloud Associate, Example Cloud Academy, 2025, exam passed",
"Introduction to Machine Learning, Example Learning, 2024, course without an exam",
]
NAMES = {4: "Certified Cloud Associate", 5: "Introduction to Machine Learning"}
EXAMS = {4: True, 5: False} # entry 5 was a passed exam, entry 6 a course without one
IN_PROGRESS = {2, 3}
def numbers(text):
return {n.replace(",", "") for n in re.findall(r"(?<![\w.,])(?:\d{1,3}(?:,\d{3})+|\d+)(?:\.\d+)?(?!\w)", text)}
def test_six_entries_of_the_same_kinds():
"""keeps six entries, in order, of the same kinds"""
assert [kind for kind, _ in ENTRIES] == KINDS
def test_every_part_and_https_links():
"""fills in every part of each kind, with https links"""
for n, (kind, entry) in enumerate(ENTRIES, start=1):
for part in PARTS[kind]:
assert str(entry.get(part, "")).strip(), f"entry {n} has no {part}"
for key in ("link", "verify"):
if key in entry:
assert entry[key].startswith("https://"), f"entry {n}: its {key} does not start with https://"
def test_years_in_order_and_grades_with_a_scale():
"""writes years in order, marks degrees in progress, and gives every grade its scale"""
for n, (kind, entry) in enumerate(ENTRIES):
if kind != "education":
continue
m = re.fullmatch(r"(\d{4}) to (\d{4})( \(expected\))?", entry.get("years", ""))
assert m, f"entry {n + 1}: years should read '<start> to <end>'"
assert int(m.group(2)) >= int(m.group(1)), f"entry {n + 1}: the end comes before the start"
assert bool(m.group(3)) == (n in IN_PROGRESS), f"entry {n + 1}: a degree in progress ends with (expected)"
assert re.search(r"\d(\.\d+)?/\d+", entry.get("grade", "")), f"entry {n + 1}: the grade has no scale"
def test_roles_and_results_from_the_records():
"""names Arjun's own part, and uses only numbers from his records"""
for n, (kind, entry) in enumerate(ENTRIES):
if kind != "project":
continue
words = set(re.findall(r"[a-z]+", entry.get("role", "").lower()))
assert not words & {"we", "our", "i"}, f"entry {n + 1}: the role should name his own part"
found = numbers(entry.get("result", ""))
assert found, f"entry {n + 1}: the result has no number"
assert found <= numbers(RECORDS[n]), f"entry {n + 1}: numbers his records do not hold: {sorted(found - numbers(RECORDS[n]))}"
def test_credential_names_and_the_word_certified():
"""writes credential names as the records do, and 'certified' only for a passed exam"""
for n, name in NAMES.items():
kind, entry = ENTRIES[n]
assert entry.get("name") == name, f"entry {n + 1}: write the name as the records do: {name!r}"
assert entry.get("exam") is EXAMS[n], f"entry {n + 1}: 'exam' should say what the records say: {EXAMS[n]}"
if "certified" in " ".join(str(v) for v in entry.values()).lower():
assert entry.get("exam") is True, f"entry {n + 1}: 'certified' for a credential with no exam" A hint
Work through the six records one at a time and copy every fact into its entry: the names and numbers exactly as the records write them. For the project role, start with a verb for what Arjun did, as in "designed the form and its summary page". Two entries need " (expected)" after their years.
Results of the sample tests
| Test | Result | Details |
|---|
What your code printed
The sample tests run on this device, in your browser (Pyodide): nothing is sent to mysmartcopilot.com. The first run downloads Python (about 13.5 MB), which is kept for the next runs. A check in your browser is feedback for you, not proof that the code is right for every input.
Then answer questions on project entries, education and certifications; the idea you have answered worst so far comes first:
Practice that adapts to you
Practise this lesson
9 questions about 6 ideas of this lesson. Each answer is explained at once, and what you get right is kept in this browser.
Interview questions
Warm-up (fresher to mid-level): What should a project entry on a resume include?
Six parts: the project’s name, what it is in one line, my part in it, the stack, a measured result and a link to the code or a demo. For a team project, the role says which part was mine. The result can be anything I can show: users over a period, a time saved against a baseline, tests and what they cover. The link matters because it lets a reader check the entry for themselves, so the repository it opens has to explain the project on its own.
Three questions of this module’s bank go further:
-
Fresher to mid
Your strongest project, a timetable clash checker, has never had a user. How do you write its entry so that a reader takes it seriously, what do you measure, and what do you say about it in an interview?
-
Fresher
Your CGPA is 6.4/10, and a posting asks for "a strong academic record". Does the CGPA go on your resume? What else do you show, and how do you answer if an interviewer asks about it?
-
Fresher to mid
A classmate lists five online courses under "Certifications", each worded as if it were a passed exam. An interviewer asks how you would list your own credentials. What do you say, and what makes a credential worth listing at all?
Flashcards · 7 cards
Recall it, then check
Say the answer to yourself before you look: recalling it is what makes it stick.
-
Which six parts make a project entry a reader can check?
A name, a one-line purpose, your role, the stack, a measured result and a link to the code or a demo.
-
Why does an entry for a team project need a role?
It says which part was yours, for example one of three students who built the token queue and its tests, so the entry stays honest about what the team did.
-
Do class and personal projects count as experience on a resume?
Yes, when described so their relevance is clear: MIT's careers office counts class projects, competitions and personal projects. Google suggests recent graduates and anyone with little work history add them.
-
How does an education entry show a grade and a degree still in progress?
The grade exactly as awarded, with its scale, such as CGPA 8.4/10, and an unfinished degree marked with its expected year. Convert a CGPA to a percentage only when asked, by the university's own rule.
-
When does coursework earn a line in the education section?
Only when the posting would value it, and then two or three courses are enough. Education sits near the top early in a career and moves to the end after years of work.
-
What does a credential line need so that a reader can confirm it?
The credential's name as its issuer writes it, the issuer, the year and an ID or a link. Some issuers, the Linux Foundation among them, run public tools that confirm a credential from a last name and an ID.
-
How do you describe a course you finished without passing any exam?
As completed, whatever its badge says. Only a credential you earned by passing an exam keeps the issuer's title for it.
Key takeaways
- A project entry has six parts: name, purpose, your part, the stack, a measured result and a link.
- Education gives the degree, the institution, the years and the grade as awarded with its scale, plus coursework only when the posting would value it.
- Certifications name the credential as the issuer writes it, with the year and an ID or link a reader can check.
Terms in this lesson
- credential ID
- The code an issuer gives a certificate or badge, so that anyone can look the credential up on the issuer's own site and confirm that it is real and current.
- proctored exam
- An exam taken under supervision, at a test centre or watched by webcam, in which the candidate's identity is checked against an ID before the exam starts.
References
- Our hiring process (How we hire) (Google Careers)
- Using your GitHub profile to enhance your resume (GitHub Docs)
- Resumes (MIT Career Advising and Professional Development)
- How to write a CV (National Careers Service (UK))
- Certification Verification Tool (The Linux Foundation)
- Online proctored exams (Microsoft Learn)
- NPTEL FAQ: certification examination (NPTEL, IITs and IISc)
Related tools
Report a problem with this lesson
Kept only in this browser. Your Learn progress