Quality Software Development in the Age of AI
James Skon, Chalmers 428, 740-427-5369
Department of Mathematics and Statistics
Room: Hayes 213
Time: 1:10-2:00pm
Office: Chalmer 428
Office Hours: 10:11-11:00, Days: MWF, 9:00-11:00, Days: MWF
Please sign up for an appointment here: Link
Walk-ins are welcome, but people with appointments are given priority.
There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.C. A. R. Hoare (1980 Turing Award Lecture)
Course Description
This course introduces students to modern software development practices in the age of AI. Students learn to design, build, test, deploy, and maintain full-stack web applications using React, Node.js, and MariaDB on a Linux platform. Emphasis is placed on high-quality software engineering practices, including code readability, modular design, version control, testing, security, and continuous integration. The course begins by developing foundational skills with limited reliance on AI and then transitions to responsible AI-assisted development, teaching students how to use AI tools effectively while avoiding poorly designed and unmaintainable code. By the end of the course, students will have experience building AI-enabled applications and completing a substantial project that demonstrates thoughtful design, robust implementation, and professional development workflows.
Course Objectives
By the end of this course, students will be able to:
- Deliver a substantial software project that demonstrates professional-quality design, implementation, testing, deployment, and responsible AI-assisted development.Course Core Philosophy.
- Design and implement full-stack web applications using React, Node.js, and MariaDB, deployed on a Linux server using professional development tools.
- Apply core software engineering principles—including modularity, readability, separation of concerns, and maintainability—when designing and implementing software systems.
- Use version control effectively by managing codebases with Git and GitHub, including branching, pull requests, code reviews, and meaningful commit histories.
- Develop and execute testing strategies that include unit testing, integration testing, and system testing, and use tests to support regression prevention.
- Set up and use continuous integration and deployment (CI/CD) pipelines to automate testing and deployment workflows.
- Identify and mitigate common security risks in web applications, including improper authentication, insecure data handling, and injection vulnerabilities.
- Design software systems before implementation, using written design documents, interface definitions, and architectural diagrams to guide development.
- Use AI tools responsibly as development assistants, including generating code, tests, and documentation, while critically evaluating, refining, and taking full responsibility for AI-generated output.
- Write effective prompts and specifications for AI tools that reflect clear requirements, constraints, and design intent.
- Evaluate and refactor AI-generated code to improve correctness, performance, security, readability, and maintainability.
- Integrate AI services into web applications in a safe and purposeful way, recognizing appropriate and inappropriate uses of AI within software systems.
- Collaborate effectively on software projects, either individually or in teams, by planning work, communicating design decisions, and iterating based on feedback.
- Explain and justify design and implementation decisions, including tradeoffs related to performance, security, maintainability, and AI usage.
Three mantras that repeat all semester:
- AI is a junior developer, not an architect
- Design precedes code
- If you can’t explain it, you don’t ship it
Course Narrative: Software Development in the Age of AI
Software development is undergoing a fundamental shift. Modern developers now work alongside powerful AI tools that can generate code, tests, documentation, and even design suggestions. While these tools can dramatically increase productivity, they also introduce new risks: poorly designed systems, insecure code, unmaintainable “AI slop,” and a loss of understanding and responsibility.
This course is designed to prepare students to be competent, thoughtful, and responsible software developers in an AI-assisted world.
Rather than treating AI as a shortcut or replacement for learning, this course treats AI as a tool that amplifies both good and bad engineering practices. Students will learn how to design, build, test, deploy, and maintain real web applications—first by developing foundational skills without heavy reliance on AI, and later by learning how to use AI effectively as a coding, design, and testing assistant.
The course has two intertwined goals that run throughout the semester:
First, students will learn the principles of high-quality software development. These include good design practices, readable and maintainable code, effective use of version control, testing at multiple levels (unit, integration, and system testing), security awareness, and professional workflows such as code reviews, continuous integration, and continuous deployment. These topics will be revisited continuously as students build increasingly complex systems.
Second, students will learn modern full-stack web development from the ground up. Using React on the frontend, Node.js on the backend, and MariaDB for persistent storage, students will build applications that run on a Linux (Ubuntu) server using industry-standard tools such as VS Code and GitHub. The course assumes only an introductory programming background and emphasizes understanding the platform before relying on automation.
During the first part of the semester, students will focus on learning the full-stack platform and fundamental software engineering practices, with limited use of AI tools. This phase emphasizes writing, debugging, and understanding code directly. Students will build small but complete applications to develop confidence and technical fluency.
Midway through the semester, the course intentionally transitions to AI-assisted development. Students will learn how to use AI responsibly by starting with clear designs, well-defined interfaces, and explicit requirements. They will practice writing effective prompts, evaluating AI-generated code, refactoring weak solutions, and using AI to assist with testing and documentation—while remaining fully accountable for correctness, security, and maintainability.
In the latter part of the course, students will design and build an AI-enabled web application, learning how to integrate AI services into their own systems. Finally, students will propose and develop a substantial project—either individually or in small teams—that they will iterate on for the remainder of the semester. These projects must demonstrate thoughtful design, robust implementation, effective testing, and responsible use of AI.
By the end of the course, students will not only know how to build modern web applications, but will also understand how to think critically about software quality in an era where writing code is no longer the hardest part. The goal is to produce developers who can design well, reason clearly, test thoroughly, and use AI as a powerful assistant rather than an unquestioned authority.
Learning Resources
Grading
| Area | Resource | Type | Link | Notes |
|---|---|---|---|---|
| Foundations | Modern Software Engineering — David Farley | Book, summary | (Bookstore) | Primary conceptual text |
| Continuous Delivery — David Farley | Videos | https://www.youtube.com/@ContinuousDelivery | Engineering mindset | |
| Backend | Node.js Documentation | Docs | https://nodejs.org/en/docs | Official reference |
| Express Documentation | Docs | https://expressjs.com/ | Routing & middleware | |
| MDN Express Tutorial | Tutorial | https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs | Best beginner guide | |
| Node & Express Crash Course (Traversy Media) | Video | https://www.youtube.com/watch?v=Oe421EPjeBE | End-to-end overview | |
| Frontend | React Documentation | Docs | https://react.dev | Modern React |
| React Official Tutorial | Tutorial | https://react.dev/learn | Required early | |
| React in 100 Seconds (Fireship) | Video | https://www.youtube.com/watch?v=Tn6-PIqc4UM | Mental model | |
| Net Ninja React Playlist | Video | https://www.youtube.com/playlist?list=PL4cUxeGkcC9jsx6G9Y0t5k0U0n8x-0rF | Clear pacing | |
| Database | MariaDB Documentation | Docs | https://mariadb.com/docs/ | Production DB |
| MySQL Documentation | Docs | https://dev.mysql.com/doc/ | SQL reference | |
| SQLBolt | Interactive | https://sqlbolt.com/ | Strongly recommended | |
| Database Normalization Guide | Reading | https://www.guru99.com/database-normalization.html | Schema basics | |
| UI / CSS | Bootstrap Documentation | Docs | https://getbootstrap.com/docs/5.3/ | Layout & components |
| Bootstrap 5 Crash Course | Video | https://www.youtube.com/watch?v=4sosXZsdy-s | Fast onboarding | |
| Version Control | Git Documentation | Docs | https://git-scm.com/doc | Core concepts |
| GitHub Documentation | Docs | https://docs.github.com/ | Workflow reference | |
| GitHub Hello World | Tutorial | https://docs.github.com/en/get-started/quickstart/hello-world | First GitHub task | |
| Oh My Git! | Interactive | https://ohmygit.org/ | Learn Git by doing | |
| Testing | Jest Documentation | Docs | https://jestjs.io/docs/getting-started | Unit testing |
| Jest Crash Course | Video | https://www.youtube.com/watch?v=7r4xVDI2vho | Practical intro | |
| Supertest | Docs | https://www.npmjs.com/package/supertest | API testing | |
| CI / CD | GitHub Actions Documentation | Docs | https://docs.github.com/en/actions | CI pipelines |
| GitHub Actions in 15 Minutes | Video | https://www.youtube.com/watch?v=R8_veQiYBjI | Minimal intro | |
| AI as a Junior Developer | David Farley — AI & Software Engineering | Video | https://www.youtube.com/@ContinuousDelivery | Engineering-first AI |
| Kent Beck — Tidy First? | Reading | https://tidyfirst.substack.com | Design before automation | |
| OpenAI Prompt Engineering Guide | Guide | https://platform.openai.com/docs/guides/prompt-engineering | Better prompts | |
| Simon Willison — AI Blog | Blog | https://simonwillison.net | Practical AI caution |
Due Date: All assignments are due as specified in the grading table below.
Missing Lab Assignments: Labs are an important part of this class; the effort spent on them is a crucial part of the learning process. Failure to submit labs is unacceptable: students earning 0s on two labs cannot receive a grade higher than a B- for the course; students earning three 0s on labs will receive an automatic F for the course.
Collaboration and Academic Honesty: In order to facilitate learning, students are encouraged to discuss assignments amongst themselves. Copying a solution is not, however, the same as “discussing.” A good rule of thumb is the “cup of coffee” rule. After discussing a problem, you should not take away any written record or notes of the discussion. Go have a cup of coffee or cocoa, and read the front page of the newspaper. If you can still re-create the problem solution afterward from memory, then you have learned something, and are not simply copying. (The “group work” are exempt from this, as they are intended to be done together.)
| Category | % | Notes |
| Homework | 20% | Due by Midnight. 10% penalty for up top 24 hours late, then 50% off. |
| Quizzes | 15% | Must be taken in class. Cannot be taken later without a note from either the provost office or the dean of students (Professor Hawks). |
| Individual Projects | 45% | Due by midnight on day due. 5% penalty for for up to 12 hours late. One assignment may be up to 24 hours late with no penalty with instructor notification. Projects have intermediate milestones and final complete project. Each milestones are typically worth 10-20 points, while the final grade is 100 points. |
| Team Project | 20% | Similar grading as above. All members are typically given the same grade unless there is evidence of certain team mambers. |
| TOTAL | 100% |
Late Policy
Late submissions are only accepted with prior permission via a [Request Form].
- One Week Extension: Request at least 1 week in advance.
- Three-Day Extension: Request at least 3 days in advance.
- 24-Hour Extension: Request up until the due date.
Do not modify submissions after the due date without permission.
Schedule
| Date | Topic | Reading / Resource(s) | Assignments Due |
|---|---|---|---|
| Jan 12 | Course overview; software engineering in the age of AI Slides 14 Steps checklist | Modern Software Engineering Preface (Farley); AI as a Junior Developer: Farley continuous delivery channel https://www.youtube.com/@ContinuousDelivery Programming Setup | |
| Jan 14 | Linux server walkthrough; SSH, logs | Ubuntu/Linux tutorials: https://linuxize.com; VS Code SSH guide https://code.visualstudio.com/docs/remote/ssh | |
| Jan 16 | What is software engineering? Learning vs guessing | Farley Ch. 1 | HW1 |
| Jan 19 | Feedback loops; engineering vs programming | Farley Ch. 1 | Lab 1 |
| Jan 21 | Git fundamentals; commits as design history | Git docs https://git-scm.com/doc; GitHub hello world https://docs.github.com/en/get-started/quickstart/hello-world | |
| Jan 23 | Node.js runtime; first Express server | Node.js docs https://nodejs.org/en/docs; Express docs https://expressjs.com/ | |
| Jan 26 | Managing complexity; separation of concerns | Farley Ch. 3 | Lab 2 |
| Jan 28 | REST APIs; request/response contracts | MDN Express tutorial https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs | |
| Jan 30 | MariaDB basics; schema design | MariaDB docs https://mariadb.com/docs; SQLBolt https://sqlbolt.com/ | |
| Feb 2 | React fundamentals; components & state | React documentation https://react.dev; React Official Tutorial https://react.dev/learn | |
| Feb 4 | Frontend–backend integration | React + Express Tutorial (React docs) https://react.dev/learn | Lab 3 |
| Feb 6 | End-to-end CRUD; common failure modes | React + Node + MariaDB example: https://react.dev/learn | A2 assigned |
| Feb 9 | Code readability; naming & structure | Farley Ch. 5 | |
| Feb 11 | Error handling; logging vs debugging | Node & Express error-handling guide https://expressjs.com/en/guide/error-handling.html | |
| Feb 13 | Code reviews; refactoring basics | Refactoring intro (Martin Fowler blog) https://martinfowler.com/books/refactoring.html | |
| Feb 16 | Evolvable design; refactoring safely | Farley Ch. 6 | |
| Feb 18 | Peer code review workshop | GitHub Code Review docs https://docs.github.com/en/pull-requests | |
| Feb 20 | Refactor demo; design discussion | React + Node refactor patterns (Fireship) https://www.youtube.com/watch?v=Z1Yd7upQsXY | A2 due; A3 assigned |
| Feb 23 | Testing as feedback | Farley Ch. 7 | |
| Feb 25 | Unit testing with Jest | Jest docs https://jestjs.io/docs/getting-started | |
| Feb 27 | Integration testing; regression | Supertest (API testing) https://www.npmjs.com/package/supertest | A4 assigned |
| Mar 2–17 | Spring Break — No Classes | ||
| Mar 18 | Continuous Integration; automation | Farley Ch. 8 | |
| Mar 20 | GitHub Actions walkthrough | GitHub Actions docs https://docs.github.com/en/actions; Actions in 15 minutes https://www.youtube.com/watch?v=R8_veQiYBjI | |
| Mar 23 | Continuous Delivery; deployment | Farley Ch. 9 | |
| Mar 25 | CI pipelines; failing builds | CI case studies (GitHub docs) https://docs.github.com/en/actions | |
| Mar 27 | Deployment to Ubuntu; observability | Ubuntu server deployment guide https://linuxize.com/post/how-to-deploy-nodejs-app/ | A4 due; A5 assigned |
| Mar 30 | Architecture as constraint | Farley Ch. 10 | |
| Apr 1 | Design before code; diagrams | UML basics https://creately.com/diagram-community/popular/t/uml-diagram | |
| Apr 3 | AI as junior developer; responsibility | AI as a Junior Developer videos: Farley continuous delivery channel https://www.youtube.com/@ContinuousDelivery; Kent Beck Tidy First? https://tidyfirst.substack.com/ | A6 assigned |
| Apr 6 | Writing good AI prompts | OpenAI Prompt Engineering Guide https://platform.openai.com/docs/guides/prompt-engineering | |
| Apr 8 | Evaluating AI-generated code | Simon Willison AI blog https://simonwillison.net/ | |
| Apr 10 | Refactoring AI output | Prompting + Refactoring checklist (course handout) | A5 due |
| Apr 13 | AI as dependency; cost & latency | Farley Ch. 12 | |
| Apr 15 | Failure modes; fallback strategies | Reliability basics (article) https://martinfowler.com/articles/feature-toggles.html | |
| Apr 17 | Security & AI; prompt injection | Secure coding with AI (guide) https://owasp.org/www-community/AI_Security | A6 due; A7 assigned |
| Apr 20 | Observability for AI systems | Observability 101 (blog) https://www.robustperception.io/what-is-observability | |
| Apr 22 | Ethics; when not to use AI | Responsible AI (policy doc) https://www.ibm.com/cloud/learn/ethical-ai | |
| Apr 24 | Capstone proposals; scope review | Capstone proposal guide (course handout) | |
| Apr 27 | Continuous improvement | Farley Ch. 14 | |
| Apr 29 | Project workday; instructor reviews | ||
| May 1 | Post-mortems; design defense prep | Project post-mortem template (course handout) | A7 due |
| May 2 | Final class: synthesis & wrap-up | ||
| May 9 | Final project demos / defense | Final project due |
Final Project Grading Rubric (100 points)
| Category | Excellent | Adequate | Needs Work | Points |
|---|---|---|---|---|
| Design & Problem | Clear problem, solid design, good structure | Basic idea, partial design | Unclear or weak design | 20 |
| Implementation | Clean, modular, readable code | Works but messy | Fragile or confusing | 25 |
| Testing | Meaningful tests; regressions prevented | Minimal tests | Little or no testing | 20 |
| AI Use & Judgment | AI used thoughtfully; output improved | AI used with limited review | Uncritical AI use | 15 |
| CI / Deployment | Automated tests & reliable deploy | Partial automation | Manual or broken | 10 |
| Communication | Clear demo & explanation | Basic explanation | Poor or missing | 10 |
Total: 100 points
| Requirement | Comments | Points | Score |
| Meets Functional Expectations | 40 | ||
| Presentation Organization | 30 | ||
| Preparation – Team is prepared with examples | 30 | ||
| Total | 100 |
Tools
- Visual Studio Code
- HTML Validator
- cygwin – This is a tool to give you Linux software on a Windows system. A good way to get SSH.
- NetBeans
- Linux
- in on from Mac
- Using Notepad++ to edit and transfer files on Windows
- Using TextWrangler to edit and transfer files on Mac
- html & css
- Introduction to HTML
- Introduction to SQL Course
- Information on XMLHttpRequest Object
- AJAX introduction
- AJAX programming hints and suggestions
- Tips for using GitHub and git
- POSIX Threads Programming
- XML Parser for C++, Documentation
- 7 JavaScript Things I Wish I Knew Much Earlier In My Career
- Data Visualization with D3 course
- Using Node.js To Create Real-Time Web Applications
- Socket.io: let’s go to real time!
- Socket: emit Cheat Sheet, Serving multiple file types.
- Fifo’s in python
- to guide for developing software
Schedule
Non Discrimination Statement
Kenyon College does not discriminate in its educational programs and activities on the basis of race, color, national origin, ancestry, sex, gender, gender identity, gender expression, sexual orientation, disability, age, religion, medical condition, veteran status, marital status, genetic information, or any other characteristic protected by institutional policy or state, local, or federal law. The requirement of non-discrimination in educational programs and activities extends to employment and admission.
All employees, including faculty, are considered Responsible Employees and must notify the College’s Civil Rights & Title IX Coordinator with any relevant information.
For further information, please refer to the following Kenyon College policies:
Sexual Misconduct & Harassment: Title IX, VAWA, Title VII:
Pythonps://www.kenyon.edu/directories/offices-services/ocr/title-ix-vawa/kenyon-policies/title-ix-policy/
Discrimination & Discriminatory Harassment Policy (non sex or gender):
Pythonps://www.kenyon.edu/directories/offices-services/ocr/discrimination/
ADA & Section 504:
Pythonps://www.kenyon.edu/directories/offices-services/ocr/discrimination/504-ada-grievance/student-grievance-procedure-resolving-complaints-under-ada-section-504/
Disabilities
If you have any disability and therefore may have need for some type of accommodation in order to participate fully in this class, please feel free to discuss your concerns in private with Erin Salva, director of Student Accessibility and Support Services (SASS). (phone: (740) 427-5453).
Statement on Title IX
Kenyon College does not discriminate in its educational programs and activities on the basis of race, color, national origin, ancestry, sex, gender, gender identity, gender expression, sexual orientation, disability, age, religion, medical condition, veteran status, marital status, genetic information, or any other characteristic protected by institutional policy or state, local, or federal law. The requirement of non-discrimination in educational programs and activities extends to employment and admission.
All employees, including faculty, are considered Responsible Employees and must notify the College’s Civil Rights & Title IX Coordinator with any relevant information.
For further information, please refer to the following Kenyon College policies:
