Teaching Software Engineering as Engineering

My teaching philosophy is to place students in realistic engineering environments where they apply what they learn as they learn it, using projects, tools, and workflows that reflect the way modern software is actually built.

Overview


My approach to teaching software engineering has been shaped by the same principles I value in professional engineering: realistic constraints, iterative improvement, automation, clear feedback, and systems that help people succeed. Rather than teaching tools in isolation, I try to place them in the context of a complete development workflow so students can understand not only how a technology works, but why it matters.

This means courses regularly incorporate source control, automated testing, CI/CD, Linux, networking, containers, cloud and virtualization concepts, security, and increasingly AI-assisted development. The goal is not to reproduce a production environment exactly, but to give students enough of the real engineering context that the practices they learn transfer beyond a single assignment or classroom.

Engineering Practice Technical Mentorship Applied Learning

Production-Style Learning Environments

Students learn more when the environment reinforces the engineering habits the course is trying to teach. I therefore design coursework around workflows that resemble professional development: repositories are version-controlled, tests are automated, builds run in CI, and development occurs across realistic operating-system and infrastructure boundaries.

This approach gives students repeated exposure to the practices that make software maintainable and collaborative. Git, CI/CD, automated testing, Linux, containers, and deployment concepts are not treated as isolated topics; they become part of the normal way work moves from an idea to a working system.

Engineering Practices
Git CI/CD Automated Testing Linux Containers DevOps

Developer Tooling and Automation

Teaching at scale repeatedly exposes friction points that are really software-engineering problems: distributing updates safely, providing timely feedback, validating work consistently, and reducing incidental complexity before students can focus on the concept being learned.

I have addressed those problems by building tools such as CourseUpdater, which distributes instructor-maintained files and tests into student-owned repositories, and Project Pulse, which combines structural and behavioral validation to provide immediate feedback on programming work. These projects reflect a broader design goal: automation should reduce friction without hiding the engineering process from the people using it.

Engineering Practices
Developer Experience Automation CourseUpdater Project Pulse Automated Assessment CI/CD

Teaching Complex Systems

Much of my teaching focuses on systems that are difficult to understand when reduced to isolated commands or APIs. Networking, cybersecurity, software architecture, virtualization, distributed systems, and modern AI all require students to reason about interactions between components, tradeoffs, failure modes, and abstraction boundaries.

I try to make those systems concrete through labs, diagrams, experiments, and progressively more realistic projects. The objective is not memorization; it is helping students develop a mental model they can use to diagnose unfamiliar problems. That same approach is central to technical leadership: explain a complex system clearly enough that another person can reason about it independently.

Engineering Practices & Topics
Software Architecture Networking Cybersecurity AI / LLMs Virtualization Distributed Systems

Open Educational Resources

I also develop open educational resources so that course materials can be reused, adapted, and improved beyond a single semester. This includes an OER Java textbook, programming labs, assignment frameworks, presentations, and AI-focused instructional materials designed to make technically demanding subjects more accessible without oversimplifying them.

Creating reusable instructional material imposes many of the same constraints as building reusable software: the structure has to be understandable, assumptions must be explicit, examples need to remain maintainable, and the material must work for people who were not present when it was created.

Engineering Practices & Topics
Open Educational Resources Java ASP.NET Core AI Reusable Curriculum

Teaching as Technical Leadership


Teaching technical subjects has required many of the same skills I value in architecture and consulting: understanding an unfamiliar problem quickly, explaining difficult ideas to people with different levels of experience, designing environments that help others succeed, diagnosing failures from incomplete information, and continually learning new technologies well enough to make them useful to someone else.

It has also meant leading beyond the classroom. As a program coordinator and curriculum leader, I have worked on program development, continuous improvement, industry-aligned curriculum, faculty mentoring, hiring, institutional strategy, and partnerships with organizations such as AWS Academy and Red Hat Academy. Those responsibilities reinforced an important lesson: technical leadership is as much about creating clarity and enabling other people as it is about making the technical decision itself.

2025 Outstanding Faculty Member of the Year

In 2025, I received WVU Parkersburg's Bernard P. McDonough Foundation Outstanding Faculty Member of the Year Award. The presentation recognized teaching effectiveness together with leadership in computer science program development, continuous curriculum improvement, entrepreneurship initiatives, AWS Academy and Red Hat Academy integration, curriculum governance, mentoring, and institutional service.

  Watch the award presentation (25:57–28:35)

Mentorship Technical Leadership Program Development Continuous Improvement