Welcome to Modern Software Development Practices#
How this course was born#
My role as a tech lead and portfolio manager, responsible for several products, drove me to find and share tools that could help our team work smarter and more effectively. I focused on ensuring these tools were easy for everyone to use and encouraged teams to adopt them.
This course is designed to benefit those with academic backgrounds unrelated to software development. We will explore key topics, from code management with Git to testing and debugging strategies, to equip students with tools and techniques that will hopefully make them enjoy their work, whether alone or as part of a software development team.
Are Software Development Practices Still Relevant?#
With tools like Generative AI now capable of writing code, it’s natural to question the future of software development and the skills required to succeed in it. No one can predict the future with certainty, so instead of making bold claims, let’s explore this question from first principles.
Let’s start with a foundational truth: building useful software is about managing complexity. Whether the code is written by a person or generated by an AI, any non-trivial application is a complex system of interlocking parts. This complexity doesn’t disappear; it has to be managed. Software development practices are, at their core, the methods we’ve developed over decades for managing that complexity.
Consider these underlying principles:
Clarity of Intent: Before any code can be created, a human must clearly define the problem and the desired outcome. You must translate a vague need into a precise set of logical instructions. This process of problem decomposition and specifying intent is a fundamental skill of structured thought.
Systematic Verification: An AI can generate code, but who is accountable for it? Ultimately, a human must verify that the code is correct, secure, and reliable. The principles of testing and debugging are not just about finding typos; they are a systematic process for ensuring quality and taking responsibility for the final product.
Managing Change: Software is never truly “finished.” It evolves. Version control systems like Git are not just for backing up files; they provide a structured way to manage change over time, collaborate with others, and understand the history of a project. This need to manage evolution is a constant.
Viewed from this perspective, learning software development practices is less about learning the transient syntax of a programming language and more about mastering durable principles of structured thinking, quality control, and complexity management. These are skills that retain their value regardless of how the code itself is generated.
What Do You Hope to Gain?#
Given the uncertainties we’ve just discussed, it’s more important than ever to be clear about your own learning objectives. So, before we dive in, I encourage you to pause and reflect on what brought you here.
Please answer the following questions for yourself:
What is my primary expectation for this course?
What kind of structured thinking skills do I hope to develop?
What do I want to be able to build or competently manage after this course?