Programming Beyond Practices
by Gregory T. Brown
Copyright 2017 Gregory Brown. All rights reserved.
Printed in the United States of America.
Published by OReilly Media, Inc. , 1005 Gravenstein Highway North, Sebastopol, CA 95472.
OReilly books may be purchased for educational, business, or sales promotional use. Online editions are also available for most titles (http://safaribooksonline.com). For more information, contact our corporate/institutional sales department: 800-998-9938 or corporate@oreilly.com .
- Editors: Mike Loukides and Jeff Bleiel
- Production Editor: Kristen Brown
- Copyeditor: Stephanie Morillo
- Proofreader: Rachel Monaghan
- Indexer: WordCo Indexing Services, Inc.
- Interior Designer: David Futato
- Cover Designer: Karen Montgomery
- Illustrator: Rebecca Demarest
- October 2016: First Edition
Revision History for the First Edition
- 2016-10-04: First Release
See http://oreilly.com/catalog/errata.csp?isbn=9781491943823 for release details.
The OReilly logo is a registered trademark of OReilly Media, Inc. Programming Beyond Practices, the cover image, and related trade dress are trademarks of OReilly Media, Inc.
While the publisher and the author have used good faith efforts to ensure that the information and instructions contained in this work are accurate, the publisher and the author disclaim all responsibility for errors or omissions, including without limitation responsibility for damages resulting from the use of or reliance on this work. Use of the information and instructions contained in this work is at your own risk. If any code samples or other technology this work contains or describes is subject to open source licenses or the intellectual property rights of others, it is your responsibility to ensure that your use thereof complies with such licenses and/or rights.
978-1-491-94382-3
[LSI]
About This Book
This is not a textbook. It is a collection of short stories meant to help you refine your way of thinking about and working on software projects.
You wont find any neatly packaged prescriptive advice within these pages. Instead, you will see example after example of the many problems we encounter as practicing developers, and the thought process involved in discovering how to solve them.
To encourage you to read this work in a way that brings out your creative side, I made you the main character in each of its stories. This will undoubtedly feel a bit weird to you, and even as I write this introduction, it feels weird to me, too!
My hope is that by embedding you in the work, this book can be more than just another stream of stern admonitions flowing down from the hilltops where Expert Programmers live. Instead, I want you to ask questions like, If I were in this situation, would I really do things this way? If not, why not?
As you read this book, I invite you to shine the light inward and question your own practices, habits, and perspectives at a deeper level. For best results, keep a journal nearby while reading and then share whatever ideas you jot down with your friends and coworkers. The concepts in this work are meant to be thought about and discussed, not just consumed.
In each story, youll wear a different hat as you navigate your way through imaginary worlds that have been carefully constructed to teach you useful lessons. But the most important lesson of all will come from noticing the friction points and meaningful differences between the real you and the characters Ive written for you.
Yes, that sounds a bit ambitious. But the entire point of reading or writing a book is to stretch ourselves a little bit, to become better at what we do. Were in this together, and with your help, I think well do just fine.
Buckle up, friend. Its time for our journey to begin.
The Journey
The story arc of this book covers a full career in software development, condensed down into a quick read that is meant to be accessible to all practicing developers.
: You are a competent programmer, and you are putting your skills to good use by helping people explore new product ideas through rapid prototyping.
: Your work becomes more complicated. You need to incrementally grow existing systems and you have many active customers to support. Theres a feeling of conflict between what you think is the right way to work, and the pressure around you to ship new features quickly.
: You gain a deeper understanding of the costs of rushed decision making, especially at the integration points between your own code and the outside world. Youve learned a great deal from past mistakes, and have started to focus on the complex relationships between business, customer service, and technical work.
: You are now a highly experienced developer. You are capable of helping others understand how to think about programming and problem solving, and have started to mentor a friend who is new to the field.
: Youve become an effective teacher, and your development experience is strong enough that youre able to think on your feet, even in the context of live demonstrations. You use these skills to help students bridge the gap between theory and practice in a classroom setting.
: You are starting to progress down the path to mastery. Youre able to pinpoint the weak spots of legacy software systems and design proper replacements for them, optimizing for both business outcomes and human-friendly workflows.
: You now have enough familiarity with the whole business of software that youre capable of working within an organization to identify and fix problems at every level. Your core competency is still in software development, but youve gained enough experience to communicate well at many levels.
: You start to wonder about the future of the computing industry as a whole. At this point, youre free to pick your own career path, so figuring out where youre going and why starts to be the most important question.
Because the career of a software developer is more like a spiral than a line, I encourage you to read through all of these chapters, no matter what your current skill level is.
Ive written these stories to work at many levels, and theres no dividing line between the basic and advanced topics in this book. Each chapter is self-contained, so jumping around is alright...but for best results, read from cover to cover.
Chapter 1. Using Prototypes to Explore Project Ideas
Imagine that you work for an agency that helps clients navigate the early stages of product design and project planning.
No matter what problem space you are working in, the first step isalways to get ideas out of a clients head and into the world as quicklyas you possibly can. Conversations and wireframes can be useful forfinding a starting point, but exploratory programming soon followsbecause words and pictures alone can only take you so far.
By getting working software into the mix early in the process, productdesign becomes an interactive collaboration. Fast feedback loops allowstumbling blocks to be quickly identified and dealt with before they canburn up too much time and energy in the later (and more expensive)stages of development.
There are many moving parts in even the most simple software systems, so it pays to set them in motion early on to discover how they interact with one another. In some ways every project is different, but in thissense every project is the same.
This week, you will work with your pairing partner Samara to develop afunctional prototype of a music video recommendations system. Theinitial feature set does not need to be perfectly polished; it justneeds to be useful enough to collect feedback from people who may findthe product interesting.