Open Source Project Course

The goals of this course are to help students develop a better resume (or portfolio of work), connect professionally and develop important software engineering skills. Each student will choose an open source project to contribute to, improving their technical depth in an area of interest to them. We hope this course will help students stand out, find a job, and thrive in their careers.

Learning outcomes

These learning outcomes are motivated by the mission of the software engineering emphasis: "We develop Christlike leaders in software engineering who bless others by being creative, collaborative, capable, and curious." And by the aims of a BYU education: "A BYU education should be (1) spiritually strengthening, (2) intellectually enlarging, and (3) character building, leading to (4) lifelong learning and service." At a high level, we hope that students will be able to:

Apply engineering skills to make meaningful, quality contributions, following appropriate processes

We hope the following more specific learning outcomes will help you accomplish that outcome during this course, but we also hope they will provide a foundation that will allow you to improve at your ability to make meaningful contributions throughout your career.

Creative

  1. Apply a structured problem-solving process (Design Thinking or CPS, say) to identify problems or opportunities, and ...
  2. Generate, evaluate, and select solutions based on project priorities and constraints (divergent and convergent thinking)
  • Prayerfully seek inspiration and apply creativity in solving problems professionally, personally, and in service to others

Collaborative

  1. Effectively use (project-specific) collaboration tools and processes
  2. Communicate clearly and persuasively about technical topics, while engaging constructively with feedback
  • Be an uplifting influence and an example of a believer in professional and personal relationships and collaborations

Curious

  1. Develop expertise in tools and techniques for investigating and understanding an existing code base
  2. Develop strategies for independently learning new programming languages, frameworks, and other technology
  • Develop the skills, confidence, and desire to learn independently--including both spiritually and intellectually

Capable

  1. Evaluate and refine engineering work against project goals (correctness, design fit, efficiency, etc.)
  2. Apply appropriate tools and analytical thinking to resolve complex technical problems
  • Develop talents with diligence, faith, resilience, humility, and a desire to grow

Note that the spiritual learning outcomes listed under each category above are not generally assessed in the course. However, they are prominent in the reading, discussing, and reflecting parts of the course, and we hope students apply them.

Course structure

Each full week of the course will be focused on one main topic, related to a course learning outcome. Outside of class time, student work in the course will primarily involve contributing to an open source project of their choice. The open source project is how students apply what is discussed and practiced during class time. A typical week will look something like the following (beginning on Tuesday and then spilling into Thursday).

  1. Reading: Each week students will be assigned some reading of substance. We expect that students who do the reading in advance will get far more out of the class.

  2. Discussing: Tuesday class will begin with a discussion of the topic, in part based on the reading. We hope students will come prepared to ask questions and contribute to the discussion.

  3. Practicing: Next, students will break into small groups to practice skills related to the topic. Practice will be highly interactive, with interruptions for class discussion and feedback.

  4. Applying: Students will independently apply what is learned in an open source project to deepen their understanding of the topic and of course to contribute to the project.

  5. Reflecting: On a somewhat flexible schedule, students will submit a reflection on the topic based on some assigned questions. There is no "right answer" here, but reflections will be graded on the depth of insights and understanding displayed.

Throughout the course we will use the Ruby Programming Language project as a running example. Together we will discuss topics, practice skills, and explore tooling often in the context of the Ruby project. Independently students will apply the same ideas on an open source project of their choice.

Open source project work schedule

The course schedule is designed to move students through the process of finding, joining, and contributing to an open source project. We hope that the course topics will give students the skills and confidence they need to succeed in this effort. The schedule or steps we will follow are summarized below. However, students should feel free to adapt this schedule as appropriate.

  1. Select a project
  2. Learn about the technology
    • Programming languages and relevant frameworks
    • Source code (including key abstractions and design rationale) and build tools
  3. Learn about the process
    • Communication tooling and culture
    • Contribution tooling and processes
  4. Participate socially
    • Join discussions
    • Report and triage bugs
  5. Engineering work
    • Identify possible contribution(s) based on project goals
    • Develop and socialize the contribution
  6. Contribute your work
    • Submit pull request (or similar)
    • Work through review process
  7. Continue steps 2, 3, and 4 throughout the course, and repeat steps 5 and 6 as possible

There are many ways to contribute beyond changes to the core systems. There are support systems, documentation, bug triage and reporting, and answering questions, etc. However, to pass this course, contributions will need to be meaningful and represent significant engineering effort.

We hope that after the course students will continue working on the project and maintain the relationships they've developed.

Generative LLM policy

Students are encouraged to make use of any generative LLM tools they find useful. However, please consider two things:

  1. The use of code generation tools needs to be consistent with the rules and culture of the open source project being contributed to.
  2. Students remain responsible for the code or other artifacts they produce. Students need to ensure it meets the quality standards of the open source project (is readable, follows style guides, is well designed, defect free, etc.).

The second point reflects the idea that expertise with such tools is not just about prompting, but verifying what is generated. Throughout the semester, class time will include some practice with many tools (not just generative LLM tools) that we believe will be valuable to students.

Final thoughts

You will notice a focus on tools in this topic list. It is not our intention to teach you all the tools, and the specific tools, you might need to use to contribute to the open source project you have selected. That wouldn't be feasible since you will all be working on different projects with different technologies. Instead our aim is to (1) introduce you to classes of tools that are useful in many situations, and (2) encourage you to independently become proficient in the tools relevant to your selected project.