Another handful of information from our experts. This time we have focused on the following four areas: “Big Data, SQL Server and Performance”, “Mobile & Java”, “Web, Continuous Integration & Security” and finally, Azure. What's more, for the first time, we gathered insights from our dear testers. Enjoy!
- [Assess] Lambda Architecture
- [On Hold] Microsoft R
- [Assess] Azure ML
- [On Hold] HockeyApp
- [Trial] Docker for Windows
- [Assess] Dedicated CI
- [On Hold] Angular 1.x
- [On Hold] Knockout
- [Adopt] SASS
- [On Hold] LESS
- [On Hold] bower
- [On Hold] jspm
- [Adopt] Webpack
- [Assess] Yarn
- [Trial] PowerApps
- [Assess] Azure Stack
Big Data, SQL Server & Performance
[Assess] Lambda Architecture (whole SMACK)
Data processing architecture designed to handle massive quantities of data by taking advantage of both batch and stream processing methods. SMACK is an implementation platform for Lambda Architecture and the acronym stands for Spark/Scala, Mesos, Akka, Cassandra, and Kafka.
- Spark - leading, lightning fast & general purpose computing platform. In the same engine, it supports a wide range of different workloads like batch processing, interactive queries (SQL), streaming & iterative algorithms. Having unified stack, we can easily & seamlessly combine those different workloads in our data pipeline with minimal cost, while it reduces the management burden of maintaining different tools. Under the hood all computations are run in the memory, in a distributed manner. Even though it's an open-source project and has number of contributors, including commercial ones like Facebook, it's governed by its creators who work at Databricks. Spark keeps evolving each day and recently, the 2.1 version has been released. It brings a lot of performance and memory usage improvements, which means it's even faster than it used to be. Recent highlights also show how well and fast Spark was adopted by many organizations all over the world. In other words, if you're going to work on any distributed data processing project (Big Data), there's really no better option than adopting Spark at the moment.
- Scala - JVM language that incorporates both object oriented and functional programming into concise and logical language. The main benefits are:
- Support for immutable data structures by functional as well as object oriented paradigms,
- Parallelism and concurrency out of the box, e.g. for Big Data applications,
- Conciseness and less code than in OOP languages,
- Statistically typed language that is safe and expressive.
Scala with its latest 2.12.1 version should be considered when it comes to scalable server software that makes use of concurrent and synchronous processing, parallel utilization of multiple cores, and distributed processing in the cloud. Its functional nature makes it easier to write safe and performant multi-threaded code. It’s being used by some of the largest companies in the world (LinkedIn, Twitter, FourSquare, The Guardian, to name just a few).
- Mesos - cluster resource management system that provides efficient resource isolation and sharing across distributed applications.
- Akka - a toolkit and runtime for building highly concurrent, distributed, and resilient message-driven applications on the JVM.
- Cassandra - distributed, highly available database designed to handle large amounts of data across multiple datacentres.
- Kafka - a high-throughput, low-latency distributed messaging system/commit log designed for handling real-time data feeds
[Assess] Azure Data Lake
Microsoft cloud distributed analytics service to store data of any size, shape, and speed, and do all types of processing and analytics across platforms and languages. It removes the complexities of ingesting and storing all of your data while making it faster to get up and running with batch, streaming, and interactive analytics. It is preferable over Blob Storage as it allows individual files to be sized at petabyte scale and has more granular security capabilities.
[Assess] Azure SQL Data Warehouse
Microsoft elastic ‘data warehouse as-a-service’ with enterprise-class features that you can provision in minutes and scale up in seconds. It uses an elastic massively parallel processing (MPP) architecture built on top of the SQL Server 2016 database engine. It allows you to interactively query and analyse data using existing SQL-based tools and business intelligence applications. It should be considered when you have an on-premise data warehouse and you are interested in moving to the cloud.
[On Hold] Microsoft R
The solution does not offer full compatibility with official R distribution. Only some of the most post popular R features are redesigned to provide parallelism and scalability https://msdn.microsoft.com/en-us/library/mt590540.aspx . No clear roadmap, only vague promise that Microsoft will add missing features if they are requested by customers or partners.
[Assess] Azure ML
As Microsoft explains Azure ML is designed to be used with average amount of data (up to 10 GBs). For use machine learning in Big Data, Microsoft recommends Spark and solutions based on Hadoop (HDInsight) https://docs.microsoft.com/en-us/azure/machine-learning/machine-learning-faq. Currently, Azure ML provides only some popular ML algorithms. Some of them are even further divided and presented as separate options. Again, no clear roadmap, but a promise that Microsoft will add other ML algorithms if they are requested by customers or partners.
Python is an interpreted, object-oriented, high-level programming language and open-source environment with very strong support of community. It has very powerful libraries for machine learning, neural networks and data visualization. Python has also very good libraries to create rich and modern web applications and web API. Finally, it facilitates quick creation end-2-end data science solutions.
Zabbix is open source enterprise monitoring software designed for tracking availability and performance of IT infrastructure components. It can monitor: network hardware, network services, applications and servers in heterogeneous environment. The key characteristics of Zabbix that caught our attention are:
- Mature solution proven by a lot of companies from all over the world.
- Ability to work in agent- and agentless- modes.
- Can store collected data in free database engines.
- Agents can be installed on Windows, Unix and Linux.
- Possibility to write custom collectors.
- JMX monitoring.
- Web monitoring.
- Ease of integration with Grafana.
- SLA, and ITIL KPI metrics in reporting
- Detailed documentation.
If you’re not lucky enough to have your application monitored by complex commercial solutions such as Application Insights, New Relic or AppDynamics, you certainly need a proven open-source tool providing real-time metrics and operational dashboards. There are two leaders on the market for such purposes – ELK and Grafana and you might wonder which one is better for you. In typical cases the answer is both – Grafana for measuring current state of the system and analysing trends, Kibana for deep troubleshooting and correlation of log events.
[Trial] Client-side Performance Tests
Application’s backend performance testing tells only part of the performance story and does not give full information about the end-user experience. It’s where browser-side performance audits come to the scene to provide the complementary data, especially now, as web applications tend to get more and more heavy on the browser side. We can obtain information whether JS frameworks are used in a performant manner and propose ways of optimising browser’s critical rendering path.
Sitespeed.io is a set of open-source tools that can measure the end-user experience for the websites and provide us with performance advice by analysing the client-server interaction. It gives plethora of information regarding browser-side performance, it integrates with tools like WebPageTest or Selenium WebDriver to handle tricky scenarios. Availability as a Docker container is another useful feature making it easier to get the tool set up and running.
Mobile & Java
[Adopt] Java 9
Another version of Java language that has reached stable version. As we grow more and more into Java it is a natural process to adopt newer version. It introduces many new features as for example long awaited module system that will now be able to fix many of current problems with JAR format. Apart from small changes in Java language itself Java JDK has also been improved. Introduction of reactive streams fits the current trend of reactive programing which gains popularity. Also, HTTP2 client was added with the support of WebSockets to improve client-server communication. Finally, many other already existing APIs have been improved. As with the upgrade to Java 8 which introduced (not only) Streams and Lambda expressions, Java 9 is another major step forward.
Simple library for Android which allows to get rid of boilerplate code for binding view fields and methods. Instead of slow reflection, it generates the binding layer code. Thanks to such an approach, generated layer can be easily obfuscated.
[Adopt] Swift 3
Swift is definitely THE language for Apple development nowadays. Swift 3.0 is a major language release. Unfortunately, it is not source-compatible with Swift 2.2 and 2.3. To help with migration to Swift 3, Xcode 8.0 (an IDE for macOS) contains a code migrator that can automatically handle many of the required code changes.
[Adopt] Dagger 2
Dependency Injection for Android platform. Dagger 2 does not use slow reflection for resolving dependencies. Instead, it relays on compile-time generated code which is responsible for connecting dependency providers with client layer that needs those dependencies. There are numerous advantages of such an approach. Dagger is faster, compared to reflection-based solutions. Additionally, if there is no reflection, there is no need to prevent client classes from being obfuscated. Dagger 2 allows also to define custom scope for dependencies.
Very popular Android library for performing HTTP requests. It can be easily configured and mocked during integration tests.
Appium is an open-source, cross-platform test automation tool for native, hybrid and mobile web apps. Like Selenium, Appium uses the WebDriver JSON Wire Protocol to drive and to test the UI of the mobile apps. It allows to write tests against multiple platforms (iOS, Android, Windows), using the same API (code reuse between iOS, Android, and Windows test suites is possible). However, currently there are a few limitations in Appium like: no support for Android API level < 17, very slow script execution on iOS platform, limited gesture support or no support for Toast messages. Appium is directed mainly to testers who have no access to the code base.
[Trial] Gradle & Groovy
Very flexible general purpose build tool. It has a powerful support for multi-project builds and introduces a powerful dependency management. It is used on Android by default and can be treated as a replacement for Maven and Ant.
[Trial] React Native
Framework for managing the status of feature flags and monitoring A/B tests. It simplifies the process of gradual roll-out of the feature, or the roll-back when needed.
[Assess] Native Script
It is an open source framework for building mobile applications from one code base. It looks like an alternative to Microsoft’s Xamarin and it is backed by Telerik. It also uses XML (XAML-ish) language for describing UI layout, but unlike Xamarin, it uses JS for writing application code and CSS for styling. It allows to use a well-known MV* frameworks for writing code (e.g. Angular with Typescript). Resulting code uses native rendering so it should not have issues with performance or ability to use libraries of choice. It is now available for iOS and Android. Windows support is planned for future releases.
Espresso is the Android test kit provided by Google. It provides a small and easy-to-learn API to interact with the UI elements of a native Android app. Espresso is mainly directed to developers who have access to the code base in order to write fast and reliable tests.
XCTest testing framework is the default framework promoted by Apple for testing iOS applications. XCUItest is a part of it, typically used for functional testing, automated testing of common workflows, demo sequences or behaviour of customer views. Xcode (an IDE for macOS) includes the UI test recorder. XCUITest is mainly directed to developers who have access to the code base in order to write fast and reliable tests.
[Assess] Real-time databases (offline first, Azure mobile services)
[Assess] Cloud Testing - Sauce Labs
[Assess] Cloud Testing - AWS Device Farm
AWS Device Farm enables testing and interacting with your Android, iOS, and Web apps on real, physical phones and tablets that are hosted by Amazon Web Services (AWS). Unlike the competition, it does not only support cross-platform test automation tools like Appium (Sauce Labs) or Calabash (Xamarin Test Cloud), but also many other platform-specific frameworks, i.e. Instrumentation (JUnit, Espresso, Robotium) and UI Automator for Android, XCTest (including KIF) and XCTest UI for iOS. AWS Device Farm provides its own built-in fuzz test tool. CI integration is done through Jenkins and Gradle plugins. Unlimited testing and remote access starts at $250 per month. But a free trial (250 device-minutes) is also available.
[On Hold] HockeyApp
This is a service for mobile developers to distribute beta versions of application, handle crash reporting, collect user metrics and feedback. It is similar to Google Analytics, but additionally it gives application distribution mechanism, versioning and notifications about a new version. It works good, but due to a greater popularity of Fabric.io we put it on hold.
Language extensions for reactive programming. Almost every action in mobile world is asynchronous (UI button click, http request, database read, etc.) and this library allows to handle such actions in natural way. You can easily run the time-consuming operations in background thread and present the results in the main UI thread.
Web, CI & Security
PSCI (Powershell Continuous Integration) is a build and deployment library written in Powershell by Objectivity. Its main purpose is to enable flexible automated deployments for complex monolithic applications hosted on Windows on-premise or in Azure. Although microservices are the way of future where PSCI might not be so useful (though still to be considered), big enterprise applications are still there and we are not aware of any other tool that can quickly deliver complex and maintainable deployment pipelines in Windows environments.
[Trial] Docker for Windows
Docker enables a new way of deploying applications by means of software containers, that can be thought of as lightweight virtual machines. It will change the way we think about deployments, and being already a standard in Java/Linux world, it’s also coming to the Windows world with the recent release of Docker for Windows 10/Server 2016. Resistance is futile.
[Assess] Dedicated CI
Although single TeamCity instance for all projects has its advantages, it also comes with costs such as increased inertia and bureaucracy due to limited IT Support availability and security requirements. With increasing DevOps awareness and availability of mature CI tools, it might make more sense to setup separate CI stacks per each team or tribe and transfer the responsibility of maintaining it to the teams. Thanks to it, you would never need to wait again for installing the new version of .NET on your TeamCity agents or setting up connection to Git. Moreover, you would no longer be bound to TeamCity (Objectivity’s default CI) – you could choose from plethora of modern CI servers such as GoCD, TravisCI, AppVeyor, CircleCI or Jenkins.
[On Hold] Angular 1.x
Version 2.0 was a major step in Angular history. There is little benefit in starting a new project with the old Angular version. Although 1.x branch has plenty of libraries and community support, on the other hand the whole world seems to be shifting to versions 2+ (currently 4.0 release). By doing so they solve some inborn Angular problems which affect larger applications and enforce better code practices. There is already a large number of projects proving that it is a good solution for modern websites.
React is still gaining momentum and is already number one citizen in the area of future web development. It may not be as complete as Angular i.e. it requires additional components or more effort to enforce good practices. It brings greater flexibility, but it may be initially confusing for developers who are used to separating views from view models and its license is a little controversial – therefore it should be analyzed before you start thinking about using it in new project. Its popularity within large institutions and a large number of projects in React results in a big community support. So it should be easy to work out a good working set of practices.
[On Hold] Knockout
It is no longer a recommended choice for building modern applications. It is not actively maintained, and therefore it should be abandoned in favor of some more modern and complete frameworks.
SASS is much closer to programming language than LESS. SASS gives more options to generate better CSS code. In contrast to LESS, SASS allows to nest individual properties and provides smarter math operations (e.g. “10px – 10%” – is an impossible operation in LESS). In addition, many popular tools (e.g. Bootstrap) use SASS, so it’s much easier to integrate it with custom application SASS code.
[On Hold] LESS
It is not a bad CSS pre-processor language, but it losses in many aspects with SASS. If you are starting from scratch please use SASS instead of LESS. There is a number of frameworks built with SASS: Bootstrap 4, Compass, Bourbon - they cannot be wrong :-)
[On Hold] bower
Bower development has stopped. You should move to npm as a package manager. Additionally, it is better to use one source of packages instead of two (bower and npm). Nowadays almost all frontend packages can be found using npm package manager. When migrating from bower consider changing your approach by including external packages – instead of relying on bower.json file, just write the whole application as a collection of modules (different types are supported here, including: ES6, AMD or CommonJS) with dependencies on other modules (no matter, internal or external), then use module bundler like: Webpack, Yarn or Browserify – this way dependencies are handled consistently in a single style.
[On Hold] jspm
JSPM is a frontend Package Manager and since NPM is already both the front- and back-end package manager – the solutions like Jspm are unnecessary complication. It is integrated with SystemJS module loader, but still requires additional automation tools (like bower). We recommend using Webpack as a sophisticated solution that offers almost everything that Jspm does except for package manager (and here NPM is the best option nowadays).
Webpack is a very popular highly configurable code bundler and module loader that can handle any sort of the front-end code and assets, but it is not trying to replace NPM as a package manager. It's a default platform for Angular2 and ReactJS frameworks. It has great community support and does not require additional automation tools (like gulp). It is bundled with the killer features like: browser sync and hot module swapping. https://webpack.github.io/docs/comparison.html
[On Hold] SystemJS
Last year's frontend testing framework supporting Single Page Application architecture. For UI testing it is a big challenge to be synchronized with browser. Protractor is an end-to-end test framework for Angular applications. Protractor supports Angular-specific locator strategies, which allows you to test Angular-specific elements without any setup effort on your part. It can also be used for web applications created with Aurelia.
[Adopt] SonarQube 6
Version 6 of SonarQube goes back to basics. The current version of this free tool is simpler in comparison to the previous editions to help the user focus on static code analysis. We have just begun using it at Objectivity and our aim is to have one place to visualize code quality, no matter whether it's Java, JS or .Net. The big plus is also the analysis of vulnerabilities, the most extensive for Java language. The initial ruleset is established with "less is more" in mind. Developers can use it during development through SonarLint plugins. https://www.sonarqube.org/
Since Agile Test Pyramid was created at Objectivity, more tests have to be created at API level. RestSharp library is a great library to start writing such tests in .NET. It saves a lot of time, it supports asynchronously actions and allows easy serialization of objects to XML/Json to be sent over the wire and convert response back to the object.
It is Microsoft offering in the area of Low-Code Development Platforms. It is strongly integrated with Office 365 and allows power users to create simple applications using approach similar to Excel formulas. During our assessment, we identified the following pros and cons:
- Deep integration with Office 365 (License included)
- Declarative programming similar to Excel formulas
- Easy integration and hundreds of connections to other applications
- Variety of data source providers: SQL Server, SharePoint, Excel, OneDrive https://powerapps.microsoft.com/en-us/tutorials/connections-list/
- Seamless integration with Microsoft Flow https://flow.microsoft.com/en-us/ services/
- Integration with PowerBI
- Integration with new SharePoint lists
- Applications can run on Desktop app on Win 8.1 +, Web app in many browsers, Native apps for IOS, Android and WP
- Could be develop in browser or desktop app
- Very limited programming options (no user functions reusable across application, no programming language as such)
- GUI oriented programming via drag’n’drop
- Limited capabilities of IDE
- No code view (apart from "bulky" JSON files)
- No search through all screens, controls
- Long delays between operations
- Limited collaboration options for a single application (1 app = 1 developer at a time)
[Trial] Azure IoT Hub
Azure IoT Hub is an event hub dedicated for IoT usage. IoT Hub and Event Hub are an event processing services that enable event and telemetry ingress to the cloud at massive scale, with low latency and high reliability. They are similar, but IoT Hub has additional features like:
- More protocols (in addition to AMQP and HTTP) dedicated to devices: MQTT and MQTT over WebSockets
- Granular security (If single device is compromised, it can be easily disabled)
- Bi-directional communication between device and the cloud
- Higher scalability
- can be accessed from really small devices.
[Adopt] PaaS over IaaS
There is plenty of projects where Azure and other cloud-based platforms offer PaaS services that can be easily and automatically configured and connected together (i.e. via Azure Resource Manager). They spare a lot of time on setup, platform maintenance, licencing… and streamline deployment allowing us (developers) to focus on development. They are usually easy to scale, and much cheaper than running virtual machines. They guarantee always up-to-date software. Although occasionally PaaS may force your software to be updated to meet standards of the new version of platform at a specified time, such planned updates are minor annoyance when compared to all advantages. So whenever running on-premise is not obligatory and the project is not particularly unusual with technical requirements, PaaS model is probably the way to go.
[Adopt] Azure Storage Queue + Web Jobs + SDK
There is several ways to do asynchronous processing in Azure. The simplest possible way is to use Azure Storage Queue, Azure WebJobs and Azure WebJobs SDK trio. When you have relatively small and simple application to develop and you already know Azure WebApps, this is the best option to offload heavy processing from the frontend. It is simple, mature and relatively cheap solution. You can start your project within hours with no friction, you can focus on solving business problems, and forget about infrastructure and boilerplate code. This model allows you to test it locally and do deployments very easy. SDK has intuitive API and can be easily extended. When simple queue is not enough for you, you can move to Azure Service Bus and still use the SDK.
[Assess] Azure Stack
It’s a hybrid cloud platform allowing companies to use a subset of the public Azure cloud's IaaS and PaaS features on-premise, in their organisation’s data centre. It’s an excellent solution for those institutions that are obliged by law to store data on-premise or for regions where Azure is not available i.e. Russia or China. The current version of Microsoft Azure Stack is a Technical Preview 3 and should be considered as a Proof of Concept. Azure Stack provides Azure-compatible features, which means that code can be developed and tested in the Azure Stack environment and after that it can be easily deployed in a standard Azure environment without any additional adaptations. Azure Stack allows to use many components from standard Azure such us: Azure Resource Manager, Virtual Machine, Azure App Service, Azure Storage (blob, table, queue), SQL database, Network Resource Provider (NRP) and Service Fabric. Finally, Azure Stack has some limitations - mainly supported hardware, its scalability and performance.
[Adopt] Azure Resource Manager (ARM) over Classic mode deployment
Since 2014, when Microsoft announced Azure Resource Manager (ARM) deployment model, it was clear that rather sooner than later ARM will become a default and preferred model for working with the Azure cloud resources. It provides several benefits, especially treating cloud resources as the self-contained, isolated groups with internal dependencies, deployed, secured and managed together is the most obvious one. Now it’s a good moment to start migrating ‘old’, classic-mode setups into ARM, as the adoption of ARM become mature and wide enough. There are still services supported only by classic mode, but in most cases (like VM (classic) or Cloud Services (classic)) they are considered as obsolete and you should use resources from Microsoft.Compute, Microsoft.Storage and Microsoft.Network when building your application’s infrastructure.
[Trial] Azure Bot Service and LUIS
Conversation-as-a-service is a new strategy for building modern user interfaces. Many companies have already embraced bots and integrated them into software and hardware products. There are a few major players developing frameworks for creating bot interfaces and Microsoft offers one of the most flexible ones. It allows you to incorporate the bot into your own software products and plug into the existing channels like Skype, Facebook messenger, or even more generic ones like webchat or e-mail. Best served with Language Understanding Intelligent Service (LUIS) - one of the Cognitive Services specialized for natural language processing.
[Trial] App Insight
It’s an Application Performance Management (APM) service allowing you to monitor any kind of applications including multi-platforms ones (.NET, Node.js and J2EE). It was designed to instrument and monitor applications to improve their performance and usability. It collects, and presents in an accessible way instrumentation sent by the application. The following information is monitored:
- Request rates, response times, and failure rates
- Page views and load performance – as reported by your users' browsers
- AJAX calls from web pages - rates, response times, and failure rates
- User and session counts
- Performance counters from your Windows or Linux server machines, such as CPU, memory, and network usage
- Custom diagnostic trace logs and events from the application
Application Insight provides a powerful analysis and search tools for raw data with many ways to explore monitored data. What do you think? Do you agree with us? Did we miss something? Let us know in the comments! Big thanks to: Kamil Buczek, Tomasz Fajks, Janusz Góral, Marcin Grzywa, Jacek Kolonko, Seweryn Kraczyński, Sebastian Lewandowski, Adam Łepkowski, Radosław Maziarka, Krzysztof Mościchowski, Adrian Mucha, Tomasz Saluszewski, Krzysztof Stanaszek, Grzegorz Strzelecki, Rafał Szkudlarek, Rafał Świerkot, Edward Weinert for contributing to this post.