{"id":1438,"date":"2019-07-22T15:07:24","date_gmt":"2019-07-22T15:07:24","guid":{"rendered":"https:\/\/devexperts.com\/blog\/?p=1438"},"modified":"2023-01-04T10:56:29","modified_gmt":"2023-01-04T10:56:29","slug":"how-to-build-a-mobile-trading-app","status":"publish","type":"post","link":"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/","title":{"rendered":"How to Build a Mobile Trading App"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"h-our-4-keystones-of-mobile-app-development\">Our 4 Keystones of Mobile App Development<\/h2>\n\n\n\n<p>It\u2019s safe to say we\u2019ve done it all: our financial mobile development experience started from software for the now outdated BlackBerry and Pocket PC, alongside mobile web, which included time-worn WAP, and then we transitioned to iOS and Android development, settling on them for now. Here we will reflect upon these experiences which shaped our four keystones of mobile development and brought our software to the top of its game.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/\u0421\u043d\u0438\u043c\u043e\u043a-\u044d\u043a\u0440\u0430\u043d\u0430-2019-07-15-\u0432-17.20.26-1024x713.png\" alt=\"Examples of trading applications on PocketPC\" class=\"wp-image-1466\" width=\"512\" height=\"357\" srcset=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/\u0421\u043d\u0438\u043c\u043e\u043a-\u044d\u043a\u0440\u0430\u043d\u0430-2019-07-15-\u0432-17.20.26.png 1024w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/\u0421\u043d\u0438\u043c\u043e\u043a-\u044d\u043a\u0440\u0430\u043d\u0430-2019-07-15-\u0432-17.20.26-300x209.png 300w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/\u0421\u043d\u0438\u043c\u043e\u043a-\u044d\u043a\u0440\u0430\u043d\u0430-2019-07-15-\u0432-17.20.26-768x535.png 768w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/\u0421\u043d\u0438\u043c\u043e\u043a-\u044d\u043a\u0440\u0430\u043d\u0430-2019-07-15-\u0432-17.20.26-320x223.png 320w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/\u0421\u043d\u0438\u043c\u043e\u043a-\u044d\u043a\u0440\u0430\u043d\u0430-2019-07-15-\u0432-17.20.26-382x266.png 382w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/\u0421\u043d\u0438\u043c\u043e\u043a-\u044d\u043a\u0440\u0430\u043d\u0430-2019-07-15-\u0432-17.20.26-578x402.png 578w\" sizes=\"auto, (max-width: 959px) calc(100vw - 30px), 870px\" \/><figcaption>Trading software for PocketPC<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-1st-keystone-code-reuse-and-its-perks\"> 1<sup>st<\/sup> Keystone: Code Reuse and its Perks<\/h3>\n\n\n\n<p>Today, most mobile apps are available on multiple platforms, challenging developers and compelling them to cut the amount of codebases. The less codebases we have, the cheaper and faster it is to support the whole solution and update it with new functions. We want to reuse one general code as much as possible.<\/p>\n\n\n\n<p>One of the most popular answers to this challenge is having one codebase and adapting it with a cross-platform UI engine. There are two common methods for accomplishing this goal.<\/p>\n\n\n\n<p>The first one is developing a hybrid app. In this method, base material for a \u201cnative\u201d application is a website\u2019s mobile version, which is inserted into a platform native framework to imitate the native code. There are dozens of hybrid frameworks available, the most notable ones are PhoneGap, Ionic, Framework 7, and Mobile Angular UI.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4897@2x.png\" alt=\"hybrid frameworks - PhoneGap, Ionic, Framework 7, Mobile Angular UI\" class=\"wp-image-1468\" width=\"367\" height=\"57\" srcset=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4897@2x.png 489w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4897@2x-300x47.png 300w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4897@2x-320x50.png 320w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4897@2x-382x59.png 382w\" sizes=\"auto, (max-width: 959px) calc(100vw - 30px), 870px\" \/><\/figure>\n<\/div>\n\n\n<p>The second method is to use full-fledged cross-platform frameworks, such as React Native, Xamarin, and Flutter. Such frameworks are more native than those used in the first method, each of them requires a code in a specific language (JavaScript, C#, Dart, etc.) inserted into a framework that generates a real native code for supported mobile platforms.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4898@2x.png\" alt=\"full-fledged cross-platform frameworks - React Native, Xamarin, Flutter\" class=\"wp-image-1469\" width=\"403\" height=\"34\" srcset=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4898@2x.png 537w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4898@2x-300x25.png 300w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4898@2x-320x27.png 320w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4898@2x-382x32.png 382w\" sizes=\"auto, (max-width: 959px) calc(100vw - 30px), 870px\" \/><\/figure>\n<\/div>\n\n\n<p>Unfortunately, these methods for reusing code have several common issues specific to the technology, and we had a chance to see them for <g class=\"gr_ gr_5 gr-alert gr_gramm gr_inline_cards gr_run_anim Punctuation only-del replaceWithoutSep\" id=\"5\" data-gr-id=\"5\">ourselves,<\/g> because at some point in the past we have created our own similar framework. We don\u2019t use it now, but it gave us a better insight into frameworks from the developer\u2019s side.<\/p>\n\n\n\n<p>The stumbling point when using frameworks is a drastic difference in visual and behavioral aspects of mobile platforms: design languages, navigation (e.g. back button in Android and lack of it in iOS), interaction, and animation. Applying them makes applications look unfamiliar and broken. These frameworks give us very slow, unstable and hard to support results due to required integration with <g class=\"gr_ gr_8 gr-alert gr_gramm gr_inline_cards gr_run_anim Grammar only-del replaceWithoutSep\" id=\"8\" data-gr-id=\"8\">a native<\/g> code. A lot of large popular complex applications were written with them, but <g class=\"gr_ gr_10 gr-alert gr_gramm gr_inline_cards gr_run_anim Punctuation only-ins replaceWithoutSep\" id=\"10\" data-gr-id=\"10\">eventually<\/g> they ended up developing native UIs. A great case in point is Airbnb, which advocated for React Native from 2016 till 2018. It worked fine for them but in reality a small percentage of their app was React Native, and eventually they <a href=\"https:\/\/medium.com\/airbnb-engineering\/sunsetting-react-native-1868ba28e30a\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">realized<\/a> that they \u201cwound up supporting code on three platforms instead of two and were ultimately unable to meet their original goals, having a number of technical and organizational challenges\u201d that they were unable to overcome.<\/p>\n\n\n\n<p>Another method used in mobile development is a thin client. Here we minimize <g class=\"gr_ gr_8 gr-alert gr_gramm gr_inline_cards gr_run_anim Grammar only-ins replaceWithoutSep\" id=\"8\" data-gr-id=\"8\">client\u2019s<\/g> logic, but in most <g class=\"gr_ gr_9 gr-alert gr_gramm gr_inline_cards gr_run_anim Punctuation only-ins replaceWithoutSep\" id=\"9\" data-gr-id=\"9\">cases<\/g> UI reaction speed becomes suboptimal, because every input goes to a server, and UI reacts only after a network response. This process makes interactions very slow and unresponsive, leading to very poor user experience with an impression of a lagging application. At best, it is inconvenient, and at worst, an application could be unusable.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4766.png\" alt=\"Scheme of server-side interactive calculations\" class=\"wp-image-1472\" width=\"508\" height=\"272\" srcset=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4766.png 677w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4766-300x160.png 300w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4766-320x171.png 320w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4766-382x204.png 382w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4766-578x309.png 578w\" sizes=\"auto, (max-width: 959px) calc(100vw - 30px), 870px\" \/><\/figure>\n<\/div>\n\n\n<p>At some point, we researched ways to reuse the code without the methods described above, because we faced the challenge of making a mobile version of one of our desktop products, and these ways could not cope with the task. That\u2019s how we came up with the idea of code translation without reusing UI, the part responsible for the platform\u2019s specifics. Instead, we apply <g class=\"gr_ gr_17 gr-alert gr_gramm gr_inline_cards gr_run_anim Grammar only-ins replaceWithoutSep\" id=\"17\" data-gr-id=\"17\">translation<\/g> to the code responsible for logic, taking the best from both approaches presented above. We used to apply our own in-house solution <g class=\"gr_ gr_13 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace\" id=\"13\" data-gr-id=\"13\">dxByte<\/g>. It solved a basic task of translating Java code to be Objective-C suitable for <g class=\"gr_ gr_18 gr-alert gr_gramm gr_inline_cards gr_run_anim Grammar only-del replaceWithoutSep\" id=\"18\" data-gr-id=\"18\">the further<\/g> use without additional adjustments. Our translator may seem to be just a kludge, but we are not the only company that came up with such a solution. Now we use, as some other companies do, Google\u2019s solution j2Objc, which was published in 2012 and became very powerful through the years. Now it\u2019s a tool with almost full JRE inside, 1.8 Java language level support, default methods, and stream API. The current version stands in stark contrast to its first almost unusable release. Modern code translation tools open ways to use more complex models. Who could have ever imagined that someday we would be able to translate a desktop program codebase and reuse it in a mobile <g class=\"gr_ gr_22 gr-alert gr_gramm gr_inline_cards gr_run_anim Punctuation multiReplace\" id=\"22\" data-gr-id=\"22\">application.<\/g> <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/1.png\" alt=\"desktop trading platform\" class=\"wp-image-1473\" width=\"525\" height=\"416\" srcset=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/1.png 700w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/1-300x237.png 300w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/1-320x253.png 320w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/1-382x302.png 382w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/1-578x457.png 578w\" sizes=\"auto, (max-width: 959px) calc(100vw - 30px), 870px\" \/><figcaption>Initial desktop application and the result of its code reuse for mobile platforms<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Lots of software developers actively seek solutions for code reuse among platforms, and there are definitely other approaches besides j2Objc and cross-platform frameworks. After Kotlin became overwhelmingly popular, especially in mobile development, its authors from JetBrains went even further by proposing a Kotlin\/Native instrument, which applies modern language code to a server-side, mobile app, and web. This kind of technology is not perfect yet &#8211; it has some adverse beginnings, but there is a great chance that soon enough they will be adequately stable for a wider audience. <\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow\"><p>Considering all methods of cross-platform development, we advocate for reusing the code as much as possible via code translation and multi-platform languages, keeping in mind that all kinds of hybrid approaches do not work in the long run for <g class=\"gr_ gr_3 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling multiReplace\" id=\"3\" data-gr-id=\"3\">high quality<\/g> apps. <\/p><\/blockquote>\n\n\n\n<p>If you aim for a complex quality app, it is more likely that sooner or later you will have to rewrite it with <g class=\"gr_ gr_4 gr-alert gr_gramm gr_inline_cards gr_run_anim Grammar only-del replaceWithoutSep\" id=\"4\" data-gr-id=\"4\">a native<\/g> code, as Airbnb recently concluded. To be fair, some global companies still manage their development processes with these approaches, but they are an exception rather than a rule.<\/p>\n\n\n\n<p>In the mobile world, there is a competition defined by user requirements and needs. Mobile apps must be familiar, easy-to-use, and responsive: users prefer working with comfortable <g class=\"gr_ gr_4 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling multiReplace\" id=\"4\" data-gr-id=\"4\">behaviour<\/g> patterns and with the speed of response that matches the speed of actions, which brings us to the next keystone.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-2nd-keystone-networking-in-mobile-development-we-need-to-find-the-right-solution\"> 2<sup>nd<\/sup> Keystone: Networking in Mobile Development \u2014 We Need to Find the Right Solution <\/h3>\n\n\n\n<p>Networking is a tricky issue due to frequently slow and unreliable connections to servers. In the perfect world of mobile networking, an app sends a request to a remote service and gets a response \u2013 it is as simple as that. In the real world, an app makes several request attempts to a remote service, and often not all of these attempts are successful. So when it comes to working on interactions with a server, a majority of developers choose either the easiest and most direct solution, or some industry standard. It\u2019s not always for the better, particularly when an application works with a stream of rapidly changing data (market data, to be precise). It is critical for an application to display data updates quickly and often. Moreover, it\u2019s unacceptable for an application with dynamic data to display a message \u201cPlease try again\u201d when the loading of data is interrupted, which is quite common in the mobile world. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4804.png\" alt=\"examples of connections to servers\" class=\"wp-image-1476\" width=\"521\" height=\"277\" srcset=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4804.png 695w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4804-300x159.png 300w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4804-320x170.png 320w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4804-382x203.png 382w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4804-578x307.png 578w\" sizes=\"auto, (max-width: 959px) calc(100vw - 30px), 870px\" \/><\/figure>\n<\/div>\n\n\n<p>In our scope, these challenges are very real, and we need to be responsible for them. If we analyze a particular use case and data set, we can learn to transfer them cost-effectively or to make connectivity breaks invisible to a user. Moreover, we want to make responsible transport code for solutions of these issues, and the code of the application itself would work at the level of \u201csend data &#8211; receive data\u201d without manually solving each case. We haven\u2019t considered text protocols as a transport method because we opt for speedy and frequent deliveries. So we developed our own transport framework MOBTR. It is a binary protocol that considers all known specifics of our data. We were able to optimize work with the network exactly for our special case currently used in the development of trading frontends. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4818.png\" alt=\"MOBTR framework\" class=\"wp-image-1477\" width=\"551\" height=\"147\" srcset=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4818.png 735w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4818-300x80.png 300w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4818-320x85.png 320w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4818-382x102.png 382w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Group-4818-578x154.png 578w\" sizes=\"auto, (max-width: 959px) calc(100vw - 30px), 870px\" \/><\/figure>\n<\/div>\n\n\n<p>Our solution doesn\u2019t necessarily suit everybody and doesn\u2019t have to be in demand by everybody. It\u2019s about conducting such analysis and choosing relevant instruments. <\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow\"><p>Optimization of data traffic helps a lot in terms of slow and unstable connections. We suggest optimizing this process by transferring only delta of numbers (obtained through subtraction). Trading apps are convenient in that line. Quotes don\u2019t drastically change, usually only one or two of their decimals do, so subtraction works perfectly for optimization, because we need to transfer smaller values. <\/p><\/blockquote>\n\n\n\n<p>Optimizing data transfer for mobile is not a one-fits-all approach. In case of frequent data updates, go binary. If you need more performance, go data aware, find a way to minimize the transferred values. In case of specific requirements, go custom and develop or adapt a transport framework according to them.<\/p>\n\n\n\n<p>There are two great examples of messengers that used different approaches: Telegram and Whatsapp. Whatsapp chose a usual way for startups: it was developed to work with a standard protocol, and its performance is close to <g class=\"gr_ gr_7 gr-alert gr_gramm gr_inline_cards gr_run_anim Punctuation only-del replaceWithoutSep\" id=\"7\" data-gr-id=\"7\">none,<\/g> when the connection is weak. Telegram is <g class=\"gr_ gr_8 gr-alert gr_gramm gr_inline_cards gr_run_anim Punctuation only-del replaceWithoutSep\" id=\"8\" data-gr-id=\"8\">faster,<\/g> because it has its own binary protocol specific for its data that performs well in bad network conditions.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-3d-keystone-staying-on-a-bleeding-edge\"> 3<sup>d<\/sup> Keystone: Staying on a B<g class=\"gr_ gr_19 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace\" id=\"19\" data-gr-id=\"19\">leeding<\/g> Edge <\/h3>\n\n\n\n<p> Things tend to change. Devices change a lot, and they do it fast. Today mobile phones can do what computers couldn\u2019t 10 years ago, and smartwatches can do what phones couldn\u2019t 5 years ago. Staying on the bleeding edge with such speedy changes is hard, and some choose the wrong way to act (or fail to act at all). Here are two dud approaches, if you don\u2019t want to keep ahead of the game.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Keeping things old school. It\u2019s easy and stable, which makes it almost impossible to go wrong, except you get no evolution at all. Development teams utilizing this method produce apps with zero response to <g class=\"gr_ gr_11 gr-alert gr_gramm gr_inline_cards gr_run_anim Grammar only-ins replaceWithoutSep\" id=\"11\" data-gr-id=\"11\">environment<\/g> and no room for growth. On top of that, they spend more time on maintenance than anyone in the industry. <\/li><li>Being modern and using all the frameworks on GitHub! You will spend a nice long time making it all work together, managing your dependencies, and optimizing the binary size. <\/li><\/ol>\n\n\n\n<p>Before doing all that, just watch The Silver Bullet Syndrome by Hadi Hariri to make things easier. Spoiler alert: there is no silver bullet in software development, but there are approaches that will make things work in terms of staying on the bleeding edge: <\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Don\u2019t drag your feet. Somebody will outrun you and make it better and faster. <\/li><li>Don\u2019t rush. We can drown in <g class=\"gr_ gr_8 gr-alert gr_gramm gr_inline_cards gr_run_anim Grammar only-ins replaceWithoutSep\" id=\"8\" data-gr-id=\"8\">latest<\/g> trends, and it will make the code more complex, and its development will be harder. At the same <g class=\"gr_ gr_9 gr-alert gr_gramm gr_inline_cards gr_run_anim Punctuation only-ins replaceWithoutSep\" id=\"9\" data-gr-id=\"9\">time<\/g> these modernization efforts don\u2019t pay off. <\/li><\/ol>\n\n\n\n<p>What should we do? We need to find a balance. We need to track what\u2019s going on with the technology and experiment accordingly. <\/p>\n\n\n\n<p>We also need to introduce something modern to our solutions only when we have answers to the following questions: <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>What does it bring to this particular project?<\/li><li>What will it cost us?<\/li><\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow\"><p>A common mistake is to search for <g class=\"gr_ gr_4 gr-alert gr_gramm gr_inline_cards gr_run_anim Grammar only-ins replaceWithoutSep\" id=\"4\" data-gr-id=\"4\">solution<\/g> in an instrument. In most cases, it is not about programming language and not an item in a library (although it happens sometimes), but in the code itself, its architecture <\/p><\/blockquote>\n\n\n\n<p>Gradually we actualize the code by applying everything that can be useful. At the same time we move evolutionary, not revolutionary: we\u2019re not rushing to rewrite all applications to a new language from scratch as soon as it starts getting popular.<\/p>\n\n\n\n<p>For example, we use the latest versions of j2objc, Swift, and Kotlin in our work, where it\u2019s relevant and doesn\u2019t ruin everything. <g class=\"gr_ gr_8 gr-alert gr_gramm gr_inline_cards gr_run_anim Punctuation only-ins replaceWithoutSep\" id=\"8\" data-gr-id=\"8\">Meanwhile<\/g> we rewrote our transport protocol MOBTR and saved all good ideas of an old version that are still relevant. Years of feedback converted our framework into a better tool, yet it stays a cross-platform mobile data transport framework, it is still aimed at mobile development, and it is still an efficient, compact, and ready-to-use solution. This is one more lesson we\u2019ve learned through our mobile development experience: aim for evolution, not revolution. Do not rush, do not drag, most often the tool is not the problem, the code is.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/\u0421\u043d\u0438\u043c\u043e\u043a-\u044d\u043a\u0440\u0430\u043d\u0430-2019-07-15-\u0432-17.20.52-1024x918.png\" alt=\"User interface of a mobile financial application\" class=\"wp-image-1478\" width=\"512\" height=\"459\" srcset=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/\u0421\u043d\u0438\u043c\u043e\u043a-\u044d\u043a\u0440\u0430\u043d\u0430-2019-07-15-\u0432-17.20.52.png 1024w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/\u0421\u043d\u0438\u043c\u043e\u043a-\u044d\u043a\u0440\u0430\u043d\u0430-2019-07-15-\u0432-17.20.52-300x269.png 300w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/\u0421\u043d\u0438\u043c\u043e\u043a-\u044d\u043a\u0440\u0430\u043d\u0430-2019-07-15-\u0432-17.20.52-768x689.png 768w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/\u0421\u043d\u0438\u043c\u043e\u043a-\u044d\u043a\u0440\u0430\u043d\u0430-2019-07-15-\u0432-17.20.52-320x287.png 320w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/\u0421\u043d\u0438\u043c\u043e\u043a-\u044d\u043a\u0440\u0430\u043d\u0430-2019-07-15-\u0432-17.20.52-382x342.png 382w, https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/\u0421\u043d\u0438\u043c\u043e\u043a-\u044d\u043a\u0440\u0430\u043d\u0430-2019-07-15-\u0432-17.20.52-578x518.png 578w\" sizes=\"auto, (max-width: 959px) calc(100vw - 30px), 870px\" \/><figcaption>Award-winning UI developed by Devexperts<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-4th-keystone-no-f5-in-mobile-development\">4<sup>th<\/sup> Keystone: No F5 in Mobile Development <\/h3>\n\n\n\n<p>It\u2019s an important feature of mobile development that is usually omitted. In web development, you can change the code, then refresh a page, and a client will get the newest version.<\/p>\n\n\n\n<p>It doesn\u2019t work this way with mobile applications. There is no physical possibility to remove the code of an installed application. You can forbid an application to connect to your server, but it\u2019s beyond the borderline of developers\u2019 decency. That\u2019s why we need to understand that the written client code can live a long life and we must develop its best version possible.<\/p>\n\n\n\n<p>What should we do? We should pay particular attention to client-side code and think about backward compatibility. <\/p>\n\n\n\n<p>Down the line, our years of mobile development have shaped four keystones that optimize it to the max:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Reusing code as much as possible <\/li><li>Analyzing the transmitted data and finding a suitable solution<\/li><li>Avoiding going too slow and breaking the speed of light at the same time<\/li><li>There is no F5 in mobile: once written, the client-side code is here to stay <\/li><\/ul>\n\n\n\n<p><strong>How do you deal with the code reuse challenges? <br>What methods of cross-platform development do you deem fit for financial software?<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Our 4 Keystones of Mobile App Development It\u2019s safe to say we\u2019ve done it all: our financial mobile development experience &hellip; <\/p>\n","protected":false},"author":39,"featured_media":1487,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2020],"tags":[36,11,34],"class_list":["post-1438","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fintech","tag-development","tag-financial-software","tag-mobile"],"acf":{"nifty_post_card_image":4601,"nifty_post_card_index_big":"","nifty_post_inner_image":"","nifty_post_card_banner":""},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How to Build a Mobile Trading App - Devexperts Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Build a Mobile Trading App\" \/>\n<meta property=\"og:description\" content=\"Our 4 Keystones of Mobile App Development It\u2019s safe to say we\u2019ve done it all: our financial mobile development experience &hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/\" \/>\n<meta property=\"og:site_name\" content=\"Devexperts Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/devexperts\/\" \/>\n<meta property=\"article:published_time\" content=\"2019-07-22T15:07:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-01-04T10:56:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Build-mobile-trading-app.png\" \/>\n\t<meta property=\"og:image:width\" content=\"3840\" \/>\n\t<meta property=\"og:image:height\" content=\"700\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@devexperts\" \/>\n<meta name=\"twitter:site\" content=\"@devexperts\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/\"},\"headline\":\"How to Build a Mobile Trading App\",\"datePublished\":\"2019-07-22T15:07:24+00:00\",\"dateModified\":\"2023-01-04T10:56:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/\"},\"wordCount\":2281,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/devexperts.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Build-mobile-trading-app.png\",\"keywords\":[\"development\",\"financial software\",\"mobile\"],\"articleSection\":[\"Fintech\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/\",\"url\":\"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/\",\"name\":\"How to Build a Mobile Trading App - Devexperts Blog\",\"isPartOf\":{\"@id\":\"https:\/\/devexperts.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Build-mobile-trading-app.png\",\"datePublished\":\"2019-07-22T15:07:24+00:00\",\"dateModified\":\"2023-01-04T10:56:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#primaryimage\",\"url\":\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Build-mobile-trading-app.png\",\"contentUrl\":\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Build-mobile-trading-app.png\",\"width\":3840,\"height\":700,\"caption\":\"Developing a mobile trading app\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devexperts.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Build a Mobile Trading App\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devexperts.com\/blog\/#website\",\"url\":\"https:\/\/devexperts.com\/blog\/\",\"name\":\"Devexperts Blog\",\"description\":\"We make complex finance ideas on technology, innovation and business simple\",\"publisher\":{\"@id\":\"https:\/\/devexperts.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devexperts.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/devexperts.com\/blog\/#organization\",\"name\":\"Devexperts LLC\",\"url\":\"https:\/\/devexperts.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/devexperts.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/08\/DX-logo.png\",\"contentUrl\":\"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/08\/DX-logo.png\",\"width\":167,\"height\":30,\"caption\":\"Devexperts LLC\"},\"image\":{\"@id\":\"https:\/\/devexperts.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/devexperts\/\",\"https:\/\/x.com\/devexperts\",\"https:\/\/www.linkedin.com\/company\/devexperts\",\"https:\/\/www.youtube.com\/channel\/UCF3FRmes2KrcVsTXQ1aAB5w\/featured\"]}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to Build a Mobile Trading App - Devexperts Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/","og_locale":"en_US","og_type":"article","og_title":"How to Build a Mobile Trading App","og_description":"Our 4 Keystones of Mobile App Development It\u2019s safe to say we\u2019ve done it all: our financial mobile development experience &hellip;","og_url":"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/","og_site_name":"Devexperts Blog","article_publisher":"https:\/\/www.facebook.com\/devexperts\/","article_published_time":"2019-07-22T15:07:24+00:00","article_modified_time":"2023-01-04T10:56:29+00:00","og_image":[{"width":3840,"height":700,"url":"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Build-mobile-trading-app.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_creator":"@devexperts","twitter_site":"@devexperts","twitter_misc":{"Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#article","isPartOf":{"@id":"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/"},"headline":"How to Build a Mobile Trading App","datePublished":"2019-07-22T15:07:24+00:00","dateModified":"2023-01-04T10:56:29+00:00","mainEntityOfPage":{"@id":"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/"},"wordCount":2281,"commentCount":0,"publisher":{"@id":"https:\/\/devexperts.com\/blog\/#organization"},"image":{"@id":"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#primaryimage"},"thumbnailUrl":"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Build-mobile-trading-app.png","keywords":["development","financial software","mobile"],"articleSection":["Fintech"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/","url":"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/","name":"How to Build a Mobile Trading App - Devexperts Blog","isPartOf":{"@id":"https:\/\/devexperts.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#primaryimage"},"image":{"@id":"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#primaryimage"},"thumbnailUrl":"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Build-mobile-trading-app.png","datePublished":"2019-07-22T15:07:24+00:00","dateModified":"2023-01-04T10:56:29+00:00","breadcrumb":{"@id":"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#primaryimage","url":"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Build-mobile-trading-app.png","contentUrl":"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/07\/Build-mobile-trading-app.png","width":3840,"height":700,"caption":"Developing a mobile trading app"},{"@type":"BreadcrumbList","@id":"https:\/\/devexperts.com\/blog\/how-to-build-a-mobile-trading-app\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devexperts.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Build a Mobile Trading App"}]},{"@type":"WebSite","@id":"https:\/\/devexperts.com\/blog\/#website","url":"https:\/\/devexperts.com\/blog\/","name":"Devexperts Blog","description":"We make complex finance ideas on technology, innovation and business simple","publisher":{"@id":"https:\/\/devexperts.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devexperts.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/devexperts.com\/blog\/#organization","name":"Devexperts LLC","url":"https:\/\/devexperts.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/devexperts.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/08\/DX-logo.png","contentUrl":"https:\/\/devexperts.com\/blog\/app\/uploads\/2019\/08\/DX-logo.png","width":167,"height":30,"caption":"Devexperts LLC"},"image":{"@id":"https:\/\/devexperts.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/devexperts\/","https:\/\/x.com\/devexperts","https:\/\/www.linkedin.com\/company\/devexperts","https:\/\/www.youtube.com\/channel\/UCF3FRmes2KrcVsTXQ1aAB5w\/featured"]}]}},"_links":{"self":[{"href":"https:\/\/devexperts.com\/blog\/wp-json\/wp\/v2\/posts\/1438","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devexperts.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devexperts.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devexperts.com\/blog\/wp-json\/wp\/v2\/users\/39"}],"replies":[{"embeddable":true,"href":"https:\/\/devexperts.com\/blog\/wp-json\/wp\/v2\/comments?post=1438"}],"version-history":[{"count":15,"href":"https:\/\/devexperts.com\/blog\/wp-json\/wp\/v2\/posts\/1438\/revisions"}],"predecessor-version":[{"id":5700,"href":"https:\/\/devexperts.com\/blog\/wp-json\/wp\/v2\/posts\/1438\/revisions\/5700"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devexperts.com\/blog\/wp-json\/wp\/v2\/media\/1487"}],"wp:attachment":[{"href":"https:\/\/devexperts.com\/blog\/wp-json\/wp\/v2\/media?parent=1438"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devexperts.com\/blog\/wp-json\/wp\/v2\/categories?post=1438"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devexperts.com\/blog\/wp-json\/wp\/v2\/tags?post=1438"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}