Homework Assignment #6 — Contribution

In this assignment you will contribute to an open source GitHub project.

Your high-level goal is to produce and submit a non-trivial modification or extension to an open-source project in a way that maximizes the chances that the project maintainers accept it. If you demonstrate to us that your change has been accepted and integrated into the project’s code base, you will receive +6% bonus points on HW6b. You will select an open source project, select a change to implement, actually contribute to the project, report on your insights, and reflect on your distributed software engineering experience.

You may work with a partner for this assignment. If you do you must use the same partner for all sub-components of this assignment. Use the partner selection feature on Gradescope. Only one partner needs to submit the report on Gradescope, but if you both do, nothing fatal happens.

Project and Task Selection

Open Source for Social Good

Starting in 2021, students may consider open source projects for Social Good (SG). Social Good is a broad term that refers to projects that provide some societal benefit — for example, projects that inform you about polling locations, or availability of welfare services. We are interested in using the results of your reports as data for ongoing research in software engineering for social good, particularly as a result of the pandemic.

You are not required to choose a SG project. However, if you are interested, there are a few resources available for helping you identify projects for Social Good.

You can refer to this list of potential projects for Social Good, if you are interested. This list contains the GitHub owner and repository name of the project, as well as the corresponding goal of that project. This list was developed as part of an investigation into projects for Social Good. If you are interested, you can read a paper published by Huang, Ford, and Zimmerman in 2021. In addition, the following two resources are available for you to help find a Social Good project:

  • Ovio: https://ovio.org/projects. Ovio has developed an interal list of SG projects. (Use the "Topics" dropdown to filter projects you are interested in.)
  • Digital Public Good Alliance: https://digitalpublicgoods.net/registry/. DPGA uses the 17 Sustainable Development Goals to indicate good topics for SG topics for projects. Note that not all of the projects listed by the DPGA are available on GitHub. You must select a GitHub project for HW6.

You must select an open-source GitHub project and complete one or more bug fixes or extensions within it. For the rest of this assignment, we will collectively refer to bug fixes and extensions as tasks. You have considerable freedom in which project and tasks you choose (subject to a few requirements and recommendations), however, you should adhere to the Golden Rule of Project and Task Selection:

Golden Rule of Project and Task Selection

The Golden Rule of Project and Task Selection is to read the entire HW description, which includes HW6a and also HW6b, and keep in mind what you will have to write in your reports later. Your grade is based solely on those reports. Do not pick a project or a task that will make it difficult for you to complete any of the reporting obligations. If you are at all uncertain, do not pick that risky project or task and instead pick another where there is absolutely no doubt. A very common source of student uncertainty or unhappiness is realizing, near the due date, that a project or task that was not technically against the rules will make it very difficult for you to present all of the evidence required to get all of the points for HW6.

It can be very tempting to pick a non-standard project or task, such as a project that does not involve any humans, or does not do any testing, or does not use any code, or that is entirely a GUI or front-end, or that only involves adding data to a database or repository (and not actually programming), or that is actually a textbook instead of a program, or something like that. Do not pick that project or task. Instead, pick a standard project or task. You can always go back later (e.g., after this semester) and work on the unique project, but to be able to grade everyone fairly, we need to enforce standards for this homework assignment.

Requirements and Recommendations

The following aspects of project or task selection are firm requirements and cannot be waived. If you found a project or task that seems really great but does not satisfy one of these rules, you must regretfully pick another instead. Requirements:

In addition, there are a number of very strong recommendations that you almost certainly should follow. While you are officially allowed to disregard these recommendations, doing so will almost certainly result in a lower grade because you will not be able to provide sufficient evidence for all of the reporting obligations for HW6a and HW6b. See the "Golden Rule" above. Recommendations:

Read this entire homework description and pick a project and task(s) that will give you something detailed to talk about in each of the required report sections. See the Golden Rule above. For example, part of the final report is a discussion of how the project members communicate and accept changes. While most projects have informal, rather than formal, processes, a small project with none at all may be difficult to write about. Do not pick that project, and instead pick another project.

Students often report that this homework makes a great talking point at technical interviews, especially with higher-tier companies. You may want to select a slightly more ambitious task so that you can "show off" later. (It is tempting to think of "ambition" solely in terms of the complexity of the task, but perhaps employers care more about the size of the code base, the number of active developers, the rigor of the development process, the scope of the testing and QA, the use of analysis tools, the adherence to a required project design or architecture, and so on.)

If you have questions on these criteria, contact the course staff (particularly the TAs). We strongly recommend that you interact with the course staff during this process to verify that the scope of your proposal seems reasonable. We strongly encourage you to do this as early as possible, and before you start investing too heavily in your plans. A great way to do this is via office hours or during discussion sections. If you can't contact the course staff quickly enough and are worried about a project or task, do not select that project or task and instead select a safer one.

Once you have settled on a project and one or more candidate tasks, research your ideas in more detail. Read the documentation. Build and execute the source code, and try to read and understand it. You should explore the code to the point that you understand how your modification fits in the overall picture. You should be convinced that it is both non-trivial but also doable with the resources (time, team members) available.

In selecting a task, consider the functional and non-functional implications and requirements, as well as how it fits in to the larger project structure.

See the end of this document for hints on task selection from students in similar classes at other universities. You might also consider a website such as up-for-grabs.net or codetriage.com which list GitHub repositories with beginner-friendly labels (special thanks to J. Kollin, P. Shultz, K. Cheng, and H.-T. Chen for this recommendation).

Task Planning

You should plan before you start coding. This includes identifying risks and requirements and developing a schedule. If you are working with a partner, you should also solidify a collaboration plan.

Performing the Task

Implement the selected task. You should write code and perform adequate quality assurance activities. Beyond that, you will likely also need to:

You are required to submit your work to the open-source project using your real identity. It is not required that the project accepts your submission, but you will get bonus points if they do.

Keep track of how you actually spend your time while you are performing the task. The final report requires you to submit a "what actually happened" schedule.

HW6a — Task Selection Report

The first thing you must turn in is an initial report on the project and task(s) you select, including a proposed schedule (with effort estimates).

Start by researching candidate open source projects. Make an informed decision about which project you will contribute to. As examples, consider: the type of software, the project age, the number of active contributors, the amount of activity and communication among contributors, the number and types of feature requests/bug reports you might address, the tools and mechanisms the project uses to communicate and collaborate, the dominant programming language/paradigm/framework, as well as the larger context in which the software operates. Communication with the candidate open source projects is encouraged.

Your goal is to to make a principled, informed decision as to which project and task(s) you will tackle. The type of information you collect can vary depending on how you make this decision. However, you should justify that decision by grounding it in facts about the projects and tasks you consider.

In addition, you may consider whether you want to work on a project for Social Good. If that is of interest to you, additional resources are listed at the of this document. You are not required to select a project associated with Social Good, it is merely an option.

You are required to choose a project hosted on GitHub. (This artificial constraint simplifies our grading process. If a project is hosted on GitHub in any way and is also hosted elsewhere, it counts.)

Your report should include:

  1. Names and email ids. You must include your name and UM email id (e.g., "weimerw"). If you have a partner, you must include the partner name and email id as well.
    • Don't forget to tag your partner on Gradescope, not just in the PDF document. We typically have multiple groups per semester where partner A forgets to tag partner B, who then receives a zero on the assignment and doesn't notice it when assignment grades are posted, ultimately getting a lower letter grade in the class until the problem is corrected. We don't recommend that situation.
  2. Overview and justification. A report on the project you selected, summarizing the relevant characteristics you considered when making your selection. Beyond whatever additional information you collect in your research, include at least a name, a website link, and a brief description of the project (what it does, who uses it, etc.). Explain the criteria you used in selecting it over any others, referencing the collected information from your overview. You may contrast it to other projects you considered but rejected, if applicable. (Approximately 2 paragraphs.)
  3. Successful build. Evidence that you can build and run the software (e.g., a screenshot or text output from a successful build, a screenshot of the running program). Getting an open-source project to build and run can be a huge effort, and we want to mitigate this risk. (Many students have been unpleasantly surprised in HW6b at being unable to compile and run the program they are working on.)
    • If your project has both a front-end and a back-end (or some similar modular structure), you must show evidence of building and running both.
    • If you work with a partner, show evidence that both of you can build and run the project.
  4. Task(s) description. A brief textual description of your proposed task(s). In the likely event that you are proposing to tackle several tasks, list each one and give a priority order. Depending on how difficult the issues end up being, you may not necessarily have to implement all of them. In the final report submission HW6b for you will have a chance to indicate how your actual activity deviated from this prediction. (About, or up to, 2 paragraphs per task.)
    • If the official task description is terse, you may have to read up on relevant context. For example, suppose the official pull request task description is just one sentence: "Remove buffer overruns from secondary networking module." Your report might say something like: "The tasks is to remove buffer overruns from the secondary networking module. In this program, the secondary networking module does $FOO, while the primary does $BAR. The program is structured this way for reason $BAZ. Buffer overruns are relevant because of $SECURITY_EXPLANATION. Similar changes in the past to the secondary module have struggled with $ISSUE. We hypothesize that the best way to address the problem will be by adding array bounds checks or by using $OTHER_TECHNIQUE. The project maintainer has specified that any solution must meet $READABILITY_THRESHOLD. In addition, the task implicitly requires that any new code meet the project's $COVERAGE_REQUIREMENT. To obtain that, we will also create $UNIT_TESTS ..." and so on. Note that you don't need two paragraphs, the phrasing is "up to" two paragraphs. The goal is not to convince us that you read GitHub verbatim, but more to convince us that you understand all of the things that will be involved in the task, even if, in shorthand, the developers did not say all of them out loud.
  5. Task link(s). Evidence that the task(s) is/are requested by the community (a screenshot or issue tracking link suffices).
  6. Requirements. A description of each task's requirements, both functional and quality. Document these requirements at whatever level of detail you consider appropriate: use cases might be helpful, for example, but are not required. You might consider how your proposed task fits into the overall goals of the project. We do not want any sort of full formal software requirements specification. Instead, we want lightweight documentation of your task's requirements and evidence that you understand how they fit into the larger project. (At most half a page per task.)
  7. Initial time plan. Choose any format as long as it is clear (e.g., Gantt diagram, plain text). This should include at least: individual tasks and milestones, with deliverables (e.g., to the project maintainers); estimated effort for each (sub)task; dependencies between tasks; and a best-effort assignment of (sub)tasks to team members. We encourage you to include supporting evidence for your estimates. We will grade you on the presence of your planning but not its accuracy; it is completely acceptable if plans change. Be sure schedule time for QA activities. See the final team report for more on QA.  (At most one page.)
  8. Short risk assessment. Identify and briefly describe key risks in each task and discuss how you plan to mitigate those risks. (1 paragraph, or 1 paragraph per task.)
    • Note that risks may be both personal (e.g., you are unfamiliar with the library, you might get sick, etc.) but may also be related to the context of the project (e.g., this GUI is hard to test, this issue is hard to reproduce, etc.). We encourage you to take the broad view of "risk" covered in class (and possibly review the early lectures for some examples).
  9. Initial process plan. Describe the process you plan to follow. This should mention quality assurance and how you plan to communicate and collaborate as well as divide and integrate work. (At most half a page.)
    • In this context, the difference between a time plan and a process plan is that the former is asking you for something like a schedule (a calendar, a Gantt chart, etc.) and the latter is asking you about software process. It may be worth reviewing the Lecture on "Process, Risk and Scheduling" to see some of those terms defined.
    • Very, very informally, just to highlight the difference, "We'll use Agile" is a process description but not a time description (it says how but not when). By contrast, "We'll be done with the testing by December 4th" is a time description but not a process description (it says when but not how).
  10. Task scope justification. Evidence that the tasks are of a sufficient and reasonable size and complexity (for you or your team) for this assignment. You may want to review the task scope bullet point under Task Selection and the Plan Updates bullet point under Project Report for ideas about what to include here. (1 paragraph per task)

Via Gradescope, submit the PDF report for HW6a. There is no explicit format (e.g., for headings or citations) required. For example, you may either use an essay structure or a point-by-point list of question answers. The task selection report is worth 20 points and is graded holistically, with approximately equal weight given to each of the items above.

Advice From Former Students

Read what former students say about Homework 6a and project selection.

Panic — My Project or Task Exploded

Some students end up in situations where the tasks they initially selected do not work out (e.g., are too hard, are "sniped" by another developer despite being claimed, etc.). Those students often wonder what bad things will happen if they pick new tasks for HW6b, different from what they reported in HW6a. Similarly, a few students each semester end up in very unlucky situations where the projects they selected don't work out (e.g., the whole project shuts down, no developer ever responds, it's not possible to build the project locally, etc.). Those students often wonder what bad things will happen if they have to pick an entire new project for HW6b not mentioned in HW6a.

Nothing bad happens in such cases. You can still get full credit on HW6b if you change tasks (or even projects). There is a place in the HW6b report to write about such changes. Follow the Golden Rule above and double-check what you have to turn in for the HW6b report. As long as you can fill out all of the fields and rubric items, you are fine.

Clearly it's better and easier if you don't have to change projects or the like. But we're not going to "charge students twice for the same crime" and take off points just because you couldn't predict the future. Students who have to switch things halfway through will already feel behind because of "lost time" and will feel pressure to get up to speed on the new project quickly. Those students usually have to spend more than the minimal required hours on the project. That's already enough of a penalty. As a result, there are no specific rubric items that lose you points if you switch aspects between HW6a and HW6b.

To be clear, you should try to avoid such situations (e.g., by thinking about risk, etc.) as far as possible. But if something does go wrong, it's not the end of the world (or the end of your grade).

HW6b — Project Report

After completing and submitting the modification, write a report about the tasks you have performed. The report will include a description of the project and its business context, a description of your tasks and their context, an explanation of deviations from your plans (in HW6a), and a discussion of your quality assurance efforts and why they were suitable. Specifically, your report should cover:

  1. Names and email ids. You must include your name and UM email id (e.g., "weimerw"). If you have a partner, you must include the partner name and email id as well.
  2. Selected project. A brief description of the open source system to which you contributed (1 paragraph). You may reuse text from Part A.
    • If you were very unlucky and had to change projects from HW6a, which is entirely legal, you should mention the switch and describe the new project in the HW6b report.
  3. Social Good indication. Indicate whether or not you think the project you selected contributes to Social Good. (Note that either answer is full credit.) If the answer is "no", you need not elaborate. If the answer is yes, why does the project qualify? You can use your own words, or select from the 17 Sustainable Development Goals.
  4. Project context. An analysis of the open-source project's context and "business model". This may include a short history of the project, competing open- and closed-source projects, or a discussion of the developers' motivations to build this system. Essentially, we want to know why this project exists and why it is important. (At most one half page.)
    • (You can re-use text from HW6a if it is appropriate for any part of the HW6b report.)
  5. Project governance. Describe the processes and tools the project uses to communicate coordinate among contributors. Are these processes formal or informal? Provide an explicit description (possibly with a diagram) of the acceptance process used for efforts like the task you completed. If applicable, include standards or expectations regarding software engineering activities including requirements, design, and quality assurance. Alternatively, mention that no such standards exist. (Usually about one page; length varies.)
  6. Task description (per task). A description of the tasks you have implemented and a high-level description of how you implemented them. (At most one half page per task.)
    • If you were moderately unlucky and had to change task(s) from HW6a, which is entirely legal, you should mention the switch and describe the new task(s) in the HW6b report.
  7. Submitted artifacts (per task). Evidence of the code, documentation, test cases, and/or other artifacts you produced for the task, and evidence that you submitted them to the project. We require links to publicly available resources (project repository, email archives, pull requests, etc.). Each such link should be accompanied by a brief description.
  8. QA strategy. Describe which QA activities you performed and justify why you selected these QA activities over others. Describe metrics if appropriate. The justification will likely refer to relevant requirements as well as to the project's practices. (At most one page.)
  9. QA evidence. Evidence of your quality assurance activities and an associated description or argument. Evidence might include source code, links to source code of tests, test results, comments from code reviews, reports from static or dynamic analysis tools, links to or screenshots from a continuous integration platform, and so forth. For example, you might use Travis CI, which supports continuous integration testing for GitHub, and link to a CI build in your report (see examples below; while neither required nor sufficient, Travis CI evidence is particularly easy for the course staff to evaluate).
    • (Some students perceive overlap between "QA Evidence" and "Submitted Artifacts". That can definitely be true, but they are officially different questions because there might be QA activities that don't involve submitting something per se (perhaps they involve talking to people or reading things or the like). If something could apply to either category, it does not matter which heading you put it under.)
  10. Plan updates. A description and justification of deviations between your initial plans and your performed activities, if any (there are almost always a few). Changes are expected, but they should be tracked and explained. Describe changes in scope (e.g., fewer tasks) and in the schedule and work allocation. Provide an after-the-fact "what actually happened" schedule and note differences. Explain the causes of the changes, such as unanticipated risks. Most students report time in units of hours (e.g., "we thought we would spend 2 hours on code reading but we actually spent 8.5 hours on it"). (At most one page.)
  11. Your experiences and recommendations. Summarize your experiences (and what you learned!) interacting with this community of open source developers, focusing on any surprising or unusual aspects of the process or interaction. Did you run into any trouble understanding, changing, or contributing to a large, pre-existing project? Were there unanticipated challenges in either implementing your change or in getting the change submitted to, and accepted by, the project maintainers? Did the project collaboration process or culture help or hinder your effort in any way? Characterize any interaction you had with the team leadership and community. Highlight any useful (or useless) input you received. In addition, describe any changes you would make if you were starting a new project from scratch. What worked here (and why), what did not work here (and why), and what would you do instead? You may (but are not required to) also relate the experience from this homework assignment with relevant experience from internships or other projects. (Two or three pages. This is the heart of your report. Convince us that you integrated course concepts and learned something.)
  12. Advice for future students. Give a single sentence of advice to students taking this class in future semesters. This advice can either be about HW6 or any other course aspect. What do you wish you had known earlier? Any non-empty answer counts. We will display such advice anonymously on the webpage for next semester. If you are working with a partner, each of you should give a separate single sentence. If you are willing to let future students see your materials (cf. the examples at the bottom of this webpage), indicate as much in your report.
  13. Optional extra credit. Evidence that at least one of your changes has been accepted into the code base of the open source project. You receive the extra credit if more than zero of your changes are accepted (so 1, 2, and 500 accepted changes all get the same extra credit). This typically takes the form of links or screenshots or associated pull requests and commits. Because of grading logistics, any acceptance must be done by the time you turn in the report; we cannot retroactively award points if they accept your changes just a few days (or even hours or minutes) later. We only give extra credit for changes accepted by the HW6b deadline. (Suggestion: start early!)

Hint. Consider all of the topics we covered in class (for example, glance over the list of lecture topics from the syllabus). They are all fair game here. In addition to the "academic" topics, you should also feel free to compare and contrast your experiences with, or bring in insights from, any of the optional readings or guest lectures. Impress us.

Via Gradescope, submit the PDF report for HW6b. There is no explicit format (e.g., for headings or citations) required — but this is your final report for this class, so you are encouraged to make it look professional. The project report is worth 50 points and is graded holistically. If you provide evidence that your changes were accepted by the maintainers, you will receive +3 points (i.e., 6%) on HW6b.

The report should be single-spaced.

Advice From Former Students

Read what former students say about Homework 6b.

Submission

Submit the two reports via Gradescope. (Note the two different due dates.)

Commentary

This style of final project is popular with top-tier software engineering programs. For example, a very similar assignment is the final homework in Carnegie Mellon's Software Engineering elective (15-313); indeed, this assignment is adapted from that one.

Learning goals include, but are not limited to:

Examples of Task Selection and Project Reports

Some students who took EECS 481 previously graciously agreed to allow their final reports to be made available as examples. You can use these to get examples of all aspects of the assignment, including project selection, task selection, QA, and communication. (Yes, you can just pick one of these projects for your HW6.) Note that some students report that they wished they had chosen different projects: read carefully. In addition, look carefully at whether or not a project was a group or solo effort, as well as whether or the goals were completed — such information can serve as a helpful guide in your own task selection.

(For various reasons, including FERPA, no information is, or will be, given or implied about the grades associated with these examples. If you are concerned about your own grade, you might try to do at least as well as what you perceive to be the best example for each question. Some examples are strong in one area and weak in another.)

We make available the names of projects used by students from two previous offerings of this class: