Software construction is a complicated process. It is enjoyable, but it is also very hard work, from start to finish. It invariably involves working very long hours (usually weekends), attending countless meetings and discussions, and rushing to meet the deadlines. In fact, the same goes for writing a book. You do it, however, because you believe in it. You're creating something new, and that's exciting. It is also very challenging but that just fuels our desire to get it done, get it done right, and get it right the first time. In my opinion there's simply nothing better than seeing a system you've worked on go-live. Of course, afterwards you always look back and think how you could have done it better, and that's what makes you advance as individuals and us as an industry overall.
I'm not taking anything away from the great achievement of getting a software system live, but going live is not an indication that the project was a true success. The fact is that some systems still go-live when they're not entirely fit for purpose. Some may not work functionally or have all the required functionality. Some may not work technically. They may failover frequently, or they may be slow or difficult to use, support, and/or maintain. In a lot of cases, projects go-live after experiencing huge delays and massive budget overruns and it is hard to see these as true success stories. A true success story is a project that delivers a system with all the required functionality, on time and within budget.
So, what is the secret to success? Why is it that some software projects are a huge success and others are considered a failure? Is it the design? Is it the process? Is it the planning or the estimating? Is it the people or the skills? Is it the quality of the product? The very short answer is that it is usually a combination of these factors that leads to the success or failure ranking of a project. As developers, you play a huge part in the process; everything you do can have a positive or negative effect on the overall outcome of a project.
A software system is not just a software application. A software system is the sum of all its parts. A system encompasses all the applications, all the environments, all the processes, and all the tools that go along with it. For a system to be production-ready, all these facets need to be production-ready, too. For a project to be successful, all the aspects of production readiness and the processes required to get there need to be fully understood and taken into account during the decision-making process. The software development lifecycle is a system. It consists of applications, environments, processes, and tools and the outputs of this process are the software systems that you develop. Everything needs to work in harmony to be truly successful.
This book is neither a project management reference nor a technology-or language-specific set of best practices. Although the examples in this book use Microsoft technologies, they can equally apply to other languages and technologies. This book is a guide to designing and building production-ready software from the start. This means understanding the impact of the choices you make and building software and processes that are fit for all the purposes they need to be.
Today's mission-critical systems need to work and they need to work very well. Having a thorough understanding of what is involved in designing, building, and running large-scale software systems is a key factor in success and that is exactly what this book will provide you with.
What this book covers
Design - Build - Run covers all the topics relating to building production-ready systems, which includes understanding the build process and the tools you need to develop and test your applications. It covers all the quality characteristics your system needs to meet and what you can do to ensure that you meet them. The book also covers all the environments and circumstances your system could be used in and how you can ensure that it is fit for these purposes. Most important, it covers the practices and patterns you can leverage during design and development to improve your software quality, lower the total cost of ownership, and ensure that it is truly production-ready.
This book is restricted to the "construction" phase of the development lifecycle, which, for the purposes of this book will encompass design, build, unit testing, and integration testing. Other areas of the development lifecycle are referred to but only where necessary to provide context or where the key concepts are relevant.
The book looks at what is involved in determining the development processes, the environments involved, and the processes and tools. You are going to look at how and where to set the build quality bar and, more important, how you will achieve it through effective use of the skills, tools, and technologies you have.
In particular, I focus on the patterns and practices that you can use to design and build your software to better support the following:
- The functional and technical quality characteristics for all its users and uses
- The data centers and environments it can be deployed to and how it can be used in them
- The operations and application maintenance functions, including monitoring, reporting, batch, issue diagnosis, support and resolution, and maintenance of the solution
Whom this book is for
This book focuses primarily on the technical aspects of production-ready software development and, as such, it is directed more toward software developers and development team leaders. Software architects and designers will also learn a great deal from reading this book, as the journey from design to production covers a wide variety of principles and practices.
To really get the most out of this book, you should be familiar with software design and development practices. You should be able to read flow charts and UML diagrams. You should also be familiar with software development and the concepts of unit testing and integration testing. Knowledge of more advanced topics such as code coverage, code analysis, and performance analysis is an advantage but not necessary. Knowledge of performance counters and the Windows Event Log will also help, but again, it is not necessary.
This book will enable you to build your skills by providing real-world knowledge and practical advice to take into the field to build truly award-winning solutions.