Difference between revisions of "HowTo:Design a Customizing"
m |
|||
(12 intermediate revisions by the same user not shown) | |||
Line 8: | Line 8: | ||
As a prerequisite for the rest of this article, please consider the following guide: | As a prerequisite for the rest of this article, please consider the following guide: | ||
[[HowTo:Organize_UBIK_Development]] | [[HowTo:Organize_UBIK_Development]] | ||
+ | |||
+ | The above article describes how to manage your project organizationally, but only implicitly covers how to deliver a solution to your problem. | ||
+ | Assuming you have set up issue tracking, source code management and documentation, the following steps are recommended. | ||
+ | |||
+ | === For the start of a project === | ||
+ | # Collect the requirements from the customer | ||
+ | # Negotiate a functional specification with the customer, to define the scope of the project | ||
+ | # Design the top-level architecture | ||
+ | # Use the top-down approach to create a Project Structure Plan consisting of Epics, Features and User Stories | ||
+ | # Make an effort estimation based on the Project Structure Plan to negotiate a budget with the customer | ||
+ | |||
+ | === For a topic throughout the project === | ||
+ | # Collect the requirements for that topic from the customer or project leader | ||
+ | # Create a functional design | ||
+ | # Create a technical design | ||
+ | ## For the choice of appropriate {{UBIK}} tools and features, search the Wiki as described in the respective section | ||
+ | ## Plan the architecture of your solution | ||
+ | ## Design a data model | ||
+ | ## Design the algorithm | ||
+ | # Perform the implementation | ||
+ | # Perform the QA including manual testing, automatic testing and reviews | ||
+ | # Update documentation | ||
+ | |||
+ | Make sure to maintain the Project Structure Plan for non-trivial tasks. In the rest of this article, best practices for the individual steps are described. | ||
+ | |||
+ | = Functional design = | ||
+ | |||
+ | Based on the requirements collected by the customer, we can create a Functional Design (FD). Such a description suggests what a solution should look and behave like. FDs are of paramount importance in a project, because they nail down the scope of a use-case or task. Functional specifications are great to negotiate specific goals with the customer, allowing us to design a technical solution and to estimate the effort. Optimally, an FD contains: | ||
+ | * A description of the use-case | ||
+ | * Mock-ups of the UI (if any) | ||
+ | * A diagram of the workflow (without technical details) | ||
+ | |||
+ | Often, tricky questions are encountered when making a Functional Design. This means we're doing it right, because without an FD, the same questions would appear during implementation, when it's too late. Better to resolve these questions with the customer or the project leader before we start working on the issue, allowing us to adjust our estimate in time. | ||
+ | |||
+ | = Technical design = | ||
+ | |||
+ | Based on the FD, a Technical Design (TD) can be created. Such a concept elaborates on how to provide a suggested functional solution, technically. TDs can greatly reduce the time spent on an implementation, because it allows us to avoid spending the time going down a wrong path by looking ahead, speaking metaphorically. It should address several aspects: | ||
+ | * Architecture | ||
+ | * Data model | ||
+ | * Algorithm | ||
+ | These aspects are described in greater detail in the following chapters. | ||
= Architecture = | = Architecture = | ||
The architecture is something to consider on a rather abstract level, in the beginning of a project, but also on the level of a single task. | The architecture is something to consider on a rather abstract level, in the beginning of a project, but also on the level of a single task. | ||
− | In the context of a whole project, architecture means defining whether there are multiple {{UBIK}} installations on different sites, what products will be involved and how they are connected topologically and semantically. | + | In the context of a whole project, architecture means defining whether there are multiple {{UBIK}} installations on different sites, what products and 3rd party systems will be involved and how they are connected topologically and semantically. On task level, the same is interesting, just in greater detail and smaller scope, like zooming in on it. |
− | On task level, architecture | + | |
+ | === Topology === | ||
+ | In this context, topology (the science of spatial relations) addresses the technical architecture. Questions: | ||
+ | * What top-level modules do exist where? | ||
+ | ** in the network | ||
+ | ** in the customizing | ||
+ | * What interfaces do exist between them? | ||
+ | ** using which protocol | ||
+ | ** covering what data | ||
+ | |||
+ | === Semantics === | ||
+ | Semantics (the science of meaning) in this context addresses the functional architecture: which task-level modules are taking care of what responsibility, and how they play together. Questions: | ||
+ | * What is the purpose of a module? | ||
+ | * What information is exchanged via an interface, what does it do for the use-case? | ||
− | We recommend the architecture to satisfy the following restrictions | + | === Restrictions === |
+ | We recommend the architecture to satisfy the following restrictions. | ||
− | === Top-Level architecture === | + | ==== Top-Level architecture ==== |
* Network-distances between the database server and the application server (e.g., web services) should be minimal for performance reasons. | * Network-distances between the database server and the application server (e.g., web services) should be minimal for performance reasons. | ||
* One should always plan for a staging strategy with multiple environments for QA. | * One should always plan for a staging strategy with multiple environments for QA. | ||
− | === Task-level architecture === | + | ==== Task-level architecture ==== |
* Custom code should always be developed in a plugin where possible, with the {{UBIK}} custom code just connecting the plugin code with the {{UBIK}} objects. | * Custom code should always be developed in a plugin where possible, with the {{UBIK}} custom code just connecting the plugin code with the {{UBIK}} objects. | ||
* Custom code should be arranged so heavy-duty processes (involving much data and complex calculations) are performed on powerful machines (and not on the mobile client). | * Custom code should be arranged so heavy-duty processes (involving much data and complex calculations) are performed on powerful machines (and not on the mobile client). | ||
Line 34: | Line 89: | ||
Properties with different data types can be modeled for every entity, and one such MetaClass can inherit the properties from another (e.g., there could be a MetaClass "SAFETY_INSTRUCTIONS" inheriting the "Filepath" property from a "DOCUMENT" MetaClass). | Properties with different data types can be modeled for every entity, and one such MetaClass can inherit the properties from another (e.g., there could be a MetaClass "SAFETY_INSTRUCTIONS" inheriting the "Filepath" property from a "DOCUMENT" MetaClass). | ||
An important aspect in data modelling, especially for the representation in relational databases, is [https://en.wikipedia.org/wiki/Database_normalization normalization]. | An important aspect in data modelling, especially for the representation in relational databases, is [https://en.wikipedia.org/wiki/Database_normalization normalization]. | ||
+ | See also: | ||
+ | * [[Design_object-oriented_data_models]] | ||
+ | * [[Entity_Data_Model]] | ||
=== Basic data model === | === Basic data model === | ||
Line 80: | Line 138: | ||
=== Performance === | === Performance === | ||
+ | * Minimize the amount of relatively slow operations, like network operations, and filesystem or database access. Perform a few batch operations instead of many individual, small ones. | ||
+ | * Avoid nested loops, because they multiply the amount of processing steps required. | ||
* Apply caching to reuse previously processed data and to avoid doing the same thing more than once, but clean up your cache if it becomes invalid. | * Apply caching to reuse previously processed data and to avoid doing the same thing more than once, but clean up your cache if it becomes invalid. | ||
− | Avoiding crashes | + | |
+ | === Avoiding crashes === | ||
* Check every variable for being null before you use it. | * Check every variable for being null before you use it. | ||
+ | * Think about the possible use-cases your code might encounter (e.g., extreme cases of parameters), and test these scenarios. | ||
+ | * For debugging, perform log outputs for unintended outcomes, providing runtime information you cannot inspect otherwise. | ||
=== Well-formed code === | === Well-formed code === | ||
Line 90: | Line 153: | ||
= {{UBIK}} Features = | = {{UBIK}} Features = | ||
− | We are working on improving the Wiki documentation for {{UBIK}} features, to provide a better understanding of what to achieve with which existing feature. One way to find the best feature for your task (and how to use it) is to prompt | + | We are working on improving the Wiki documentation for {{UBIK}} features, to provide a better understanding of what to achieve with which existing feature. One way to find the best feature for your task (and how to use it) is to prompt an AI chatbot like [https://chat.openai.com/ ChatGPT], which will search our Wiki for you. You could start with a prompt of the form: "Search the UBIK Wiki for information on <what you want>." Try to use different formulations if necessary. If the information cannot be found on the Wiki, please don't hesitate to open a support ticket on the [https://support.augmensys.net/ Augmensys support portal]. |
= Mobile = | = Mobile = | ||
− | |||
For mobile features, it is important to consider some basic principles the client works by. | For mobile features, it is important to consider some basic principles the client works by. | ||
Line 105: | Line 167: | ||
* There is a central Themes XAML file for adjustments that can be reused in multiple areas. | * There is a central Themes XAML file for adjustments that can be reused in multiple areas. | ||
* You can use the [[Developer_Mode]] to find out which XAML file to adapt for a certain area in the UI. | * You can use the [[Developer_Mode]] to find out which XAML file to adapt for a certain area in the UI. | ||
+ | See also: | ||
+ | * [[XAML]] | ||
+ | * [[Xamarin_XAML]] | ||
+ | * [[XAML_Basics]] | ||
+ | * [[XAML_Best_practices]] | ||
=== Connectivity === | === Connectivity === |
Latest revision as of 08:51, 14 August 2023
Customizing UBIK® is a complex endeavor. In this article, we aim to provide a guide and best practices making this task as straight-forward as possible.