This document discusses developing enterprise-ready software. It outlines three contexts that software needs to commit to: fulfilling provider responsibilities through foundational standards, meeting client expectations to facilitate the enterprise's function and growth, and providing engaging user experiences with a "wow factor". It details five pillars for provider responsibilities (secure, scalable, portable, transferable, maintainable) and five pillars for client expectations (functional, global, extensible, adaptable, powerful). It provides examples from AppointmentPlus of evolving their software from 2010 to 2018 to better meet these contexts and pillars.
2. ABOUT ME
• Director of Software Engineering at AppointmentPlus
• Team of 25+ in US and India
• SaaS using LAMP, Laravel, Angular, React, Vue
• Mobile apps in iOS and Android
• MS Office apps in C# .Net
• Previous roles
• Software Development Manager at AppointmentPlus
• Lead Software Developer at AppointmentPlus
• Senior Application Systems Analyst at University of Arizona College of Medicine
• Workstation Specialist at Saint Xavier University
• Helpdesk Intern
• Freelance/Self-Employed Multimedia Designer
3. REAL WORLD
ENTERPRISE SOFTWARE
• Developing beyond boot camp
• Enterprise software?
• Providing mission critical function for an organization
• Serving the business needs of “large” organizations
• Serving the consumer needs of an organization’s customers
• B2B2C
• High level rubric/framework for guiding development practices
4. REAL WORLD
ENTERPRISE SOFTWARE
• Focused heavily on loosely coupled relationships
• between the application and its underlying infrastructure (code vs server)
• between the layers of the application (data, logic, presentation)
• between the components within each layer (i.e. notifications vs reporting)
• between the application its required human interaction (releases, resilience)
5. THE THREE CONTEXTS
• Commitment to fulfilling provider responsibilities
• Foundational standards
• The baseline expectations
• Consistent regardless of implementation
• Commitment to meeting client expectations
• Facilitating the function of the enterprise
• Empowering the growth of the enterprise
• Commitment to providing engaging user experiences
• The “wow factor”
• Pushing the enterprise towards innovation
8. SECURE
Certain to remain or continue to be not subject to threat; protected against attack or
other criminal activity.
• Security is the foremost responsibility of the software provider
• Security starts with the developer’s physical and virtual environments
• Security is not a milestone, it’s a continuous theme and an ongoing activity
9. SCALABLE
Capable of being easily expanded or upgraded on demand; able to be used or
produced in a range of capabilities
• Scalability refers to both the technology and the real-world implementation
• Design and develop to handle ebbs and flows in usage
• Consider the client’s current state and future needs
10. PORTABLE
Easily moves between environments and technologies on demand, with little to no
hard dependencies
• Develop in independent and interchangeable layers
• Strive to be loosely coupled to the environments and architectures in which the
application is deployed
• Allow discrete components/services to move without detriment to the application
11. TRANSFERABLE
Able to be transferred or made over to the possession of another
• Transferability applies to development and post-development hand offs
• Write code for the next developer
• Plan to have more than one SME for each component or feature
• Provide thorough documentation when handing off to a teammate, the client, a
tester, a contractor, etc
12. MAINTAINABLE
Exists in continuance with low cost of ownership; able to be upgraded as needed
• Capture, manage, and eliminate technical debt
• Monitor updates to dependencies
• Plan for frequent, smaller refactors and avoid lengthy, risky rewrites
• Write code that is clean, concise, and well documented
14. FUNCTIONAL
Capable of serving the purpose for which it was designed
• Be consultative and partner with the client to understand and achieve the purpose
• Allow the user to seamlessly perform intended functions as expected
• Do not tolerate defects of any level of criticality in the product’s core competency
15. GLOBAL
Thinking holistically in terms of the entire world
• Evaluate every aspect of the application in terms of global availability
• Almost all other aspects are all impacted by locale
16. EXTENSIBLE
Designed with the ability to expand or add on to its capabilities; implementation
takes future growth into consideration
• Design your application to play well with others
• Build in hooks, listeners, messaging, callouts, etc to enable customization and
integration
• Avoid rigid implementations that stifle innovation
17. ADAPTABLE
Able to adjust readily to different conditions; able to be modified for a new use or
purpose
• Pertains to the scalability of the application’s real world functionality
• Design to be flexible and configurable to fulfill core functions in a variety of use
cases
• As the client’s operating environment evolves, so does its use of the application
18. POWERFUL
Giving control and influence over people and events; having a strong effect
• Give the user a sense of command and control over the problem it is designed to
solve
• Provide a complete solution, addressing all aspects of the core competency
• The user should feel confident in the ability of the application
20. RESPONSIVE
Appropriately reacting to change quickly and in a desired or positive way
• Responsiveness goes beyond adapting the presentation on varying types and sizes
of devices
• Your application will need to adapt to changes in consumers’ expectations in terms
of advancing technology
21. ACCESSIBLE
Easy for anyone within the target audience to obtain and use
• Understand the demographics of the user base and/or target audience
• Consider cognitive and physical ability to provide ease of use
• Consider global accessibility standards
22. INNOVATIVE
Introducing new ideas; original and creative in thinking
• Strive to provide the end user with a powerful, forward-thinking experience
• Leverage advances in technology to push the boundaries of functionality
24. APPOINTMENTPLUS 2010
• Single server “stacks”
• Serving multiple purposes
• Multiple non synched instances
• Different code versions
• Different platform versions
• Arbitrary load assignment
• No tuning/scaling
• Manual build and deploy
25. APPOINTMENTPLUS 2018
• Separate load balanced web servers,
based on function
• Separate APIs and services based on
function
• Secure internal tools
• Offload reporting engine
• Central business logic API serves
multiple interfaces
• Each component tuned and scaled
based on function
• Automated deployment
We will discuss:
What is the definition of enterprise software
In what contexts does enterprise software exist and operate
Key aspects (aka “pillars”) that make up enterprise software development best practices
Have extensive experience working directly with small to enterprise clients, small to enterprise sales teams, support teams, marketing teams, executive leadership, and of course engineers
Taken what I’ve gleaned from these experiences to develop the concepts
Presented to relevant stakeholders within the business to get buy in
- All agree that this is what enterprise clients want
Use as a guideline for our own engineers to help guide code reviews, 1:1, etc
Topics that I expect interviewees to be able speak about and demonstrate
Chances are you will work on an application that will serve an enterprise
The technology gap between SMB and Enterprise is closing rapidly as providers find ways to make their platforms more available
The expectations of SMB continue to grow
Tendency to write less code that does more
Should focus on singularity
Design loosely coupled components
Think in terms of OOP and SOA
Does not dictate implementation or platform specific details
Loosely coupled relationships is overarching theme
The solution will be nimble, able to adapt to changes in the environment with limited manual human intervention.
It will adjust to meet the demands of its usage.
These three contexts are the make up the B2B2C “social contract”
Not exhaustive, but desire is to be relevant to the entire stack
List may grow over time, as the “standard” gains adoption
How am I protecting the IP on my machine/environments?
How am I securing my hardware?
How am I securing the application access?
How am I securing the user’s private information?
During collection
At rest
In transit
Data expiry
How am I securing the environments?
Maintaining dependencies
etc
How would I design and write this differently if it grew 10x, 100x, or 1000x the expected usage?
Will the design/feature set still be viable at higher volumes?
How do I reduce waste and increase efficiency?
3 tier architecture
Data layer
Logic layer/api
Interface layer
What if any layer of your application needed to change?
Data layer
Infrastructure/network
APIs/external services
AP File upload example
As demand and usage of the application changes, and as technology advances, there may be a need to deploy the application to an environment that utilizes different technologies
Writing code for the next person
Have a low “bus factor”, i.e. your code should outlive you
Siloed development kills the future of projects
Don’t leave @todos undone!
No level of performance, security, presentation etc. will matter to the client if their end users perceive that they are not able to execute the basic functionality
Understand requirements and deliver
Technology "shrinks" the globe; less virtual distance between us
What if you needed to translate your application into more languages later?
How does the physical environment impact your application, e.g. rural areas with slower connections?
Mention EU GDPR
Be a cog in the bigger machine, a spoke on the wheel, etc
Enterprises need the ability to send information to/from other systems at any point in the process
Offering external APIs, relevant third-party integrations, and other such customizations are examples of effective extensibility
Bridgestone examples of growth into Mobile tire repair, partner network
Tesla using for test drives, build consultations, service appointments, etc
Stay within the confines of the functional purpose, but allow for broader adoption
AP handles full scope of appointment process from request to followup
Beware of scope creep, doing more irrelevant things doesn’t make it more powerful!
Single page parallax scrolling vs blinking text and gifs
Remember web 2.0?
Not going to build a command line app for a toddler
Example of building a scheduling system for warehouses
Costco example of French language and AODA requirements
Doing the previous 12 things removes barriers to innovation
Line 3: not PORTABLE, MAINTAINABLE; cant move without dependency, no documentation of dependency
Line 7: not TRANSFERABLE; no docs, unclear variable names
Line 8-14: not SECURE, PORTABLE, MAINTAINABLE; assumes availability w/o error handling
Line 18: not PORTABLE, SCALABLE;
Line 22-28: not EVERYTHING; too many unrelated functions in a single entity, no limit of scope, may break tight dependencies on change
Line 30: not TRANSFERABLE; no docs, unclear variable names
Line 31: not PORTABLE, MAINTAINABLE; cant move without dependency, no documentation of dependency
Line 32,41: not SCALABLE, wasting resources by reinstantiating
Line 41: not GLOBAL, doesn’t properly handle DST
Not exhaustive, but desire is to be relevant to the entire stack
List may grow over time, as the “standard” gains adoption