Coding Focuses (OnMind Panorama)

Decoding informatics.
This text has technical implications, I hope it is of interest to you.

To clarify some essential notion regarding the ways or approaches related to computer programming, especially from the technical point of view of the interface, we will review some general concepts about desktop software as well as Web architecture and development for mobiles, and finally pose the path taken by OnMind in terms of our goal and hence the programming languages we use (Javascript.md) and Kotlin, and perhaps a little bit of other like ABCode).

Languages panorama for modern projects

If you are recently interested in software development, I hope this overview illustrates you to encourage you to start with a focused outlook. Let’s see an initial general overview.

Programming Language Technology (library, framework) Package Manager
Javascript NodeJS (server environment) npm (+ webpack)
" Riot (in browser) "
" ReactJS (in browser) "
" ReactNative (mobile) "
" Ionic (mobile and more) "
" Deno (server environment) (none)
Kotlin Vertx (on server) gradle, maven
" Jetpack Compose (android, desktop) "
" KMM (mobile: only logic) "
" KotlinJS (in browser) "
Python NumPy/Panda (Machine Learning) pip
" FastAPI (on server) "
Rust WebAssembly (in browser) cargo
" Actix (on server) "
Dart Flutter (mobile and more) pub
Go Fiber (on server) (none)
PHP Comet (on server) composer
Ruby Ruby on Rails (on server) gem
ABCode Plane programs (on server) (none)
.

We also added Typescript which, in principle, is a superset of Javascript and usually works as a substitute (compiling to Javascript) with the same technologies. In addition HTML5 that is a markup language that is combined with Javascript and CSS3 (for styles) in the browser, also with PHP in a different way (from the server). Dart/Flutter does not need HTML5 nor CSS3 and is made also for user interface (the visual aspect).

Among so many languages, it is necessary to mention Swift which is a language for developing applications on iOS and macOS systems that use Apple devices, as well as classic languages that are still popular, such as Java, C#, C++.

Libraries are normally available sets of programs (although you can make your own libraries). A package manager can manage programs available (libraries) by the community, this has been introduced thanks to the Internet (formerly it was the language manufacturer who mainly provided the libraries and there was no package manager).
See glossary

GUI, CLI y API

A simple way to start programming is from the command line (which is the base, in the Matrix). In relation to this the acronym CLI stands for Command Line Interface, which is when programs are made to run, for example, on the server directed to a skilled (or technical) role. On the other hand, when you want to start in a visual way at a user level, the acronym GUI refers to the Graphical User Interface. So the GUI refers to desktop or window screens, as well as screens of forms, the interface of a browser based application or the interface of a mobile application, generally related to the visual (often using the mouse, touch screen or other peripheral) and far from using a text command as in a CLI.

Perhaps the concept of GUI is more technical, sounds less or has evolved at present, currently being heard UI (generic and for web user interface) or UX in terms of design and enhanced user experience, but the principles remain in the background the same. As an antecedent, I think the distinction comes from what engineers did about it to move on to involving resource design experts, given that few engineers can have that graphic or similar ability, but in a project there is also the budget factor and a coherent vision of what you want to achieve. For practical purposes, in this text we can refer to the Graphical User Interface as GUI or simply UI.

On the other hand we find the term API, meaning Application Programming Interface, has been very well received when it comes to internet services, where the ideal is to establish a communication mechanism (API) to call application functions that could be used by other programs or services. Nowadays, it is common to hear technologies that use this concept (example: API-Rest, as well as a GraphQL API). A well-designed CLI is ultimately an API, or it can be related to this concept unless the CLI implies a lower level. Software could also be designed so that both the GUI and a CLI consume the same API as a base.

Desktop Software

Based on the above, desktop software basically refers to a GUI for the desktop, whether it’s a view, screens or windows, the interface that runs on the operating system (either Windows, macOS or Linux for the desktop). So if you think of the office package that is usually used with its different applications (Word Processor, Spreadsheet, Slide Presenter, etc.) it is the clearest example of a desktop software. As far as programming is concerned, it is common for the desktop program to be made for each operating system, unless you use some language or cross platform that the operating systems accept, for example, with Java or Python (although its appearance is different or simpler than other desktop programs). Another path is that of Progressive Web Applications (PWA) which involves developing in Web architecture (which we will already describe) and using a web visualization frame (WebView) for the application so that it operates as a desktop application and functions in the various operating systems, however Web development involves greater complexity and is an issue that we will discuss.

Client/Server Applications

In a practical sense, they could be seen as desktop applications that mainly involve data, where the term “client” is associated with the data, but which are connected to the mechanism that manages the data, which is generally found on a “server”, that is, the data would not be on the computer but on another machine within a network and the communication is direct (as when files are shared on a network) or at least generates the feeling as if everything was happening on the user’s computer when one part is not so (in reality they are two layers). In current developments it is less probable that this architecture will be found since when involving data in its place it is preferable to develop something that works through Internet, although the concept client/server could be translated in another way.

A little bit of Web Architecture

If we associate the word Web with technologies in the browser we usually think of the combination or trinomial HTML5 + CSS3 + Javascript. As a precedent, it is necessary to bear in mind that in the origins of the Internet what was done was to publish content or informative web pages, where mainly HTML and a little CSS were used. The most sophisticated pages incorporated the use of Javascript. The classic concept of publishing web pages with a web-hosting provider is still an applicable principle and is illustrated below.

On the other hand, when we talk about Web architecture we think of applications that are directly related to the Internet, or to its communication protocols even if it is something internal or local (also known as Intranet). In a conventional Web architecture (as will be illustrated in a chart below) at least 3 layers can be identified: the client or browser, the server-side logic (or middle layer) and the database (engine for managing and storing data). Between the browser and the server it is important to mention the web protocol for hypertext (http or https, which can be seen in the address bar of your browser) since HTML is used as a template and its companions (CSS for the visual style and Javascript for the logical, dynamic or functional aspect).

Basically, the complexity results in incorporating a specific communication element (http) as an intermediary as opposed to when you think of desktop programs (which becomes simpler without this type of intermediary). Given the above, following the notions of communication, a request must be initiated under a channel (or respective protocol) for a receiver to process it and return a result or response. In a conventional Web architecture the response is generally a HTML. The cycle and dynamics are repeated, what is sent are data packets and other packets are received with a type that becomes a response processable by the browser. At the end of the 90’s, the easiest way to program with this dynamic was using PHP and it became popular with web-hosting services, nowadays promoted by several tools for digital marketing, perhaps also due to the low cost of these services and for being mostly self-managed with small businesses in mind, although the next level of service (if we think about virtual machines or computer instances) is very close in costs and is directed to a computer infrastructure. In any case, such services today have a reduced cost, different is that you need to hire trained personnel to manage them. A good choice in the web-hosting scenario is Ruby language. On the other hand, Python also covers this aspect but currently you don’t find so many providers that allow you to use it in web-hosting, being PHP the main focus of that type of service. In fact, no mention has been made of Java or .Net because they do not work in this type of service, being oriented towards business infrastructure (from computer instances or a VPS - Virtual Private Server).

A conventional way of designing an application in PHP, Ruby or Python is through multiple pages (known now as MPA - Multiple Pages Application) that take the user step by step in an operation, where the developer practically tends to avoid the use of the trinomial HTML5 + CSS3 + Javascript by focusing on the modality offered by the language (eg. engine templates), and although this is still applicable most processes can be improved with the philosophy of one page per application (known as SPA - Single Page Application). The SPA have been possible thanks to the evolution of Javascript and the launch of recognized libraries such as React, Angular, Vue, and even less popular ones such as Preact and Riot (the one chosen for OnMind currently) that promote a fluid UI (even if you use a static resource you can render the page).

A modern Web architecture is also influenced by a new concept (the design of Web microservices), where data is returned with a notation or format (mainly JSON) instead of focusing on a template HTML, this implies that the visual component or client is enriched in its logic, hence the development of the client side takes force with the language Javascript, giving a twist to take care of the view or GUI dominating over HTML, when formerly it was used basically for simple validations or for some visual impact with animations. In 2014 there was a need to strengthen again this script language, which has been significantly updated since 2015 to respond to this trend. In fact, it is currently possible to run Javascript outside the browser thanks to server-side environments or technologies such as Node.js, Deno and GraalVM.

The concept of Web microservices (being properly focused and designed, preferably for infrastructure or at least virtual machines) can open up what is known as the Internet of Things (IoT) that would allow interaction with current machines or appliances. However, making a API of Web microservices implies even greater complexity (imagine that each component or table of a database becomes a microservice) without taking into account that the visual interface needs to be developed practically completely. So when the acronym PWA (Progressive Web Applications) was mentioned earlier and a Web application approached the visual and functional level of a desktop application, the road is long, where what must be measured is the efficiency in terms of achieving a code base (at least in high percentage) so that the maintenance is lower than in a conventional or native scheme. For example, if you make an application for internal management that works on Windows, macOS, iOS and Android sharing its code to a large extent is more efficient than having a team for each platform or that are maintained over time different versions separately and with different teams. If efficiency is measured in immediate terms, it can be both questionable and considerable depending on the case. More than something practical, the criterion should aim at the appropriate evaluating the specific variables of a company or project, or its objectives.

Speed (operations or connections per second) is another aspect to consider. For example, let’s say that one university receives enrollment with a platform made for an older version of PHP (the 5), while another university uses a classic Java technology that to be efficient requires a lot of computing infrastructure and abysmal investment. Both cases are questionable. In the case of PHP was admitted about 100 connections per second (combining it with Apache, which is a technology commonly found in web hosting) and in another scenario was improved significantly but in both scenarios reached the point where the system collapsed when students and / or their parents left the registration until the last moment. As long as these systems are not updated or modernized you will find a real case, even in state services. On the other hand, new technologies have faced the challenge of exceeding 10 thousand connections per second without requiring a millionaire investment (software helps to some degree). A decade ago, Node.js was a pioneer in this sense and this made that technologies with other languages improved their proposal, for example, you find interesting response times in last versions of PHP and recent unconventional technologies or libraries (such is the case of FastAPI for Python and so on).

In the world of Java you also find technologies such as Vertx that can exceed 100 thousand connections per second (depending on the implementation and infrastructure). Nowadays languages provide a more common way to develop web applications, however, in the case of Java it would be good just to illustrate in retrospect the classic architecture (Java Enterprise Edition) that has had welcome in companies since decades back.

Now you make applications for cloud computing (that involve infrastructure and is different from web-hosting). OnMind, for its part, has already travelled a path in this aspect, thinking precisely about the innovation needs that companies may have in this respect. This is why we have implemented our own architecture or scheme.

Mobile Development

In mobile software, the use of a ‘GUI’ for mobiles is highlighted, and given the commercial trend of mobile operating systems, it could be said that there are currently two marked paths, for Android and for iOS. What is sought with the development for mobiles is to take advantage of the characteristics of the devices, such as their camera, geolocator, notifications, etc… However, there are cases in which what is mainly required is to extend the internal management software without the need for specific mobile resources, or for a website to be seen as a mobile application. For this, we refer to the term ‘Hybrid Mobile Applications’, distinguishing from ‘Native’ by the type of integration that is not natural to the Android system or iOS, but uses an intermediate component (call framework for mobile, Cordova, or development under the component ‘WebView’ in both Android and iOS, that is, a way to integrate almost a browser to enable web developments: HTML5 + Javascript). Ionic Capacitor is a good example of this type of technology implementation.

If the case is the raised (conventional internal management software) hybrid applications currently give a favorable response time and unless fractions of seconds is a criterion and the budget is not a problem, may well open a development team specializing in native mobile applications. If what you want has nothing to do with management software, or is a specific application for mobile or clock or is a game, then native development is preferable. Google is currently promoting its ‘Flutter’ framework, which proposes a native development for both Android and iOS. While a hybrid mobile application generally uses Javascript, a pre-existing native with Android has been using the language Java or Kotlin, and for iOS the language Objective-C or Swift, with Flutter would be used Dart for both iOS and Android, even for the Web (still in beta), and stop using Javascript, HTML and CSS (that would be the proposal). Facebook for its part has had for years React Native that allows to program in Javascript and translate to native, although every feature of a device is not easy to cover, it might help as much using the framework Expo (about React Native). At least that’s the scenario at 2021.

Other Scenarios

As a panorama and general culture, given that new approaches and trends are emerging every day, other scenarios such as data analysis or machine learning and cryptomedas could be considered, where as a constant we find Python (as well as Java and others) above Javascript, which does not seem to be the most ideal for processing what is known in crypto currencies as blockchain (chain of blocks), although in that case is to note that Solidity (language used for the virtual machine Etherium - EVM) is precisely inspired by Javascript (but it would not be the same). On the other hand, if it is about games the Unity platform (which would correspond to the development of a specialized GUI) uses mainly C# (although exists Unreal for C++), and if it is about programming systems (the Matrix in depth) or microcontrollers it is most likely that C or C++ is required, and recently Rust (interesting language due to its interoperability with others like Javascript, using WebAssembly or Deno). A good choice in many cases is Go, a language created by Google.

FrontEnd, BackEnd and FullStack

With a good understanding and focusing on the Web architecture, these terms are summarized by relating FrontEnd with the GUI and BackEnd with a API of Web microservices or developments behind the Web layer, also known as the middle layer (the term BackEnd can even be used when dealing with database developments). Both FrontEnd and BackEnd are used to refer both to a category or concept of a technical component and to who deals with them, speaking of a BackEnd or FrontEnd developer as appropriate, while FullStack refers to a developer who covers both aspects (sometimes even DevOps, which we will see later), ultimately referring to an expert in an integral way, not necessarily specialized, can dominate one more than the other (or a pair).

DevOps

In a conventional way, is required to manage the infrastructure of a Web platform or database, someone that could receive a version to be installed being submitted by the development team or a developer. Currently there is evidence of a continuous deployment given the software cycle with versions released more frequently where it is required, for example, to involve a developer to automatize some administration tasks. However, a professional who deals with this facet is generally not an expert in administration or security, or if it is a resource that comes from the facet of administering servers may need to be involved as a developer of the Web platform, that without taking into account the aspect of validation or quality of the software to be installed (that should be automated by the development team).

There are positions on the term leaning towards a practice or methodology, however, understanding the above and being practical DevOps means development and operations which is oriented to automate the deployment of cloud applications. It could be seen as a field in which a system administrator with a mixed approach is evolving depending on the deployment or continuous delivery. If we go back to the first concepts, it would be very related to a CLI of a Web platform or to a tecnology with another approach, that of deployment or delivery (e.g.: docker, kubernetes).

What would a team look like?

Unless you make a tour or journey with the assimilated knowledge, as it has been my case since 2014 with OnMind, you could cover with certain scope the facets of FrontEnd, BackEnd, development for mobiles and the role of an engineer system administrator who applies practices of DevOps, besides having a strategy for the support and operation (including a commercial aspect). However, when it is a computer project that operates supported in a team, the roles increase. We will not address every role, simply in order to understand the impact of some IT facets we will illustrate below a team working on an ongoing project, as an example.

Project Manager, Commercial Promoter, Project Analyst, Technical Leader, Software Developer, Test & Documentation Analyst, Cloud System Administrator, Support & Maintenance Analyst (of the software), Support Staff (Functional Analyst or Agent, depending on the level of enterprise service)

The way of OnMind

We develop modern Web applications considering a certain digital experience for the user, basically oriented to data and the mobility factor (“first mobile”). However, for mobile development issues, since we focus on products that are generally for internal business management, it has been found convenient to follow a certain architecture (with Hybrid mobile applications using the ‘WebView’ component). In OnMind, for our nucleus, we basically use the Javascript and Kotlin languages, as an extension for certain characteristics we consider to introduce ABCode. This may suggest an opening in the path that has been taken, focusing the visual aspect with the use of Javascript and Web development (at least 2/3 of the code of our first version corresponds to Javascript).

Kotlin is a language that runs in the Java Virtual Machine (JVM), although it has features to cover the development FrontEnd, we use it for an additional layer in our own architecture (which we have called DAI - Data Adaptive Interface). This relates to the data and the BackEnd (the functional or business logic). It was intended to conserve experience, compatibility with a target market and advantages of the Java Virtual Machine (JVM) in the manufacture of business applications using a modern language instead of Java and perhaps replace JavaScript to unify the language, but the latter has proved unnecessary since in the course taken it has been favorable to conserve this language “script” of the browser and “Node.js” (technology that provides running Javascript for the server) being fundamental to orchestrate our modern platform. In this way, it can coexist a mixed environment technology providing a factor of innovation and possibilities for business application projects. In fact, Node.js and Kotlin are currently working on GraalVM (another JVM, which has also made possible our native version with the code written in Kotlin, optimizing the execution time).

It can be said that the path has led us to interoperability. Thus, instead of a single language, as was originally desired, several are used to a greater or lesser degree but in any case everything is oriented and orchestra with a unifying sense. In a simple analogy, Javascript would be like the English language in this part of the world, who is bilingual his second language would be Kotlin for another territory, and sometimes you can understand basic aspects of a third language or be polyglot. However, I think the priority may change over time.

With this antecedent for our first release in mind, OnMind’s software development fronts are as follows:

  1. FrontEnd Common (Web). Javascript (under Browser or Electron), in addition to HTML5 (+CSS3)
  2. FrontEnd Core Components (UI). Javascript, in addition to HTML5 (+CSS3)
  3. FrontEnd for Mobile. Javascript + Ionic-Capacitor (for Native development and a Web wrapper: WebView)
  4. BackEnd Common (Web). Javascript (under Node.js)
  5. BackEnd for Data. Kotlin (under JVM with Vert.x), in addition to SQL
  6. DevOps. Javascript, Kotlin (CLI oriented to Linux)
  7. Customer (others). For some enterprise customizations as specific extensions, ABCode could be considered, and if a project merits it, perhaps Typescript, in addition to Javascript and Kotlin (the latter for projects on the Java virtual machine - JVM).

You can see our Technical Data Sheet.

Understanding that the vision is already wide and a scope is important, managing to cover our needs with languages such as Javascript and Kotlin, even ABCode, if no other language has been mentioned in principle would be out of our radar, being open to someone else for a specific project that significantly merits another approach.

Simply put, it’s still FrontEnd and BackEnd (as well as DevOps) with approaches that help enrich and gain efficiency from what is built, with a method (such as OnMind Method) and some internal tool that would enable a team with different levels of experience,whether it corresponds to a beginner (practitioner, mainly for FrontEnd), a junior developer, perhaps a semi-senior level before senior, even come to a different approach (e.g. evangelist). Given that we mention roles, it is clear that there are different to that of software developer who should still have some understanding of the proposed scenario, such as: project manager, leader or architect, functional analyst, graphic designer, translator and documenter, quality assurance, computer security engineer, etc.

If a language is proposed to start a project as in our case, perhaps the most recommended language is Javascript (2015+, also known as ES6 onwards) being key to the FrontEnt at least Web-oriented, but this varies given the focus of the case and the preference of the team.


© 2021 by César Arcila