7 Habits of Effective Software Architects and Developers
By Bishr Tabbaa
11 - 14 minutes
Understand Technology Holistically. Delivering technology solutions requires more than choices about just a programming language, SDK library, or infrastructure provider. What is the Big Picture? It means asking and answering good questions. It means having a comprehensive vision aligned with organizational capability (present and future) and thinking about security, performance, databases, operating systems, infrastructure (cloud vs. on-premise), availability, resiliency, networking, user interfaces, device access, monitoring, reporting, testing, product/project management, testing, support, customer requirements, change management, and much more. The system consists of the individual components and their relationships to each other; this includes Man and Machine. The whole matters beyond the sum of the parts.
2. Get Things Done. Balancing principle and practice is an art, not a science. This balance is situation dependent; focusing on delivering value to customers (doing the right thing at the right time) whilst giving attention to the system’s evolving architectural quality (doing things the right way). Use advanced CASE and IDE tools. Automate repetitive tasks such as regression tests, builds, and deployments. Be proactive — not reactive. Communicate effectively by email, telephone, IM, and also in person by facilitating and presenting information in groups. Use wikis to share information; use online backlogs to manage projects and tasks across the team.
3. First Things First. Prioritize what is important and weight tasks by “bang for the buck”; some call this being Agile or common sense. Do not get distracted. Some sprints may be user and customer focused; other milestones may center around building technology foundations or paying off technical debt. For frequently urgent or distracting matters, resolve the root cause so primary focus can return to what is truly important.
4. Care about Customers. Customers and the organizations we serve give us a purpose and are the reason we are compensated for what we do. We must listen to users, show empathy, understand their requirements, especially those expressed and obvious, but also surface those in which intent is uncertain and less well known. Once we understand, then we also need to be understood through careful communication about our designs and projects in language and symbols that are precise, mostly visual, and jargon free.
5. Collaborate with Others. The concept of the lone coder as a hero is mostly a myth. Big, important problems in most organizations require collaboration amongst different stakeholders and a win-win mentality rooted in the common values and practices of respect, humility, integrity, change, articulated decision rights and incentives.
6. Keep Things as Simple as Possible. Systems and People (and Life) can be complicated, but it does not have to be. By emphasizing core values over rigid rules, we can allow important systems and relationships to remain strong, flexible, and still aligned around what is important.