diff --git a/radar/2017-03-01/akeneo.md b/radar/2017-03-01/akeneo.md index 3f13b1c..6f143f2 100644 --- a/radar/2017-03-01/akeneo.md +++ b/radar/2017-03-01/akeneo.md @@ -2,7 +2,6 @@ title: "Akeneo" ring: assess quadrant: tools - --- Akeneo is a Product Information Management system (also known as PIM, PCM or Product MDM) and helps centralize and harmonize all the technical and marketing information of products. @@ -10,9 +9,9 @@ Akeneo is a Product Information Management system (also known as PIM, PCM or Pro We use Akeneo with success in our projects and products (For example in OM3), where it is responsible for: - Keeping product data separate from other applications - such as E-Commerce systems -- Managing livecycles of products and managing product portfolios with their category structures +- Managing lifecycles of products and managing product portfolios with their category structures - Managing attributes and families and therefore acting as attribute master for the suite -The system has a modern and friendly user interface and product managers find things such as completenesscheck, translation views and mass editing very helpful. +The system has a modern and friendly user interface and product managers find things such as completeness check, translation views and mass editing very helpful. -With delta export and import capabilities and the usage of Mongo DB as persitence backend, the performance is acceptable. We miss a richer API - but the system is extendable and based on PHP/Symfony 2. +With delta export and import capabilities and the usage of Mongo DB as persistence backend, the performance is acceptable. We miss a richer API - but the system is extendable and based on PHP/Symfony 2. diff --git a/radar/2017-03-01/akka.md b/radar/2017-03-01/akka.md index dd83dcd..a2e087d 100644 --- a/radar/2017-03-01/akka.md +++ b/radar/2017-03-01/akka.md @@ -2,11 +2,11 @@ title: "Akka" ring: trial quadrant: languages-and-frameworks - --- -With the growing adoption of microservice-based architecures, the interest in frameworks and tools that make building systems that follow the reactive manifesto possible has increased. + +With the growing adoption of microservice-based architectures, the interest in frameworks and tools that make building systems that follow the reactive manifesto possible has increased. Akka provides you a toolkit and runtime based on the Actor model known from Erlang to reach this goal. -It's one of the most-adopted toolkits in its space with its key contributors beeing heavily involved in the overall movement of the reactive community as well. +It's one of the most-adopted toolkits in its space with its key contributors being heavily involved in the overall movement of the reactive community as well. At AOE, we use Akka when we need high-performance, efficient data processing or where its finite state machine plays nicely with the domain of the application. It is worth mentioning that the actor model might come with extra complexity and therefore should be used in problem spaces where the advantages of this approach bring enough value and no accidental complexity. diff --git a/radar/2017-03-01/angular.md b/radar/2017-03-01/angular.md index 2cd95a7..5e70db4 100644 --- a/radar/2017-03-01/angular.md +++ b/radar/2017-03-01/angular.md @@ -2,7 +2,6 @@ title: "Angular" ring: assess quadrant: languages-and-frameworks - --- The latest version of the Angular Framework, which is used for large single-page applications. diff --git a/radar/2017-03-01/ant.md b/radar/2017-03-01/ant.md index fd983f6..610c381 100644 --- a/radar/2017-03-01/ant.md +++ b/radar/2017-03-01/ant.md @@ -2,8 +2,8 @@ title: "Ant" ring: hold quadrant: tools - --- + Apache Ant was build in 1997 to have something like Make in the C/C++ world for Java. Ant uses xml files to describe steps required to produce executable artifacts from source code. The main concepts of tasks and targets are programmable in an imperative style. Apache Ant was and is widely used by large software projects. Our recommendation is to stop using Apache Ant for new projects. If you are free to choose, we recommend Gradle as an Apache Ant replacement. diff --git a/radar/2017-03-01/anypoint-platform.md b/radar/2017-03-01/anypoint-platform.md index 9a3dda0..5ab3994 100644 --- a/radar/2017-03-01/anypoint-platform.md +++ b/radar/2017-03-01/anypoint-platform.md @@ -2,12 +2,12 @@ title: "Anypoint platform" ring: trial quadrant: tools - --- -Anypoint platform (formally known as Mule or Mule ESB) is an Enterprise Integration Platform written in Java. -Anypoint provide tools to use Enterprise Integration Patterns (EAI) and has a high number of ready-to-use connectors to communicate with software tools such as SAP, Salesforce, etc. +Anypoint platform (formerly known as Mule or Mule ESB) is an Enterprise Integration Platform written in Java. -Anypoint Community Version is Open Source and contribution is possible. The platform is pluggable with own connectors. Mulesoft is also driving the [raml](/tools/raml.html) specification and related Open Source tools. +Anypoint provides tools to use Enterprise Integration Patterns (EAI) and has a high number of ready-to-use connectors to communicate with software tools such as SAP, Salesforce, etc. -AOE is a Mulesoft Partner and we use both the Community and Enterprise Versions of Anypoint. We use Anypoint as an API Gateway to combine and transform data from multiple backends. We use it as ESB or Integration platform for loose coupling of software components. And we also use it as legacy modernization to provide modern APIs for legacy- or foreign software. +Anypoint Community Version is Open Source and contribution is possible. The platform is pluggable with own connectors. Mulesoft is also driving the [RAML](/tools/raml.html) specification and related Open Source tools. + +AOE is a Mulesoft Partner and we use both the Community and Enterprise Versions of Anypoint. We use Anypoint as an API Gateway to combine and transform data from multiple backends. We use it as ESB or Integration platform for loose coupling of software components. We also use it as legacy modernization to provide modern APIs for legacy or external software. diff --git a/radar/2017-03-01/api-first-design-approach.md b/radar/2017-03-01/api-first-design-approach.md index e8fe534..a259156 100644 --- a/radar/2017-03-01/api-first-design-approach.md +++ b/radar/2017-03-01/api-first-design-approach.md @@ -2,7 +2,6 @@ title: "API-First Design Approach" ring: trial quadrant: methods-and-patterns - --- The API-First Design Approach puts the API design at the beginning of the implementation without any constraints, for example, from the current IT infrastructure or the implementation itself. The idea is to design the API in a way that it serves its purpose best and the consumers are enabled to work efficiently. diff --git a/radar/2017-03-01/artifactory.md b/radar/2017-03-01/artifactory.md index abaa451..1af0abf 100644 --- a/radar/2017-03-01/artifactory.md +++ b/radar/2017-03-01/artifactory.md @@ -2,9 +2,9 @@ title: "Artifactory" ring: trial quadrant: platforms-and-aoe-services - --- -JFrog [Artifactory ](https://www.jfrog.com/open-source/)is a software tool, which, in the end, manages and stores (binary) artifacts. + +JFrog [Artifactory](https://www.jfrog.com/open-source/)is a software tool, which, in the end, manages and stores (binary) artifacts. In addition to storage, it provides a managing interface, which also allows to store build information, properties as well as dependencies per artifact which are organized within repositories. A fine grained security system enables easy management of which artifacts are available to whom. The artifacts are exposed via an HTTP(S)-Url Artifactory, which can generate package-manager compatible manifests for the repositories. AOE utilizes Artifactory to serve Maven, Apt, Npm, Composer and Docker Repositories. @@ -15,6 +15,6 @@ Artifactory provides a powerful REST-API for managing Artifacts including a powe Artifactory at AOE currently comes with some problems, too: * Cleanup in Artifactory has to be done manually. Therefore, if every build is pushed to Artifactory it currently pollutes disk space since old or unused versions are never removed. -* The Composer Integration mirroring github proves to be slower than directly connecting to github. +* The Composer Integration mirroring GitHub proves to be slower than directly connecting to GitHub. AOE is using the Professional version for a central instance that can be used by different teams. We encourage teams to use Artifactory instead of Jenkins to store and manage build artifacts - and to take care of cleaning up old artifacts automatically. diff --git a/radar/2017-03-01/aws-lambda.md b/radar/2017-03-01/aws-lambda.md index 0a7fbd8..b177689 100644 --- a/radar/2017-03-01/aws-lambda.md +++ b/radar/2017-03-01/aws-lambda.md @@ -2,8 +2,8 @@ title: "AWS Lambda" ring: trial quadrant: platforms-and-aoe-services - --- + AWS Lambda is one of the exciting new "cloud-native" / serverless ways to run code without worrying about infrastructure. While it is possible to directly respond to web requests using the API Gateway, our teams are currently using AWS Lambda mostly for tasks outside the critical path. As a custom resource for CloudFormation, it allows us to manage all aspects of a deployment in an elegant way by simply deploying a new CloudFormation stack. Baking AMIs and doing green/blue switches are only two of the many use cases where AWS Lambda comes in very handy. -In addition to deployment automation, we're using AWS Lambda to process incoming data. Being able to respond to events from various sources such as S3 Buckets, SNS topics, Kinesis streams and HTTP endpoints it's a perfect match to process, transform and forward incoming data in near-realtime at a fraction of the cost of running an ESB. +In addition to deployment automation, we're using AWS Lambda to process incoming data. Being able to respond to events from various sources such as S3 Buckets, SNS topics, Kinesis streams and HTTP endpoints it's a perfect match to process, transform and forward incoming data almost in real time at a fraction of the cost of running an ESB. diff --git a/radar/2017-03-01/babel.md b/radar/2017-03-01/babel.md index a730175..67b2b2f 100644 --- a/radar/2017-03-01/babel.md +++ b/radar/2017-03-01/babel.md @@ -2,7 +2,6 @@ title: "Babel" ring: trial quadrant: languages-and-frameworks - --- [Babel](https://babeljs.io/) gives you the possibility to use the latest features from JavaScript ([ECMAScript](https://en.wikipedia.org/wiki/ECMAScript)) in the browser of your choice. diff --git a/radar/2017-03-01/bower.md b/radar/2017-03-01/bower.md index cad8243..d401cd8 100644 --- a/radar/2017-03-01/bower.md +++ b/radar/2017-03-01/bower.md @@ -2,11 +2,10 @@ title: "Bower" ring: hold quadrant: tools - --- [Bower](https://bower.io/) is a package manager for frontend resources such as JavaScript libraries and CSS frameworks. Compared to [npm](https://www.npmjs.com/), it has a somewhat different approach to loading and resolving the packages, resulting in a smaller and cleaner folder structure. -In small web projects, this approach is good and sufficient, but larger projects will need more dependencies such as task runners or testing frameworks, which are not available through Bower. As most of the frontend libraries are also available through npm, it's not suprising that we ask ourselves why Bower is still needed. +In small web projects, this approach is good and sufficient, but larger projects will need more dependencies such as task runners or testing frameworks, which are not available through Bower. As most of the frontend libraries are also available through npm, it's not surprising that we ask ourselves why Bower is still needed. At AOE, we decided to use npm as the only package manager to avoid having multiple tools doing similar things. Developers only need to deal with one solution, which makes the project easier to maintain. diff --git a/radar/2017-03-01/client-side-error-logging.md b/radar/2017-03-01/client-side-error-logging.md index e7b0b11..a670c65 100644 --- a/radar/2017-03-01/client-side-error-logging.md +++ b/radar/2017-03-01/client-side-error-logging.md @@ -2,11 +2,10 @@ title: "Client-side error logging" ring: trial quadrant: methods-and-patterns - --- More and more business logic is done client-side with various web and app technologies. How do we know if everything works in production? We can easily track backend exceptions in the server logs, but what about client-side errors in the user's browser or mobile app? With client-side error logging, we send errors to a central server to see instantly what is going wrong. With this method errors can be found and resolved quickly before they affect even more users. -At AOE, we use the Open Source solution [Sentry](https://sentry.io/welcome/).io. It can handle multiple projects and teams and integrates well with other services such as Mattemost/Slack and Issue Tracking Systems. +At AOE, we use the Open Source solution [Sentry](https://sentry.io/welcome/).io. It can handle multiple projects and teams and integrates well with other services such as Mattermost/Slack and Issue Tracking Systems. diff --git a/radar/2017-03-01/consul.md b/radar/2017-03-01/consul.md index 7f20201..b2c5758 100644 --- a/radar/2017-03-01/consul.md +++ b/radar/2017-03-01/consul.md @@ -2,10 +2,10 @@ title: "Consul" ring: assess quadrant: tools - --- + Consul is a lightweight service to provide a service discovery registry with failure detection (health checks) for circuit breakers. It also provides configuration management with key/value storage.\ -The typical way to use it is that a consul master cluster takes care of the update and write processes and consul clients run locally on the apps host - data is shared accross the complete Consul cluster. The data can be accessed by using DNS and HTTP APIs. +The typical way to use it is that a consul master cluster takes care of the update and write processes and consul clients run locally on the apps host - data is shared across the complete Consul cluster. The data can be accessed by using DNS and HTTP APIs. At AOE, we use Consul for settings distribution with consul-template as a way to do [Settings Injection](/methods-and-patterns/settings-injection.html) during deployment. Consul is also used as service discovery between apps inside [microservice](/methods-and-patterns/microservices.html) environments. diff --git a/radar/2017-03-01/container-based-builds.md b/radar/2017-03-01/container-based-builds.md index 067f721..bbc4547 100644 --- a/radar/2017-03-01/container-based-builds.md +++ b/radar/2017-03-01/container-based-builds.md @@ -2,11 +2,10 @@ title: "Container-based builds" ring: assess quadrant: methods-and-patterns - --- Running your builds in isolated containers keeps your build servers clean. It allows you to even run them with multiple versions of a framework or programming language. You don't need additional machines like you would for running builds with PHP5 or PHP7 at the same time or running some legacy builds. -Note that you need to think about some kind of caching mechanism for your depenendies to avoid downloading them in every build, which would cause long build times. +Note that you need to think about some kind of caching mechanism for your dependencies to avoid downloading them in every build, which would cause long build times. -At AOE, we are currently starting to use this approach for building services and it is especially useful if your build has special dependencies. Also, it's possible to use GitLab as a build tool or use Docker with the new Jenkinspipeline. For caching we are evaluating minio as a cache server. We noticed that our builds run quite rapidly and reliably with that. Also, the complexity of the builds decreased since we don't need any workarounds, which were caused by having everything installed on one build server. +At AOE, we are currently starting to use this approach for building services and it is especially useful if your build has special dependencies. Also, it's possible to use GitLab as a build tool or use Docker with the new Jenkins pipeline. For caching we are evaluating minio as a cache server. We noticed that our builds run quite rapidly and reliably with that. Also, the complexity of the builds decreased since we don't need any workarounds, which were caused by having everything installed on one build server. diff --git a/radar/2017-03-01/dagger.md b/radar/2017-03-01/dagger.md index 3d9e0f7..f489fa3 100644 --- a/radar/2017-03-01/dagger.md +++ b/radar/2017-03-01/dagger.md @@ -2,7 +2,6 @@ title: "Dagger" ring: adopt quadrant: tools - --- [Dagger](https://google.github.io/dagger/) is a fully static, compile-time [dependency injection](http://en.wikipedia.org/wiki/Dependency_injection) framework for both Java and Android. [Dagger](https://google.github.io/dagger/) doesn't use reflections at runtime, it saves resources. For us, it is a perfect match for Android development. diff --git a/radar/2017-03-01/datadog.md b/radar/2017-03-01/datadog.md index 9ea471e..1c1e2cd 100644 --- a/radar/2017-03-01/datadog.md +++ b/radar/2017-03-01/datadog.md @@ -2,7 +2,6 @@ title: "Datadog" ring: assess quadrant: platforms-and-aoe-services - --- After realizing that AWS CloudWatch isn't flexible enough, and running our own metrics aggregation, monitoring and altering isn't something we want to do ourselves, we decided to give Datadog a try. Datadog is very simple to set up and retrieves metrics from the AWS API (and many other integrations) and from an agent running on the EC2 instances. On top of that, it comes with many plugins for services such as Apache, NGINX and ElasticSearch, allowing us to track all important metrics without much effort. Creating dashboards, setting up alarms and integrating into other applications (such as ticket systems) is easy to do and works fine. diff --git a/radar/2017-03-01/decoupling-infrastructure-via-messaging.md b/radar/2017-03-01/decoupling-infrastructure-via-messaging.md index eb4f05e..a917c0e 100644 --- a/radar/2017-03-01/decoupling-infrastructure-via-messaging.md +++ b/radar/2017-03-01/decoupling-infrastructure-via-messaging.md @@ -2,8 +2,8 @@ title: "Decoupling Infrastructure via Messaging" ring: trial quadrant: methods-and-patterns - --- + In [Microservices](/methods-and-patterns/microservices.html) we have already covered the trend that modern architectures are moving away more and more from big monolithic applications to distributed software suites. The result of splitting our software and infrastructure in smaller parts, is the need to communicate with each other. This can be done by direct communication or by message-based asynchronouous communication. While synchronuous communication allows for more plannable "real-time" response times of the overall systems, asynchronouos communication increases the resilience and stability of the system significantly and allows one to use other integration and scaling patterns. However, it often comes with additional complexity. Most of the IaaS Cloud providers offer messaging services such as AWS SQS which provide the possibility to decouple our infrastructure via Messaging. Also, we use [RabbitMQ](/tools/rabbitmq.html) as a Messaging and Broker solution within our applications. The decision of using messaging and messaging patterns as an integration strategy can be made as part of [strategic design](/methods-and-patterns/strategic-domain-driven-design.html) considerations. diff --git a/radar/2017-03-01/devops-practices.md b/radar/2017-03-01/devops-practices.md index fc44692..a0efd1c 100644 --- a/radar/2017-03-01/devops-practices.md +++ b/radar/2017-03-01/devops-practices.md @@ -2,8 +2,8 @@ title: "Devops practices" ring: adopt quadrant: methods-and-patterns - --- + DevOps is a term that has been around for some years now. We understand DevOps as a philosophy and culture with related practices and tools - all with the aim of bringing (IT) Operations closer to Development. Jez Humble described the devops movement like this: "a cross-functional community of practice dedicated to the study of building, evolving and operating rapidly changing, secure, resilient systems at scale". @@ -12,16 +12,16 @@ With the size of software projects and the effects of agile development, the nee We have been using the following practices with success: -**Crossfunctional Teams "you build it, you run it"** +**Cross-functional Teams "you build it, you run it"** -In the past year, we have moved from a more centralistic or standanlone IT and operations service team to crossfunctional teams with Infrastructure experts working in and with the development team (admins joining the project team). +In the past year, we have moved from a more centralistic or standalone IT and operations service team to cross-functional teams with Infrastructure experts working in and with the development team (admins joining the project team). -And, we changed to crossfunctional teams and a "you build it, you run it" approach for the bigger projects. We have seen that this leads to the following positive effects: +And, we changed to cross-functional teams and a "you build it, you run it" approach for the bigger projects. We have seen that this leads to the following positive effects: * Software application architecture demands a certain infrastructure and the other way around. Having all the know-how in one team leads to more major decisions and implementations. Also, solving of root causes for problems works better. * Rotating operation and incident management inside the whole team brings everyone into closer contact with the day-to-day operation of their software. This results in a shared and improved responsibility and commitment to the complete platform in the team. In addition, this brings developers into contact with the customer - which is an important feedback loop as well. * Increased flexibility in the infrastructure: Implementations and adjustments in the infrastructure are faster and can be done together with the ongoing agile development of the platform. * Developers also explicitly think of operation issues when building the application - since they are responsible for operation. For example, logging concept, monitoring aspects and resilience patterns are now explicitly optimized continuously and improve faster. -Important enabler of such an approach is the size and available budget for the project (not every project allows for having a continuous crossfunctional teams that carries out ongoing development and operations). Also, this requires a certain amount of independence for the team. +Important enabler of such an approach is the size and available budget for the project (not every project allows for having a continuous cross-functional teams that carries out ongoing development and operations). Also, this requires a certain amount of independence for the team. As always, we are establishing "community of interests" to improve and promote the knowledge transfer between different teams. diff --git a/radar/2017-03-01/docker.md b/radar/2017-03-01/docker.md index e2ff47a..393722c 100644 --- a/radar/2017-03-01/docker.md +++ b/radar/2017-03-01/docker.md @@ -2,7 +2,6 @@ title: "Docker" ring: assess quadrant: platforms-and-aoe-services - --- Docker is currently the most-used solution for creating and managing container-based infrastructures and deployments. diff --git a/radar/2017-03-01/elasticsearch.md b/radar/2017-03-01/elasticsearch.md index 9c46abc..0e264ab 100644 --- a/radar/2017-03-01/elasticsearch.md +++ b/radar/2017-03-01/elasticsearch.md @@ -2,8 +2,8 @@ title: "Elasticsearch" ring: trial quadrant: platforms-and-aoe-services - --- + Elasticsearch is a REST-based search and analytics engine based on Lucene. Unlike its competitor Apache Solr, it was developed in the beginning with clustering and scaling in mind. It allows you to create complex queries while still delivering results very fast. At AOE, we use Elasticsearch for logging as well as our own search solution [Searchperience®](http://www.searchperience.com/). We recently moved the Searchperience stack from Solr to Elasticsearch and think this was the right decision. Especially in terms of scaling, ease of use and performance, Elasticsearch really shines. Also, the API design took some of the learnings from Apache SOLR into account - for example, the queryDSL is a powerful way of describing different search use cases with highly flexible support of aggregations, etc. \ No newline at end of file diff --git a/radar/2017-03-01/elk-stack.md b/radar/2017-03-01/elk-stack.md index bc86339..eef0e6c 100644 --- a/radar/2017-03-01/elk-stack.md +++ b/radar/2017-03-01/elk-stack.md @@ -2,7 +2,6 @@ title: "ELK Stack" ring: adopt quadrant: platforms-and-aoe-services - --- The company behind Elasticsearch offers a very nice solution for logging and analysis of distributed data such as logfiles. diff --git a/radar/2017-03-01/evil-user-stories.md b/radar/2017-03-01/evil-user-stories.md index b99db56..a4c0be8 100644 --- a/radar/2017-03-01/evil-user-stories.md +++ b/radar/2017-03-01/evil-user-stories.md @@ -2,8 +2,8 @@ title: "Evil User Stories" ring: assess quadrant: methods-and-patterns - --- + With Evil User Stories, we aim to raise the project teams' (PO, Dev-Team, QA) and clients' awareness for security topics and introduce a security-by-design principle. The first step is to identify business use cases of potential vulnerabilities in our software product. The next step is to write an Evil User Story for this use case, from the perspective of an evil persona, e.g. "John Badboy who wants to hack our software". The idea behind this is to take a look at specific parts (business logic) of the software from a perspective that would otherwise not be considered when working on standard user stories. diff --git a/radar/2017-03-01/explicit-test-strategy.md b/radar/2017-03-01/explicit-test-strategy.md index 8d9bfe9..888c4f7 100644 --- a/radar/2017-03-01/explicit-test-strategy.md +++ b/radar/2017-03-01/explicit-test-strategy.md @@ -2,8 +2,8 @@ title: "Explicit test strategy" ring: assess quadrant: methods-and-patterns - --- + According to the [ISTQB Glossar](https://glossary.istqb.org/)- a **Test Strategy** is an abstract specification that comprises the designated test levels (unit, integration, system and acceptance tests) and the implementation of each level for a whole organization or for an application. This test strategy can be applicable to one or more projects. At AOE, we established an explicit test strategy for many of our projects. The coordination of the test levels improves the effectivity of test runs and helps to avoid testing gaps, double inspection and overhead. Every test level has a different focus. Tests that are executed on one level don't have to be implemented on others. diff --git a/radar/2017-03-01/flow.md b/radar/2017-03-01/flow.md index f63480e..8683076 100644 --- a/radar/2017-03-01/flow.md +++ b/radar/2017-03-01/flow.md @@ -2,7 +2,6 @@ title: "Flow" ring: hold quadrant: languages-and-frameworks - --- [Flow](https://flow.neos.io/) is a PHP web application framework developed for the [Neos](https://www.neos.io/) project. diff --git a/radar/2017-03-01/galen.md b/radar/2017-03-01/galen.md index 0a25049..aa27992 100644 --- a/radar/2017-03-01/galen.md +++ b/radar/2017-03-01/galen.md @@ -2,7 +2,6 @@ title: "Galen" ring: assess quadrant: tools - --- With [Galen Framework](http://galenframework.com/), layout testing can be automated to save you a lot of manual work. With its own specification language (Galen Spec), you can write tests to verify the correct look of the web page as well as the location and alignment of specific elements on a page. diff --git a/radar/2017-03-01/gatling.md b/radar/2017-03-01/gatling.md index 1d9f0f0..7620f31 100644 --- a/radar/2017-03-01/gatling.md +++ b/radar/2017-03-01/gatling.md @@ -2,8 +2,8 @@ title: "Gatling" ring: trial quadrant: tools - --- + [Gatling](http://gatling.io/) is a highly capable load testing tool. It is designed for ease of use, maintainability and high performance. Out of the box, Gatling comes with excellent support of the HTTP protocol that makes it a tool of choice for load testing any HTTP server. As the core engine is actually protocol agnostic, it is perfectly possible to implement support for other protocols. For example, Gatling currently also ships [JMS support](http://gatling.io/docs/current/). diff --git a/radar/2017-03-01/go-lang.md b/radar/2017-03-01/go-lang.md index 004b2ff..14a2b72 100644 --- a/radar/2017-03-01/go-lang.md +++ b/radar/2017-03-01/go-lang.md @@ -2,7 +2,6 @@ title: "Go / Golang" ring: assess quadrant: languages-and-frameworks - --- 2016 was the year of Go, with a lot of Open Source projects gaining a lot of attention and many companies started to use it. @@ -13,6 +12,6 @@ Here at AOE, we use several services written in Go on a daily basis, such as Mat Go, as a programming language, has some very interesting features such as native support for concurrency (go routines), static compiled binaries with a very small memory footprint, cross compiling and much more. A big advantage of Go is the very flat learning curve, which allows developers from more dynamic languages such as PHP to be proficient in a very short time. -If you want to get a feeling for Go, you should start with the [online tour](https://tour.golang.org/welcome/1), within a day you'll have a good understanding of the core concepts, syntax, etc. - that is also because the language often tries to provide only one simple way of doing things; an example for this is that code formatting and styling is defined (yet not enforced as in Python). Part of this is also that Go itself is very opinionated: So, for example, for object oriented programming in Go, composition is the prefered way of defining data structures, and some might miss advanced concepts such as inheritance. +If you want to get a feeling for Go, you should start with the [online tour](https://tour.golang.org/welcome/1), within a day you'll have a good understanding of the core concepts, syntax, etc. - that is also because the language often tries to provide only one simple way of doing things; an example for this is that code formatting and styling is defined (yet not enforced as in Python). Part of this is also that Go itself is very opinionated: So, for example, for object oriented programming in Go, composition is the preferred way of defining data structures, and some might miss advanced concepts such as inheritance. We currently use Go for projects and microservices where we need flexibility and performance. diff --git a/radar/2017-03-01/gradle.md b/radar/2017-03-01/gradle.md index b33a90b..2adeec8 100644 --- a/radar/2017-03-01/gradle.md +++ b/radar/2017-03-01/gradle.md @@ -2,8 +2,8 @@ title: "Gradle" ring: adopt quadrant: tools - --- + Gradle is a build automation tool originating in the Java space, providing declarative dependency management (like Maven) and support for custom functionality (like Ant). It has superb multi-project support and is extremely extensible via third-party plugins and also via self-written extensions and plugins that make it outstanding in its area. It uses a Groovy-based DSL to declaratively model your problem domain (Build automation) and provides a rich object model with extension points to customize the build logic. Because it is extremely easy to extend this DSL, you can easily provide a declarative interface to your customizations and add-ons. diff --git a/radar/2017-03-01/groovy.md b/radar/2017-03-01/groovy.md index 6d3b059..15a48c9 100644 --- a/radar/2017-03-01/groovy.md +++ b/radar/2017-03-01/groovy.md @@ -2,7 +2,6 @@ title: "Groovy" ring: trial quadrant: languages-and-frameworks - --- Groovy is a dynamically typed compiled language running on the JVM. It is easy to learn as it provides a familiar syntax for Java programmers, but also offers advanced features such as closures and makes some mandatory Java syntax requirements optional to enhance the conciseness of the code. These features make Groovy especially well-suited for scripting and domain-specific languages. This is used by popular tools such as Gradle or Spock. diff --git a/radar/2017-03-01/grunt.md b/radar/2017-03-01/grunt.md index bcdf36a..94061c7 100644 --- a/radar/2017-03-01/grunt.md +++ b/radar/2017-03-01/grunt.md @@ -4,7 +4,6 @@ ring: hold quadrant: tools --- - Grunt is a JavaScript task runner that automates repetitive tasks. While Grunt served us well for a good amount of projects, other alternatives such as [Gulp](http://gulpjs.com/) emerged in the meantime and proved to be a better pick for the majority of our teams. @@ -19,7 +18,4 @@ always stores the result of one task as files on the disk. On large projects where a lot of automation is required, it can get very tedious to maintain complex and parallel running tasks. The grunt configuration files sometimes simply don´t gave us the flexibility that we needed. -Currently our preferred way to go is either simply use [NPM scripts](https://docs.npmjs.com/misc/scripts) or rely on [Webpack loaders](https://webpack.js.org/concepts/loaders/) for file preprocessing. For non-webpack projects we also utilize Gulp. - - - +Currently, our preferred way to go is either simply use [NPM scripts](https://docs.npmjs.com/misc/scripts) or rely on [Webpack loaders](https://webpack.js.org/concepts/loaders/) for file preprocessing. For non-webpack projects we also utilize Gulp. diff --git a/radar/2017-03-01/gulp.md b/radar/2017-03-01/gulp.md index 0acf898..a0e04fc 100644 --- a/radar/2017-03-01/gulp.md +++ b/radar/2017-03-01/gulp.md @@ -46,7 +46,7 @@ gulp.task('sass', function(){ ``` -you can now run this task simply by executing the following command in your terminal: +You can now run this task simply by executing the following command in your terminal: ```javascript gulp sass diff --git a/radar/2017-03-01/hal-hateoas.md b/radar/2017-03-01/hal-hateoas.md index ed784ec..4cc2d04 100644 --- a/radar/2017-03-01/hal-hateoas.md +++ b/radar/2017-03-01/hal-hateoas.md @@ -2,8 +2,8 @@ title: "HAL / HATEOAS" ring: assess quadrant: methods-and-patterns - --- + Hypermedia As The Engine Of Application State or in short HATEOAS is a pattern that helps to organize dependencies and resources in a RESTful API. The basic idea of HATEOAS is that an API consumer do not have to know how dependencies of resources are connected and how to get them. A consumer must only be familiar with the basics of hypermedia. Let's assume we have a bank account and an action to deposit money on that account. Everything you need to know is that the account resource has an action for a deposit. The URL of that action can then fetched from the link attribute with the corresponding relation. @@ -21,4 +21,4 @@ Besides from HATEOAS there is an alternative implementation called Hypertext App With HAL you are allowed to also define parametrized links, embedded resources and documentation relations (which are called curies). You can find the specification here. [http://stateless.co/hal_specification.html](http://stateless.co/hal_specification.html) -If you want to link different api endpoints or ressource locations in your API responses you should use this standard. \ No newline at end of file +If you want to link different api endpoints or resource locations in your API responses you should use this standard. \ No newline at end of file diff --git a/radar/2017-03-01/hystrix.md b/radar/2017-03-01/hystrix.md index 35ee3aa..c5a16f7 100644 --- a/radar/2017-03-01/hystrix.md +++ b/radar/2017-03-01/hystrix.md @@ -2,7 +2,6 @@ title: "Hystrix" ring: assess quadrant: tools - --- Hystrix is a very powerful library for handling failures, fallbacks and latency management within complex distributed environments. Netflix developed it and after years of experience, they are using it in almost each of their microservices. It evolved to a great library for handling resilience in complex architectures and covers solutions for the most common resilience patterns like: diff --git a/radar/2017-03-01/imgix.md b/radar/2017-03-01/imgix.md index 4ab5dd4..a19a45a 100644 --- a/radar/2017-03-01/imgix.md +++ b/radar/2017-03-01/imgix.md @@ -2,8 +2,8 @@ title: "imgix" ring: assess quadrant: platforms-and-aoe-services - --- + [Imgix](https://www.imgix.com/) is an SaaS solution for delivering and processing images. When developing responsive websites, you will quickly reach the point where you need various versions of your images to achieve a good responsive user interface. You want high quality versions for retina displays but small versions for mobile devices with a slow Internet connection. Especially when dealing with user-generated uploads, it is getting hard to create different versions for any supported device and breakpoint of your web page. Doing this manually is hardly an option. diff --git a/radar/2017-03-01/infrastructure-as-code.md b/radar/2017-03-01/infrastructure-as-code.md index b177e98..daaabe0 100644 --- a/radar/2017-03-01/infrastructure-as-code.md +++ b/radar/2017-03-01/infrastructure-as-code.md @@ -2,7 +2,6 @@ title: "Infrastructure as Code" ring: adopt quadrant: methods-and-patterns - --- Infrastructure as Code (IaC) describes the process of managing all infrastructure resources via code. Treating infrastructure code the same way we treat application code, we can benefit from the same advantages of having a history in our version control system, doing code reviews and rolling out updates via a Continuous Delivery pipeline in a way that closely approaches how we handle application deployments. diff --git a/radar/2017-03-01/jest.md b/radar/2017-03-01/jest.md index d8703a3..66174bf 100644 --- a/radar/2017-03-01/jest.md +++ b/radar/2017-03-01/jest.md @@ -2,8 +2,8 @@ title: "Jest " ring: assess quadrant: tools - --- + [Jest](https://facebook.github.io/jest/) is a javascript testing framework by facebook to test javascript code **and** react applications / components. We started using Jest (and [watchmen](https://github.com/facebook/watchman)) instead of Karma because it: diff --git a/radar/2017-03-01/job-dsl.md b/radar/2017-03-01/job-dsl.md index 65a931b..b50b73f 100644 --- a/radar/2017-03-01/job-dsl.md +++ b/radar/2017-03-01/job-dsl.md @@ -2,9 +2,9 @@ title: "Job DSL (Jenkins)" ring: trial quadrant: tools - --- -The [Job DSL ](https://wiki.jenkins-ci.org/display/JENKINS/Job+DSL+Plugin)is a plugin for the Jenkins automation server. Jenkins jobs that automate parts of a software project are usually configured using the web interface of Jenkins. If Jenkins is the choice for your project and the number of build jobs tend to grow, the Job DSL plugin is your friend. + +The [Job DSL](https://wiki.jenkins-ci.org/display/JENKINS/Job+DSL+Plugin)is a plugin for the Jenkins automation server. Jenkins jobs that automate parts of a software project are usually configured using the web interface of Jenkins. If Jenkins is the choice for your project and the number of build jobs tend to grow, the Job DSL plugin is your friend. The plugin allows Jenkins jobs to be described by code (Groovy DSL). This code is then used for generating Jenkins jobs. As a consequence, job configuration can be part of the project's source code. During the generation step, existing jobs are synchronized, overwritten or left alone, depending on the configuration. The same configuration manages deleting or ignoring jobs that are not described in code anymore. Jobs can easily be restored in case of data loss and changed without clicking buttons for hours. The automation also makes it easy to seed large numbers of homogeneous components and builds on different branches. diff --git a/radar/2017-03-01/keycloak.md b/radar/2017-03-01/keycloak.md index d7aa31d..12b56c3 100644 --- a/radar/2017-03-01/keycloak.md +++ b/radar/2017-03-01/keycloak.md @@ -2,13 +2,13 @@ title: "Keycloak" ring: trial quadrant: tools - --- + User management, authentication, authorization and Single Sign-On are part of most distributed systems nowadays. Building these sensitive and serious parts on your own might be a problem due to knowledge- and budget restrictions. Because of growing requirements in that field (social logins, single sign-on, federation, two-factor authentication, etc.), as well as growing security concerns, building these things on your own has become more challenging during the past decade. As a consequence, the recommendation is: use an existing solution and connect it with your project's codebase using provided standards. Our recommended solution is the Open Source project JBoss Keycloak. We use Keycloak in our OM3 suite for several authentication-related use cases - such as user management for system users and single sign-on for customers. The OAuth access tokens can be used to secure APIs that access sensitive information. -Keyloak is based on standards such as OAuth2, OIDC and SAML2. Securing a distributed system is supported by adapters, which are provided by the Keycloak developers for different technology stacks. If there is no adapter for your technology stack, an integration on protocol level with a library is simple. A lot of configurable features require no coding in the integrated projects. +Keycloak is based on standards such as OAuth2, OIDC and SAML2. Securing a distributed system is supported by adapters, which are provided by the Keycloak developers for different technology stacks. If there is no adapter for your technology stack, an integration on protocol level with a library is simple. A lot of configurable features require no coding in the integrated projects. By design, the Keycloak project offers customizability and extensibility via so-called SPIs, e.g. a custom authenticator can be implemented to address project specific problems. diff --git a/radar/2017-03-01/kubernetes.md b/radar/2017-03-01/kubernetes.md index 5507162..8245856 100644 --- a/radar/2017-03-01/kubernetes.md +++ b/radar/2017-03-01/kubernetes.md @@ -2,9 +2,8 @@ title: "Kubernetes" ring: assess quadrant: platforms-and-aoe-services - --- -Kubernetes is a container orchestration platform, which supports many different infrastructure providers. It allows you to deploy containers and takes care of running, scaling or self-healing your applications based on configurations you provide. It's based on years of knowledge and experience Google gained by using containers. +Kubernetes is a container orchestration platform, which supports many infrastructure providers. It allows you to deploy containers and takes care of running, scaling or self-healing your applications based on configurations you provide. It's based on years of knowledge and experience Google gained by using containers. At AOE, we started Kubernetes in a test environment on bare metal to experiment with it. It's currently used for running AOE internal apps such as dashboards as well as running builds in containers. We also started to use it for upcoming projects to run and manage several services. There are Tools to automate the setup of kubernetes in AWS like [Cops](https://kubernetes.io/docs/getting-started-guides/kops/). Another helpful tool is [Minikube](https://github.com/kubernetes/minikube), which allows to test and run kubernetes locally. diff --git a/radar/2017-03-01/maintain-third-party-packages.md b/radar/2017-03-01/maintain-third-party-packages.md index d57391d..8521e90 100644 --- a/radar/2017-03-01/maintain-third-party-packages.md +++ b/radar/2017-03-01/maintain-third-party-packages.md @@ -2,7 +2,6 @@ title: "Maintain third party packages" ring: hold quadrant: platforms-and-aoe-services - --- Rebuilding and packaging software from "third parties" (e.g. PHP, MySQL, Redis, Nginx, Java,...) implies starting to maintain the packaging for the desired distribution. diff --git a/radar/2017-03-01/microservices.md b/radar/2017-03-01/microservices.md index 4bc674f..39cea51 100644 --- a/radar/2017-03-01/microservices.md +++ b/radar/2017-03-01/microservices.md @@ -2,10 +2,8 @@ title: "Microservices" ring: trial quadrant: methods-and-patterns - --- - Microservices as an architecture style is getting very popular recently. At AOE, more and more teams are adding microservices to their existing application architecture or designing applications with microservices. We also like the term "self-contained systems" instead of microservices. @@ -13,7 +11,7 @@ We also like the term "self-contained systems" instead of microservices. The benefits we see are: * better handling of complexity compared to adding features in a monolithic approach -* beeing able to use the languages and framework that best fit the purpose of the service +* being able to use the languages and framework that best fit the purpose of the service * enabling better parallel work in big teams or multi-team projects * flexibility in deploying changes to production - by just deploying the changed service diff --git a/radar/2017-03-01/neo4j.md b/radar/2017-03-01/neo4j.md index 14e13be..ef4acc9 100644 --- a/radar/2017-03-01/neo4j.md +++ b/radar/2017-03-01/neo4j.md @@ -2,8 +2,8 @@ title: "Neo4j" ring: assess quadrant: platforms-and-aoe-services - --- + Neo4j is one of the oldest Open Source Graph Databases. It's one of the rare NoSQL databases that is fully ACID-compliant. We see two main advantages of graph databases: * for a lot of domains there is a natural way of modeling this in a graph (the Neo4j website says "everything is a graph"), diff --git a/radar/2017-03-01/node-js.md b/radar/2017-03-01/node-js.md index 199d2c0..ffe5905 100644 --- a/radar/2017-03-01/node-js.md +++ b/radar/2017-03-01/node-js.md @@ -2,7 +2,6 @@ title: "node.js" ring: trial quadrant: languages-and-frameworks - --- Node.js is a no- browser JavaScript execution runtime. Its basis is Google's V8 engine. [Node](https://nodejs.org/en/) is event-driven and follows a non-blocking I/O model. diff --git a/radar/2017-03-01/npm.md b/radar/2017-03-01/npm.md index 8db0b33..e6e70fc 100644 --- a/radar/2017-03-01/npm.md +++ b/radar/2017-03-01/npm.md @@ -2,8 +2,8 @@ title: "NPM" ring: adopt quadrant: tools - --- + [NPM](https://www.npmjs.com/) is one of, if not the most, popular package manager for JavaScript. Because of the big community, you can find nearly every dependency in npm. Instead of other package managers such as [bower](/tools/bower.html), you have to write your packages as [modules](https://en.wikipedia.org/wiki/CommonJS). This unifies the way you have to use, test and, of course, understand dependencies. diff --git a/radar/2017-03-01/oro-platform.md b/radar/2017-03-01/oro-platform.md index f71d7f9..7d09fd8 100644 --- a/radar/2017-03-01/oro-platform.md +++ b/radar/2017-03-01/oro-platform.md @@ -2,7 +2,6 @@ title: "Oro Platform" ring: assess quadrant: tools - --- OroPlatform is a framework built on Symfony 2 with the purpose of providing the features you need in every business application that is not your core business logic. Hence, it serves you with a basic application, providing login and complex security, menus and menu management, history, audit trails, settings management, etc. It comes complete with a design and many widgets to be utilized in own entities. Other Features of OroPlatform are, for example, a WebSocket server-driven user interface, queue-based task runners, REST Interface, as well as messaging- and workflow systems. @@ -11,6 +10,6 @@ One of the central features is that entities, which are to be managed within the As with every framework or application, the general-purpose goals and abstraction comes with drawbacks: In fact, OroPlatform modifies and extends the common way of doing things in Symfony in several places, which makes the developer's life hard at times. Also, the UI and package managing are set in such a way that they are hard to extend or replace. The many additional abstraction layers can result in decreased performance. -On the other hand, OroPlatform gives you a good headstart for prototyping and frees you from rebuilding common requirements - which makes it a relevant choice for business applications with the need to manage several entities in a backend. Also, projects such [Akeneo](/tools/akeneo.html) or OroCRM use OroPlatform with success. +On the other hand, OroPlatform gives you a good head start for prototyping and frees you from rebuilding common requirements - which makes it a relevant choice for business applications with the need to manage several entities in a backend. Also, projects such [Akeneo](/tools/akeneo.html) or OroCRM use OroPlatform with success. Since the project is still young, the future development and improvements need to be watched. We classified the Framework as ***Assess***. diff --git a/radar/2017-03-01/pair-working.md b/radar/2017-03-01/pair-working.md index e4e5211..6711529 100644 --- a/radar/2017-03-01/pair-working.md +++ b/radar/2017-03-01/pair-working.md @@ -2,10 +2,10 @@ title: "Pair working" ring: trial quadrant: methods-and-patterns - --- + We summarized the practices of pair programming and administrating as pair working. Derived as a practice from eXtreme Programming (XP), pair programming is a method/pattern that aims for fine-scaled feedback within a team. -At AOE, some developers and operators work in pairs, not constantly, but from time to time. Most teams have positive experiences using this method, but not all teams tried the by-the-book-approach (driver and navigator principle). Especially for non-trival tasks, pair working results in rapid knowlegde exchange and better results with less bugs. We encourage the teams to try this approach more often. +At AOE, some developers and operators work in pairs, not constantly, but from time to time. Most teams have positive experiences using this method, but not all teams tried the by-the-book-approach (driver and navigator principle). Especially for non-trivial tasks, pair working results in rapid knowledge exchange and better results with fewer bugs. We encourage the teams to try this approach more often. diff --git a/radar/2017-03-01/phan.md b/radar/2017-03-01/phan.md index 04283a4..470758f 100644 --- a/radar/2017-03-01/phan.md +++ b/radar/2017-03-01/phan.md @@ -2,8 +2,8 @@ title: "phan" ring: assess quadrant: tools - --- + Phan is a static code analyzer for PHP7, which is very fast, since it uses the PHP 7 AST (abstract syntax tree). Phan basically offers some of the safety that otherwise only compiled type-safe languages have - such as checking function references and return types. We expect at least the following benefits: diff --git a/radar/2017-03-01/php7-over-php5.md b/radar/2017-03-01/php7-over-php5.md index 2d13dab..baa4e59 100644 --- a/radar/2017-03-01/php7-over-php5.md +++ b/radar/2017-03-01/php7-over-php5.md @@ -2,7 +2,6 @@ title: "PHP7 over PHP5" ring: adopt quadrant: languages-and-frameworks - --- PHP 5 has been around for a very long time, and can be considered as the PHP version that defined where PHP wants to go in the future. @@ -11,7 +10,7 @@ However, in the past 3 years, Facebook introduced HHVM, which became a major inf Here at AOE, we have numerous PHP projects, and we often kept it backwards-compatible to make sure that it will run on older systems. This is comparable to the procedure most frameworks (Magento, OroPlatform and derived projects) use. -Now, PHP 5 has reached its end--of-life, and it is time to discontinue the backqards-compatibility in favor of better and more stable applications. +Now, PHP 5 has reached its end--of-life, and it is time to discontinue the backwards-compatibility in favor of better and more stable applications. Even though we can use the PHP 7 runtime while being PHP 5-compatible, it is not considered good practice anymore, as we can now rely on the PHP 7 features and use all of its advantages. -One of the major points PHP 7 supports is proper typehinting and return types (apart from PhpDocs), which makes [static analysis](/tools/phan.html) much easier and can improve the overall code quality significantly. +One of the major points PHP 7 supports is proper type hinting and return types (apart from PhpDocs), which makes [static analysis](/tools/phan.html) much easier and can improve the overall code quality significantly. diff --git a/radar/2017-03-01/pin-external-dependencies.md b/radar/2017-03-01/pin-external-dependencies.md index 98a6b4e..edd7a6c 100644 --- a/radar/2017-03-01/pin-external-dependencies.md +++ b/radar/2017-03-01/pin-external-dependencies.md @@ -35,5 +35,5 @@ We suggest the following: [artifactory as composer and npm cache](/platforms-and-aoe-services/artifactory.html)) For updating of dependencies define a process in the team. This can either be -done on the dev-system or in a seperate automated CI job - both resulting in +done on the dev-system or in a separate automated CI job - both resulting in updated dependency definitions in the applications VCS. diff --git a/radar/2017-03-01/pipeline-as-code.md b/radar/2017-03-01/pipeline-as-code.md index 69c4e0e..50562c1 100644 --- a/radar/2017-03-01/pipeline-as-code.md +++ b/radar/2017-03-01/pipeline-as-code.md @@ -2,7 +2,6 @@ title: "Pipeline as Code" ring: assess quadrant: methods-and-patterns - --- Continuous Integration and Delivery is a critical part of our development and deployment process at AOE. Using Jenkins for many years the "instructions" how to build, test and deploy applications were scattered between many custom scripts and the pipeline was often maintained by manual maintenance of Jenkins jobs. Soon, we realized that we need a more native way to express the full CI/CD pipeline process in code and manage it in version control. diff --git a/radar/2017-03-01/play-framework.md b/radar/2017-03-01/play-framework.md index 1c8e77a..d5aab07 100644 --- a/radar/2017-03-01/play-framework.md +++ b/radar/2017-03-01/play-framework.md @@ -2,7 +2,6 @@ title: "Play Framework" ring: adopt quadrant: languages-and-frameworks - --- The Play Framework is a lightweight (web)application framework for Java and [Scala](/languages-and-frameworks/scala-lang.html) programmers. @@ -13,4 +12,4 @@ Regarding the architecture, Play is stateless and built on Akka. As a consequenc With the use of "[Futures](http://docs.scala-lang.org/overviews/core/futures.html)" in your code you can turn synchronous tasks (such as IO or API call to another service) into asynchronous and you can build non-blocking applications. It is recommended to understand the principles Play uses to achieve performance and scalability. -Play can act as backend service delivering JSON, for esample. For building web applications. the [Twirl](https://www.playframework.com/documentation/2.5.x/ScalaTemplates) template engine enables server-side rendering of html pages. These html pages can include css and java script parts of your own choice. +Play can act as backend service delivering JSON, for example. For building web applications. The [Twirl](https://www.playframework.com/documentation/2.5.x/ScalaTemplates) template engine enables server-side rendering of HTML pages. These HTML pages can include CSS and JavaScript parts of your own choice. diff --git a/radar/2017-03-01/postcss.md b/radar/2017-03-01/postcss.md index f00fa7b..6c93a97 100644 --- a/radar/2017-03-01/postcss.md +++ b/radar/2017-03-01/postcss.md @@ -2,11 +2,9 @@ title: "PostCSS" ring: adopt quadrant: tools - --- -PostCSS is a tool for transforming stylesheets with JavaScript plugins. It comes with a parser that reads your CSS file into an AST, pipes it through the loaded plugins and finally -stringifies it back into a (transformed) CSS output file. +PostCSS is a tool for transforming stylesheets with JavaScript plugins. It comes with a parser that reads your CSS file into an AST, pipes it through the loaded plugins and finally stringifies it back into a (transformed) CSS output file. We at AOE love PostCSS because it gives us the power to use [CSS Modules](https://github.com/css-modules/css-modules), which finally ends the curse of global CSS. diff --git a/radar/2017-03-01/protobuf.md b/radar/2017-03-01/protobuf.md index b151263..c71beac 100644 --- a/radar/2017-03-01/protobuf.md +++ b/radar/2017-03-01/protobuf.md @@ -2,7 +2,6 @@ title: "Protobuf" ring: assess quadrant: languages-and-frameworks - --- In an increasingly microservice-oriented environment, it is crucial that all parties agree on a common language and wire format for data exchange. diff --git a/radar/2017-03-01/puppet-environments.md b/radar/2017-03-01/puppet-environments.md index 839bfee..b1eea0a 100644 --- a/radar/2017-03-01/puppet-environments.md +++ b/radar/2017-03-01/puppet-environments.md @@ -2,7 +2,6 @@ title: "Puppet Environments" ring: assess quadrant: platforms-and-aoe-services - --- Puppet diff --git a/radar/2017-03-01/rabbitmq.md b/radar/2017-03-01/rabbitmq.md index 7feb263..b8ba5f6 100644 --- a/radar/2017-03-01/rabbitmq.md +++ b/radar/2017-03-01/rabbitmq.md @@ -2,12 +2,12 @@ title: "RabbitMQ" ring: trial quadrant: tools - --- + RabbitMQ is an Open Source message broker - implementing the Advanced Message Queuing Protocol (AMQP) protocol. It provides a reliable and scalable way to transport data between loosely coupled applications, using different EAI patterns such as the Publish & Subscriber pattern. AMQP supports direct and fan-out exchanges (broadcasts) as well as topics. Queuing mechanisms allow for robust architectures, mitigating the risks of application downtimes. Typically, a RabbitMQ server can easily buffer millions of messages. RabbitMQ supports JMS in addition to AMQP. It is not intended to use JMS for new systems, but it makes RabbitMQ useful for integrating legacy systems. There are several alternative solutions to RabbitMQ, e. g. the free Apache ActiveMQ, which is integrated in [Anypoint platform](/tools/anypoint-platform.html). ActiveMQ implements a somewhat simpler routing concept than RabbitMQ, but offers more protocols. Commercial products in this area are offered by IBM (Websphere MQ), Fiorano and almost every vendor of ESB products. We use RabbitMQ internally for transferring messages safely in our logging ecosystem between [Logstash](/platforms-and-aoe-services/elk-stack.html) proxies and servers using direct and fan-out exchanges for delivering messages to appropriate destinations. RabbitMQ is also used to asynchronously trigger Jenkins jobs from our SCMs to mitigate heavy load on the SCMs, usually caused by Jenkins polls for SCM changes. Additionally, some critical events for monitoring are using RabbitMQ for guaranteed notification. -RabbitMQ is rated "Trial". It fits into our approach to build robust, [resilient systems](/methods-and-patterns/resilience-thinking.html) and use [asyncronous messages](/methods-and-patterns/decoupling-infrastructure-via-messaging.html) for loosely coupled communications between components. In practice, RabbitMQ proved to be stable and dealt well with service interruptions from failures and maintenance slots. A common pain point is RabbitMQ as a single point of failure disrupting the data flow in a system. This issue is currently approached by setting up a HA cluster for RabbitMQ. The outcome of this approach will clarify the extent of future usage of RabbitMQ in our systems. +RabbitMQ is rated "Trial". It fits into our approach to build robust, [resilient systems](/methods-and-patterns/resilience-thinking.html) and use [asynchronous messages](/methods-and-patterns/decoupling-infrastructure-via-messaging.html) for loosely coupled communications between components. In practice, RabbitMQ proved to be stable and dealt well with service interruptions from failures and maintenance slots. A common pain point is RabbitMQ as a single point of failure disrupting the data flow in a system. This issue is currently approached by setting up a HA cluster for RabbitMQ. The outcome of this approach will clarify the extent of future usage of RabbitMQ in our systems. diff --git a/radar/2017-03-01/raml.md b/radar/2017-03-01/raml.md index 0d8ae4f..d1a69ae 100644 --- a/radar/2017-03-01/raml.md +++ b/radar/2017-03-01/raml.md @@ -2,7 +2,6 @@ title: "RAML" ring: adopt quadrant: tools - --- [RAML](http://raml.org/) (the RESTful API Modelling Language) is a YAML-based API specification language. It's now available in [version 1.0](https://github.com/raml-org/raml-spec/blob/master/versions/raml-10/raml-10.md#defining-types). The philosophy behind it is to [specify the API before implementation](/methods-and-patterns/api-first-design-approach.html). diff --git a/radar/2017-03-01/react.md b/radar/2017-03-01/react.md index 92d5e4b..973218e 100644 --- a/radar/2017-03-01/react.md +++ b/radar/2017-03-01/react.md @@ -16,4 +16,4 @@ our components became smaller, more reusable and better testable. After some 1.5 years of experience with React and the steady growth of the community and ecosystem around it, we can confidently say that we still see -great protential to build upcoming projects with React. +great potential to build upcoming projects with React. diff --git a/radar/2017-03-01/redux.md b/radar/2017-03-01/redux.md index bfd4e40..6910e7f 100644 --- a/radar/2017-03-01/redux.md +++ b/radar/2017-03-01/redux.md @@ -2,7 +2,6 @@ title: "Redux" ring: trial quadrant: languages-and-frameworks - --- [Redux](http://redux.js.org/) helps us to maintain state in our frontend applications in a more predictable and clearer way. It is extendable though middleware, it has a great documentation and some awesome [devtools](https://github.com/gaearon/redux-devtools) that are especially helpful when you are new to Redux. diff --git a/radar/2017-03-01/resilience-thinking.md b/radar/2017-03-01/resilience-thinking.md index e0a52bb..9605ea7 100644 --- a/radar/2017-03-01/resilience-thinking.md +++ b/radar/2017-03-01/resilience-thinking.md @@ -2,19 +2,17 @@ title: "Resilience thinking" ring: trial quadrant: methods-and-patterns - --- - -Resilience is the cabability of an application or service to resist different error scenarios. Especially for distributed systems - where a lot of communication between different services happen - it's very important to explicitly think of implementing resilience. +Resilience is the capability of an application or service to resist different error scenarios. Especially for distributed systems - where a lot of communication between different services happen - it's very important to explicitly think of implementing resilience. There are a lot of different resilience patterns and it is also a matter of the overall software design. Typical patterns and methods used are: -* Do not hide API calls or any other external communication in your application (for example with unnecessary abstraction) - instead make it explicit that an external communication happens - e.g. by using the Facade Pattern. On the one hand, this makes it obvious that a potential slow and errorprone communication is going to happen, and it makes it easier to implement error handling. +* Do not hide API calls or any other external communication in your application (for example with unnecessary abstraction) - instead make it explicit that an external communication happens - e.g. by using the Facade Pattern. On the one hand, this makes it obvious that a potential slow and error prone communication is going to happen, and it makes it easier to implement error handling. * Detect errors explicitly: Check the response message format and configure proper timeouts for external communication * Handle errors in a smart way: Show a nice error message to your customer or, even better, graceful degrade features - e.g. by showing some fallback text * Use Message-based communication where useful ([Decoupling Infrastructure via Messaging](/methods-and-patterns/decoupling-infrastructure-via-messaging.html)) * Use Circuit Breaker to Isolate errors and allow system to recover * Use short activation paths in your strategic architecture - so that there is only a minimal set of communications between your services required for certain features or business requests -"Embrace Errors" should be the mindset - because its not a question if errors appear - it's just a question of when. \ No newline at end of file +"Embrace Errors" should be the mindset - because it is not a question if errors appear - it's just a question of when. \ No newline at end of file diff --git a/radar/2017-03-01/rest-assured.md b/radar/2017-03-01/rest-assured.md index 9efac0c..f3753e2 100644 --- a/radar/2017-03-01/rest-assured.md +++ b/radar/2017-03-01/rest-assured.md @@ -2,7 +2,6 @@ title: "Rest Assured (Testing)" ring: assess quadrant: tools - --- **[REST-assured](https://github.com/rest-assured/rest-assured)** is a Java DSL for simplifying testing of REST-based services built on top of HTTP Builder. It supports the most important http request methods and can be used to validate and verify the response of these requests. diff --git a/radar/2017-03-01/rxjava.md b/radar/2017-03-01/rxjava.md index 5c8d2f9..1466b26 100644 --- a/radar/2017-03-01/rxjava.md +++ b/radar/2017-03-01/rxjava.md @@ -2,7 +2,6 @@ title: "RxJava" ring: trial quadrant: tools - --- -[RxJava](https://github.com/ReactiveX/RxJava) is the Open Source Java implementation of ReactiveX. The main concept heavily relies on the Observer- (and Subscriber)-Pattern. An Observer emits a stream of data, which can be consumed by Subscribers. The Subscriber reacts (That's where the 'Rx' comes from) asynchronously to those data events. Reactive Extensions were originally developed by Mircosoft's Erik Meijer and his team and have been ported to all major programming languages after being released to the public as Open Source software. We use RxJava (but actually RxAndroid to be precise) in the Congstar Android App to let the UI layer react to changes in the underlaying data layer. +[RxJava](https://github.com/ReactiveX/RxJava) is the Open Source Java implementation of ReactiveX. The main concept heavily relies on the Observer- (and Subscriber)-Pattern. An Observer emits a stream of data, which can be consumed by Subscribers. The Subscriber reacts (That's where the 'Rx' comes from) asynchronously to those data events. Reactive Extensions were originally developed by Mircosoft's Erik Meijer and his team and have been ported to all major programming languages after being released to the public as Open Source software. We use RxJava (but actually RxAndroid to be precise) in the Congstar Android App to let the UI layer react to changes in the underlying data layer. diff --git a/radar/2017-03-01/rxjs.md b/radar/2017-03-01/rxjs.md index 461123d..c970c7c 100644 --- a/radar/2017-03-01/rxjs.md +++ b/radar/2017-03-01/rxjs.md @@ -2,8 +2,8 @@ title: "RxJs" ring: trial quadrant: languages-and-frameworks - --- + RX/JS aka reactive streams RxJS is an implementation for the reactive programming paradigm which implements mostly the observer and iterator diff --git a/radar/2017-03-01/sass.md b/radar/2017-03-01/sass.md index 75d883c..0398068 100644 --- a/radar/2017-03-01/sass.md +++ b/radar/2017-03-01/sass.md @@ -2,7 +2,6 @@ title: "SASS" ring: adopt quadrant: languages-and-frameworks - --- SASS (Syntactically Awesome Style-Sheets) is an extension to native CSS, which, as a preprocessor, simplifies the generation of CSS by offering features that enable developers to more efficiently write robust, better readable and maintainable CSS. diff --git a/radar/2017-03-01/scala-lang.md b/radar/2017-03-01/scala-lang.md index 3460c79..9b9772f 100644 --- a/radar/2017-03-01/scala-lang.md +++ b/radar/2017-03-01/scala-lang.md @@ -2,7 +2,6 @@ title: "Scala Lang" ring: trial quadrant: languages-and-frameworks - --- Besides Java, Scala is the most mature language on the Java Virtual Machine. Its unique blend of object-oriented and functional language features and rich type system with advanced type inference enables one to write concise code. diff --git a/radar/2017-03-01/settings-injection.md b/radar/2017-03-01/settings-injection.md index 16d251a..9e4035a 100644 --- a/radar/2017-03-01/settings-injection.md +++ b/radar/2017-03-01/settings-injection.md @@ -2,10 +2,10 @@ title: "Settings Injection" ring: adopt quadrant: methods-and-patterns - --- + While deploying applications to an environment, the application typically needs to be configured for that specific environment. Typical settings include domain names, database credentials and the location of other dependent services such as cache backends, queues or session storages. These settings should not be shipped with the build package. Instead, it's the environment - this build is being deployed to - that should expose these values to application. A common way to "inject" these values is by making them available as environment variables or dynamically creating configuration files for the application. You can achieve this pattern without special tools - but this concept of settings injection also works with tools such as [Consul](/tools/consul.html), [kubernetes](/platforms-and-aoe-services/kubernetes.html) (with configMaps and secrets) or [YAD](https://github.com/AOEpeople/YAD). -In this manner, the build package can be independent from the environment it's being deployed to - making it easier to follow the "Build once, deploy often" CI/CD principle. +In this manner, the build package can be independent of the environment it's being deployed to - making it easier to follow the "Build once, deploy often" CI/CD principle. diff --git a/radar/2017-03-01/sparkpost.md b/radar/2017-03-01/sparkpost.md index f5b7757..3d14ff3 100644 --- a/radar/2017-03-01/sparkpost.md +++ b/radar/2017-03-01/sparkpost.md @@ -2,12 +2,12 @@ title: "SparkPost" ring: assess quadrant: platforms-and-aoe-services - --- + Sparkpost is an SaaS service for E-Mail delivery and E-Mail templating that can be used to send E-Mails by calling an API. In a lot of projects, it is a typical requirement that different E-Mails need to be sent and that the project stakeholders want to adjust E-Mail templates and content on a relatively regular basis. Also, (mass) sending E-Mails and avoiding that they are classified as Spam is not an easy topic. That's why we decided to use E-Mail delivery services in our projects and evaluated different providers. -We decided to start using SparkPost because of pricing, feature set and the available reviews on the Internet. There are also other possible solutions such as SendGrid or Postmark. +We decided to start using SparkPost because of pricing, feature set and the available reviews on the Internet. However, there are other possible solutions such as SendGrid or Postmark. diff --git a/radar/2017-03-01/spock_geb.md b/radar/2017-03-01/spock_geb.md index 9070ad7..54469be 100644 --- a/radar/2017-03-01/spock_geb.md +++ b/radar/2017-03-01/spock_geb.md @@ -2,17 +2,14 @@ title: "Spock + Geb" ring: adopt quadrant: languages-and-frameworks - --- [spockframework.org](http://www.spockframework.org) - Spock is a testing and specification framework for Java and Groovy applications. What makes it stand out from the crowd is its beautiful and highly expressive specification language. Thanks to its JUnit runner, Spock is compatible with most IDEs, build tools and continuous integration servers. Spock is inspired from JUnit, jMock, RSpec, Groovy, Scala, Vulcans, and other fascinating life forms. -[gebish.org](http://www.gebish.org) - Geb is a browser automation solution. It brings together the power of WebDriver, the elegance of jQuery content selection, the robustness of Page Object modelling and the expressiveness of the Groovy language. It can be used for scripting, scraping and general automation or equally as a functional/web/acceptance testing solution via integration with testing frameworks such as Spock, JUnit & TestNG. +[gebish.org](http://www.gebish.org) - Geb is a browser automation solution. It brings together the power of WebDriver, the elegance of jQuery content selection, the robustness of Page Object modelling and the expressiveness of the Groovy language. It can be used for scripting, scraping and general automation or as a functional/web/acceptance testing solution via integration with testing frameworks such as Spock, JUnit & TestNG. At AOE, we use Spock in combination with Geb in various projects for black-box testing. Mainly, we implement our functional integration and acceptance testing automation with these frameworks, which work together seamlessly. And, we also like the convenience of extending the tests with Groovy built-ins or custom extensions. Because of the successful use in two of our large projects and the wide range of opportunities within the testing domain with Spock and Geb, we classify this combo with adopt. - - diff --git a/radar/2017-03-01/spring-boot.md b/radar/2017-03-01/spring-boot.md index d709c45..a4ca3cf 100644 --- a/radar/2017-03-01/spring-boot.md +++ b/radar/2017-03-01/spring-boot.md @@ -2,7 +2,6 @@ title: "Spring Boot" ring: assess quadrant: languages-and-frameworks - --- With Spring Boot you create standalone Spring Applications with minimum configuration. [Spring Boot](https://projects.spring.io/spring-boot/) rapidly gets you up and running for production. diff --git a/radar/2017-03-01/spring-rest-docs.md b/radar/2017-03-01/spring-rest-docs.md index 05db18c..2df82e4 100644 --- a/radar/2017-03-01/spring-rest-docs.md +++ b/radar/2017-03-01/spring-rest-docs.md @@ -2,8 +2,8 @@ title: "Spring REST Docs" ring: assess quadrant: tools - --- + [Spring REST Docs](https://projects.spring.io/spring-restdocs/) auto generates [Asciidoctor](http://asciidoctor.org/) snippets with the help of [Spring MVC Test](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle#spring-mvc-test-framework) or [RestAssured](/tools/rest-assured.html). So you can be sure that your tests are inline with the documentation. At AOE, we use [Spring REST Docs](https://projects.spring.io/spring-restdocs/) to document our Rest Services and Hal Resources. We also use it to auto generate [WireMock](/tools/wiremock.html) Stubs, so the consumer of the service can test against the exact API of the service. diff --git a/radar/2017-03-01/strategic-domain-driven-design.md b/radar/2017-03-01/strategic-domain-driven-design.md index 047a82a..44e38dc 100644 --- a/radar/2017-03-01/strategic-domain-driven-design.md +++ b/radar/2017-03-01/strategic-domain-driven-design.md @@ -2,18 +2,16 @@ title: "Strategic Domain Driven Design" ring: adopt quadrant: methods-and-patterns - --- Design of distributed applications need to be done wisely. Strategic Domain Driven Design is an approach for modelling large-scale applications and systems and is introduced in the last part of Eric Evans' book _**Domain Driven Design**_. Domain driven design is a well-known pattern family and has been established at AOE for quite some time now. Unlike Domain Driven Design, which focuses on the tactical design in an application, strategic domain driven design is an approach that is very helpful for the high-level strategic design of an application and distributed software architecture. -It is a pattern familiy focused on using and defining Bounded Context and thinking explicitly of the different relationship patterns and the required "translation" of similar "concepts" between the bounded contexts. It is helpful to argue and find a good strategic architecture in alignment with the requirements, the domain and by considering Conway's Law. +It is a pattern family focused on using and defining Bounded Context and thinking explicitly of the different relationship patterns and the required "translation" of similar "concepts" between the bounded contexts. It is helpful to argue and find a good strategic architecture in alignment with the requirements, the domain and by considering Conway's Law. A context map and a common conceptional core help to understand and improve the overall strategic picture. Especially with the [Microservice](/methods-and-patterns/microservices.html) approach, it is important to define and connect services following the low coupling - high cohesion principles by idendifying fitting bounded contexts. The following chart gives an overview of possible relationships between bounded contexts: ![strategic-domain-driven-design-relationships](/images/strategic-domain-driven-design-relationships.png) - -While we have found that this approach is especially useful in designing distributed systems and applications with [microservices](/methods-and-patterns/microservices.html), we have also extended this approach to provide guidlines for general enterprise architectures. \ No newline at end of file +While we have found that this approach is especially useful in designing distributed systems and applications with [microservices](/methods-and-patterns/microservices.html), we have also extended this approach to provide guidelines for general enterprise architectures. \ No newline at end of file diff --git a/radar/2017-03-01/styleguide-driven-development.md b/radar/2017-03-01/styleguide-driven-development.md index 48d839a..9096d6f 100644 --- a/radar/2017-03-01/styleguide-driven-development.md +++ b/radar/2017-03-01/styleguide-driven-development.md @@ -2,8 +2,8 @@ title: "Styleguide Driven Development" ring: trial quadrant: methods-and-patterns - --- + The goal of Styleguide Driven Development is to develop your application user Interface independently and reusable in a Pattern Library.\ In the old days, the frontend was developed based on page-centric Photoshop files which made it hard to change things afterwards. With styleguide driven development you build smaller elements, which are reusable in all of your frontends. diff --git a/radar/2017-03-01/symfony-components.md b/radar/2017-03-01/symfony-components.md index c51cc46..e428cbc 100644 --- a/radar/2017-03-01/symfony-components.md +++ b/radar/2017-03-01/symfony-components.md @@ -2,7 +2,6 @@ title: "Symfony Components" ring: trial quadrant: languages-and-frameworks - --- Symfony Components are part of the [Symfony Framework](https://symfony.com/) and they are designed as decoupled and reusable PHP components. diff --git a/radar/2017-03-01/typescript.md b/radar/2017-03-01/typescript.md index 17b627c..8c88128 100644 --- a/radar/2017-03-01/typescript.md +++ b/radar/2017-03-01/typescript.md @@ -2,7 +2,6 @@ title: "Typescript" ring: assess quadrant: languages-and-frameworks - --- [TypeScript](https://www.typescriptlang.org/) is a language that gets transpiled to native JavaScript code. diff --git a/radar/2017-03-01/typo3-as-a-framework.md b/radar/2017-03-01/typo3-as-a-framework.md index bfa0936..a7dea79 100644 --- a/radar/2017-03-01/typo3-as-a-framework.md +++ b/radar/2017-03-01/typo3-as-a-framework.md @@ -2,7 +2,6 @@ title: "TYPO3 as a Framework" ring: hold quadrant: tools - --- We should avoid building new projects around TYPO3 by default. A lot of past projects started with CMS-only features in the beginning, and, for example, developed toward highly customized E-Commerce platforms. Instead of rearranging the architecture in a useful way, functionality was built on top of TYPO3's core and its extension framework Extbase. In the context of larger projects, this lead to deployment monoliths and the inability to integrate new technologies. diff --git a/radar/2017-03-01/vue.md b/radar/2017-03-01/vue.md index 2f0e308..d877532 100644 --- a/radar/2017-03-01/vue.md +++ b/radar/2017-03-01/vue.md @@ -2,7 +2,6 @@ title: "Vue.js" ring: assess quadrant: languages-and-frameworks - --- Vue is a progressive, incrementally adoptable framework for building user interfaces maintained by Evan You. Unlike [other monolithic frameworks](http://vuejs.org/v2/guide/comparison.html), the core library is focused on the view layer only and is very easy to pick up and integrate with other libraries or existing projects. Vue is also perfectly capable of powering sophisticated single-page applications when used in combination with modern tooling and supporting libraries such as [vuex](https://vuex.vuejs.org/en/) and [vue-router](http://router.vuejs.org/en/). diff --git a/radar/2017-03-01/webpack.md b/radar/2017-03-01/webpack.md index 21b5a2a..59a7937 100644 --- a/radar/2017-03-01/webpack.md +++ b/radar/2017-03-01/webpack.md @@ -2,8 +2,8 @@ title: "Webpack" ring: trial quadrant: tools - --- + [Webpack](https://webpack.js.org/) is a web bundler for JavaScript applications. Instead of writing scripts to build and bundle your app like you would with [Gulp](/tools/gulp.html), you just define what files you want to load into your bundle. In the following example, we define that JavaScript files should be handled by babel-loader, excluding the files from node_modules. The logic behind the process comes from the [loader](https://webpack.js.org/concepts/loaders/). You can find the right loader in [npm](https://www.npmjs.com/search?q=loader%20webpack&page=1&ranking=optimal). diff --git a/radar/2017-03-01/wiremock.md b/radar/2017-03-01/wiremock.md index c5e7b3f..b066249 100644 --- a/radar/2017-03-01/wiremock.md +++ b/radar/2017-03-01/wiremock.md @@ -2,8 +2,8 @@ title: "WireMock" ring: trial quadrant: tools - --- + **[WireMock](http://wiremock.org/docs/)** is an HTTP mock server - it can be used to mock APIs for testing. At its core, it is a web server that can be prepared to serve canned responses to particular requests (stubbing), and that captures incoming requests so that they can be checked later (verification). It also has an assortment of other useful features including record/playback of interactions with other APIs, injection of faults and delays, simulation of stateful behavior. diff --git a/radar/2017-03-01/xataface.md b/radar/2017-03-01/xataface.md index e8d00d3..7249998 100644 --- a/radar/2017-03-01/xataface.md +++ b/radar/2017-03-01/xataface.md @@ -2,9 +2,8 @@ title: "Xataface" ring: hold quadrant: platforms-and-aoe-services - --- -In the past, we used a custom-developed toolset with Xataface,T3Deploy and a settings migration tool as an easy way to manage TYPO3- and Magento-related configurations and to automatically create environments on our shared integration/dev-servers. +In the past, we used a custom-developed toolset with Xataface, T3Deploy and a settings migration tool as an easy way to manage TYPO3- and Magento-related configurations and to automatically create environments on our shared integration/dev-servers. Today, there is no advantage or need for Xataface. Don't use it anymore diff --git a/radar/2017-03-01/xmlunit.md b/radar/2017-03-01/xmlunit.md index 0b9e936..594c4a7 100644 --- a/radar/2017-03-01/xmlunit.md +++ b/radar/2017-03-01/xmlunit.md @@ -2,8 +2,8 @@ title: "XMLUnit" ring: assess quadrant: tools - --- + [XMLUnit](http://www.xmlunit.org/) is a Java and .NET testing framework for XML documents. It is very useful for performing contract tests with SOAP interfaces or other XML-based message types. -Comparing strings of XML can lead to instable tests because of the changing order of elements or changed values, etc. XMLUnit provides features to address these issues. It is possible to validate against an XML Schema, use XPath queries or compare against expected outcomes. It also comes with a nice diff-engine which makes it easy to check the parts of an XML document that are important. +Comparing strings of XML can lead to unstable tests because of the changing order of elements or changed values, etc. XMLUnit provides features to address these issues. It is possible to validate against an XML Schema, use XPath queries or compare against expected outcomes. It also comes with a nice diff-engine which makes it easy to check the parts of an XML document that are important. diff --git a/radar/2018-03-01/adr.md b/radar/2018-03-01/adr.md index ba6ad59..ecc5bad 100644 --- a/radar/2018-03-01/adr.md +++ b/radar/2018-03-01/adr.md @@ -8,8 +8,8 @@ Architecture Decision Records ADR is a lightweight documentation of important architecture decisions taken by the team. Without documentation of the architecture and the architecture decisions, new team members can only do two things: -* either (blindy) accept what they find and see or -* (blindy) change things +* either (blindly) accept what they find and see or +* (blindly) change things It goes without saying that both options aren't right.