<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Alis Exchange Memos]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>https://memos.alisx.com/</link><image><url>https://memos.alisx.com/favicon.png</url><title>Alis Exchange Memos</title><link>https://memos.alisx.com/</link></image><generator>Ghost 5.25</generator><lastBuildDate>Wed, 29 Apr 2026 19:17:44 GMT</lastBuildDate><atom:link href="https://memos.alisx.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Define, Build, Deploy: The Essential Enablers of Permission-less Innovation]]></title><description><![CDATA[A powerful framework enabling large-scale permission-less innovation. This process lays the foundation for any solution that you can dream of.]]></description><link>https://memos.alisx.com/define-build-deploy-the-essential-enablers-of-permissionless-innovation/</link><guid isPermaLink="false">643912cfcb22f40001ce62f2</guid><dc:creator><![CDATA[James Spanjaard]]></dc:creator><pubDate>Fri, 21 Apr 2023 11:36:31 GMT</pubDate><media:content url="https://storage.googleapis.com/files.memos.alisx.com/2023/04/2fe30a3ae9e75d08.png" medium="image"/><content:encoded><![CDATA[<img src="https://storage.googleapis.com/files.memos.alisx.com/2023/04/2fe30a3ae9e75d08.png" alt="Define, Build, Deploy: The Essential Enablers of Permission-less Innovation"><p>The &quot;Define, Build, Deploy&quot; epithet has become something of a meme within the Build Community. Making a coffee? &quot;Define, Build, Deploy.&quot; Whipping up some scrambled eggs on a Saturday morning? &quot;Define, Build, Deploy.&quot; Need to file your taxes? &quot;Define begrudgingly. Build carefully. Deploy prayerfully.&quot;</p><p>However, the &quot;D-B-D&quot; cycle is not something we take lightly. The framework embeds years of hard-earned experience learning how to enable permission-less innovation at scale. The &quot;Define, Build, Deploy&quot; ethos is core to how we build and how we&apos;ve designed the Alis Build platform to empower other builders because we&apos;ve seen it work.</p><p>So, what does Define, Build, Deploy mean? It&apos;s very simple to understand.</p><p><strong>Define</strong></p><p>The first step is to write the &quot;innovation contract.&quot; Starting with definitions of objects, request-response methods, and architecture forces all the hard work of &quot;what are we actually trying to achieve&quot; upfront. &quot;Problem. Process. Too Slow. Software. Solve. Go,&quot; a senior manager will breathlessly exclaim. What&apos;s the problem? What are the resource objects we want to use to model this process? Where can we simplify? What are the attributes we care about? How will information and state flow and change?</p><p>The magic of the Alis Build Platform is how seamlessly it enables a productive conversation about root problems and how to name things amongst the stakeholders of an innovation process. Grounding innovation in this debate and discussion directly translates into its contract (i.e., API schema) with the outside world. This prevents &quot;wild west&#x201D; innovation (i.e., anything goes) that causes chaos and instead grounds the innovator in the context of the constituents they are trying to serve.</p><p><strong>Build</strong></p><p>Actually, know what you are trying to achieve? Great, let&apos;s get building. The second biggest overhead to permission-less innovation is the startup costs of starting to write the code. Unless you spend 97% of your day writing software, traditional workflows for environment setup, project initialisation, and finding the right tutorial online, &#x201C;how do I write a service in Go to parse Excel attachments sent via email&quot; is nausea-inducing. Distributing the innovation process to the periphery of a technical organisation requires a great platform that eliminates all those little frictions that make it so challenging to write a single line of code. Running println (&quot;hello world&quot;) shouldn&apos;t feel like a herculean achievement. Alis Build Platform makes this easy.</p><p>Everyone remembers the joy of writing that first line of code, watching it run, and viewing the displayed output. Wielding the power of creating with numbers, letters, and symbols is addictive. Building with Alis Exchange restores the magic of creating and provides the distraction-free environment a developer needs to engage with real-world problems. Reality check: Will my code play nice with everyone else&apos;s code in the organisation? Luckily, that doesn&apos;t have to be a concern either, with ready-to-go CI/CD pipelines that give you near-instantaneous feedback.</p><p><strong>Deploy</strong></p><p>The amazing but all too infuriating characteristic of code (i.e., the beautiful business logic you&apos;ve just written using all the exquisite definitions you crafted) is that you need to put it somewhere. More precisely, you need it to run somewhere. And you&apos;d really like that somewhere not to be &quot;I manually orchestrate 300 scripts on my local machine.&quot;</p><p>Because this is 2023, you want this on &quot;The Cloud&quot;. But because this is 2023, you probably need other cloud services to support your code, such as a database to store data, a messaging queue or a networking configuration. And because this is 2023, you definitely, definitely don&apos;t want to worry about security when you do all of this. Getting all these things done correctly is super intricate. Getting them done correctly so that you&apos;re sure that a nefarious actor isn&apos;t going to exploit your corporate Google Cloud project to mine Bitcoin can be even more intricate. &quot;Wild West&quot; innovation is why IT administrators have therapists.</p><p>The Alis Build Platform takes care of the intricate details of deployment, so you don&apos;t have to. With Alis Build, you can deploy your code to the cloud with a few simple clicks, and we take care of the rest. We ensure that your code is deployed in a secure environment that meets all relevant compliance requirements and has access to all the cloud services it needs to function. We also provide you with tools for monitoring and scaling your application so that you can ensure that it is always running smoothly and meeting the needs of your users.</p><p>The Define, Build, Deploy framework is powerful for enabling large-scale permission-less innovation. With this process, we have laid a solid foundation for any solution that you can dream of. By following these three simple steps, you can ensure that your innovation process is grounded in a clear understanding of the problem you are trying to solve, that it is built on a solid foundation of code that is easy to write and maintain, and that it is deployed in a secure and scalable environment.</p>]]></content:encoded></item><item><title><![CDATA[Tackling Integration Challenges: Centralised Ontology vs. Proto-Based Service-Oriented Architecture]]></title><description><![CDATA[<p>There are only two problems in enterprise software: integration and the next integration.</p><p>Data about customers, transactions, locations, assets, processes, and service offerings are scattered across various business units, databases, and instances of internal and external applications. This fragmentation poses a challenge when other systems, processes, and data scientists need</p>]]></description><link>https://memos.alisx.com/tackling-integration-challenges-centralized-ontology-vs-proto-based-service-oriented-architecture-2/</link><guid isPermaLink="false">6422a232644ca30001f1cf52</guid><dc:creator><![CDATA[James Spanjaard]]></dc:creator><pubDate>Wed, 29 Mar 2023 10:00:00 GMT</pubDate><content:encoded><![CDATA[<p>There are only two problems in enterprise software: integration and the next integration.</p><p>Data about customers, transactions, locations, assets, processes, and service offerings are scattered across various business units, databases, and instances of internal and external applications. This fragmentation poses a challenge when other systems, processes, and data scientists need to access the data for analysis and AI implementation.</p><p>Two fundamental approaches can address this issue: a centralised ontology and decentralised, proto-based, service-oriented architecture.</p><p>Centralised ontology systems, such as Palantir Foundry or ETL processes that culminate in a central data warehouse, are designed to provide a centralised repository of metadata and data integration services. They are typically used in large organisations where data is stored in various disparate systems and need to be integrated and analysed. These systems provide a way to define common data models and integrate data from multiple sources.</p><p>Consider centralised ontologies as the &quot;one schema to rule them all&quot; - a meta-database that is the canonical truth into and through which all data must flow. Like the CCP, these systems solve integration challenges with an authoritarian imposition of order, structure and ideological dogma. The advantage of this approach is that disputes are arbitrated centrally, allowing strict control over data governance and security. This centralisation, however, comes at the expense of flexibility and speed of innovation and can make these architectures costly to develop and maintain.</p><p>Service Oriented Architectures, popularised by Amazon and Netflix, on the other hand, are like Switzerland. Each Canton has complete autonomy but has a strict contract in how it interfaces with the rest of the country. In the case of a Service Oriented Architecture, each system must expose its data and services via a well-defined set of APIs - in effect, a contract with the rest of the enterprise. This approach allows for a more flexible and adaptable architecture that can be easily extended to support new data sources and services.</p><p>Protocol buffers (Protos) are often used to write this contract. Let&apos;s use an example from Netflix&apos;s world. You can read more on their engineering blog: <a href="https://netflixtechblog.com/tagged/protocol-buffers">https://netflixtechblog.com/tagged/protocol-buffers</a></p><p>At Netflix, the team responsible for managing the process of making a movie defines a resource object called Production that contains all the information relevant to that movie as it moves through the production process. Some of that data, however, needs to come from other teams. The scripts team supports that integration by providing that data via a clean and contractually defined API.</p><pre><code class="language-protobuf">// Contains Production-related information  
// Note: in the film and TV industry, the term production refers to the process of making a movie, not the environment to run a software
message Production {
  string id = 1;
  string title = 2;
  ProductionFormat format = 3;
  repeated CastMember cast_members = 4; // Data coming from Scripts team
  ProductionSchedule schedule = 5;
  // ... more fields
}

// The Script &amp; Casting team has independently built and deployed a Scripts service that other teams can use to integrate script data
service ScriptsService {
  // Create a report template method.
    rpc GetScript (GetScriptRequest) returns (Script) {}
}

// The scripts team has a well defined contract for their Script resource that also defines the cast
message Script {
  string id = 1;
  repeated CastMember cast_members = 2;
  message CastMember {
    string character = 1;
    string actor = 2;
  }
}</code></pre><p>Proto-based service-oriented architectures are designed to provide a more decentralised approach to data integration. They use a protocol buffer (Proto) schema to define data models, which can then be used to generate code for client and server applications. This approach allows for a more flexible and adaptable architecture that can be easily extended to support new data sources and services.</p><p>A proto-based service-oriented architecture offers flexibility, scalability, autonomy, and support for cross-functional teams due to its schema-driven approach and loose coupling of services. This allows for rapid adaptation to changing business needs, independent development and deployment of services in various languages, and improved collaboration among different functional areas. The architecture also enhances scalability, performance, fault tolerance, and error handling by enabling horizontal scaling across multiple servers or cloud instances, graceful error management, and independent service monitoring. Lastly, it ensures better security and data governance through the implementation of security protocols, access controls, and distributed ledger management for greater transparency and accountability.</p><p>At Alis Exchange, we&apos;ve experienced how adopting a protobuf-based Service Oriented Architecture unlocks speed and innovation. We developed our Alis Build platform to make this approach to solving the integration process as simple and accessible as possible.</p><p>The platform makes it easy for developers, actuaries, business analysts and data scientists to rapidly <strong>Define</strong> high-quality API contracts, <strong>Build</strong> the underlying service and business logic and <strong>Deploy</strong> these services to the cloud.</p>]]></content:encoded></item><item><title><![CDATA[Time-to-usefulness as a metric for innovation excellence]]></title><description><![CDATA[<p>In their brilliant book, <em><a href="https://www.goodreads.com/en/book/show/35747076">Accelerate &#x2014; Building and Scaling High Performing Technology Organizations</a></em>, Forsgren, Humble, and Kim suggest four metrics for measuring the software delivery performance of a team or organization:</p><ul><li><strong>Lead Time</strong>: The time from code committed to running in production;</li><li><strong>Deployment Frequency</strong>: How often deploys happen;</li><li><strong>Mean Time</strong></li></ul>]]></description><link>https://memos.alisx.com/time-to-usefulness/</link><guid isPermaLink="false">63d37cb2c7e3c500011d75c6</guid><dc:creator><![CDATA[James Spanjaard]]></dc:creator><pubDate>Fri, 27 Jan 2023 08:32:08 GMT</pubDate><content:encoded><![CDATA[<p>In their brilliant book, <em><a href="https://www.goodreads.com/en/book/show/35747076">Accelerate &#x2014; Building and Scaling High Performing Technology Organizations</a></em>, Forsgren, Humble, and Kim suggest four metrics for measuring the software delivery performance of a team or organization:</p><ul><li><strong>Lead Time</strong>: The time from code committed to running in production;</li><li><strong>Deployment Frequency</strong>: How often deploys happen;</li><li><strong>Mean Time To Restore (MTTR)</strong>: How quickly can teams restore service after production outages; and</li><li><strong>Change Fail Rate</strong>: What percentage of deploys result in service impairment or an outage.</li></ul><p>In their research they found that high performing teams and organisations operated significantly faster than their peers. These high performers were able to deploy to production in hours, rather than months, and deploy multiple times per day without compromising stability or uptime.</p><p>Developer experience plays an essential enabling role in achieving this level of performance. In our experience in working with builders and digital innovators, we would suggest another metric for developer experience excellence: <em>Time-to-usefulness.</em></p><h2 id="time-to-usefulness">Time-to-usefulness</h2><p>We define <em>time-to-usefulness </em>(TTU) as:</p><blockquote>The time it take a newcomer to transition from &apos;new laptop&apos; to &apos;business impact&apos;.</blockquote><p>Newcomers may refer to traditional software developers or any other business practitioner, such as actuaries or data scientist, who will take up the role of a builder.</p><p>High performing teams and organisations deliver a TTU of <strong>days</strong> rather than the weeks and months that is often the case. Similar to the other four metrics, this translates in the ability to operate at an order of magnitude difference in experience than their peers.</p><h3 id="ttu-for-sustaining-innovation">TTU for sustaining innovation</h3><p>In his groundbreaking <a href="https://en.wikipedia.org/wiki/Expectancy_theory">research on motivation</a>, Victor Vroom of the Yale School of Management found that an individual&apos;s <em>Expectancy</em>, or <em>anticipation of the connection between effort and impact</em>, was the key foundation for long term motivation.</p><p>We&apos;ve all experienced the <em>honeymoon</em> moment of joining a new team, project or organisation where we&apos;re full of ideas, excitement and a desire to contribute. When that energy can quickly translate into the ability to make an impact we are far more likely to sustain our sense of motivation and our hunger to innovate. When that energy hits a proverbial brick wall of bureaucracy, context overloading and panicked helplessness, the small glowing ember of innovation quickly dies.</p><p>The three biggest impediments to TTU are: </p><ol><li>The <strong><em>how do I structure this</em></strong> problem: I see something that needs fixing, but how do I start making progress in formulating a solution.</li><li>The <strong><em>barriers to entry</em></strong> problem: When 80% of the effort is expended on solving barriers to innovation such as environmental, permissions and boilerplate code, it&apos;s very difficult to expend meaningful mental energy on formulating an innovative solution.</li><li>The <strong><em>how do I productionize and serve my solution</em></strong> problem: It&apos;s one thing to write code that solves a problem. It&apos;s an entirely more daunting problem to try think about how to get that solution into the hands of people that need it.</li></ol><p>Decreasing TTU requires intentionality in improving developer experience and ruthlessly eliminating the three former mentioned impediments. </p><p>At the core of Alis Exchange, our attempt at addressing this has been the development and adoption of the Alis Build platform. The tooling, templating and simple <em>Define, Implement and Consume</em> framework eliminates the three frictions and enable builders to digitally innovate faster than ever before.</p><p>What is the effect of the platform on TTU? We will let our clients share that.</p><h2 id="ttu-5-days">TTU &lt; 5 days</h2><p>A newcomer at one of our clients went from a boxed laptop and zero cloud experience to a productionized process solution in less than 5 days. This short testimonial from a new builder, Daniel, captures the excitement that comes with immediately being able to innovate and make an impact.</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/FhN2kt9heRk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="Client Testimonial | Daniel Holmes"></iframe></figure><p>Read more about the case study <a href="https://samples.alis.build/samples/1674655968782">here</a>.</p>]]></content:encoded></item><item><title><![CDATA[Builder Spotlight:  Market beating AI + Software platform for Investment Managers]]></title><description><![CDATA[<p>Platform enabling a team of 2 investment professionals to outperform teams of 200+</p><p><strong>Build time</strong>: 18 months build time by 7 &#xA0;finance &amp; machine learning practitioners.</p><h2 id="the-problem">The Problem</h2><p>Can a machine learning enabled investment strategy beat a passive fund? Can a Machine + Human beat a traditional analysis? &#x1F914;</p><p>This</p>]]></description><link>https://memos.alisx.com/builder-spotlight-market-beating-ai-software-platform-for-investment-managers/</link><guid isPermaLink="false">6397416ed0c8f5000128aac5</guid><dc:creator><![CDATA[Jan Krynauw]]></dc:creator><pubDate>Wed, 23 Nov 2022 14:58:00 GMT</pubDate><content:encoded><![CDATA[<p>Platform enabling a team of 2 investment professionals to outperform teams of 200+</p><p><strong>Build time</strong>: 18 months build time by 7 &#xA0;finance &amp; machine learning practitioners.</p><h2 id="the-problem">The Problem</h2><p>Can a machine learning enabled investment strategy beat a passive fund? Can a Machine + Human beat a traditional analysis? &#x1F914;</p><p>This was the task that Rezco Asset Management encountered around 2015. &#xA0;What initially started around a discussion on how to improve their investment idea screening tools, turned into a multi-year journey in which one had to master the intersection of machine learning, software engineering, finance and human behaviour. &#xA0;Read more on our journey to scale in this <a>memo</a>.</p><p>We learned through experience that the engineering challenge of developing and running cutting edge machine learning models at scale was only half the problem. And in many ways it is the easier half to solve leveraging well developed machine learning cloud based IaaS solutions offered by the likes of Google Cloud, AWS and Azure.</p><p>The hardest part of the problem was learning how to frictionlessly incorporate AI research cycles and predictive signals into the workflow of Portfolio Managers (PMs). The hardest part of the problem was not figuring out how to create value through machine learning, but figuring out how to help the consumers of this technology realise the value being created in the areas most important to them.</p><hr><h2 id="the-solution">The Solution</h2><blockquote>Meet the stakeholders where they are.</blockquote><p>The core guiding philosophy that helped us solve this problem is that we needed to <strong>meet the stakeholders where they are</strong>.<strong> </strong>Context switching destroys focus and value realisation. &#xA0;Here are a few simplified examples:</p><ul><li>Sending a set of stock predictions in a spreadsheet to the investment team and then asking for feedback does not work. &#xA0;This is not meeting the investment team where they are, instead its essentially asking the PM to &apos;step away from their current context&apos;. &#xA0;PMs need to be able to make decisions in a distraction free environment which enables and maintains focus.</li><li>Creating a &quot;<em>Swivel-Chair-Interface&quot; </em>by requiring a PM to log into some portal or pull up some email to access stock predictions. &#xA0;There are already a large number of investment tools, adding another &apos;terminal&apos; just to access predictions does not make sense.</li></ul><blockquote>Swivel chair is a slang term for a common interface work-around that involves manually entering data into one system and then entering the same data into another system.</blockquote><p>Instead, what if the machine learning team is able to deliver predictions and well crafted model properties (features, model hypothesis, benchmark etc.) directly to into the Portfolio Manager&apos;s context?</p><p>Alis.Build enabled this through a set of consistent, well organised, well defined and highly performant APIs. &#xA0;Every interaction between the stakeholders are performed through this single API layer. Practically, these 7 individuals implemented more than 200 micro services, for example services that:</p><ul><li>manage the integration with Morningstar Direct to generate marketing material and analytics</li><li>building a highly scalable &quot;Alpha Console&quot; integrating machine learning driven predictive signals with traditional analyst research.</li><li>manage predictions (GetPrediction, ListPredictions, UpdatePrediction, etc.)</li><li>manage the data pipelines from Bloomberg</li><li>capture any investment research memos and notes and propagate these up at a stock level next to prediction insights.</li><li>etc. (more than 200 of these &#x1F60E;)</li></ul><hr><h2 id="the-result">The Result</h2><p>Rezco Asset Management is generating outperformance on a pure Machine Learning investment strategy, after all trading costs.</p><p>This tight integration between the machine learning team and PMs creates a closed feedback loop between the machine learning and finance domains. &#xA0;Better models -&gt; more engaged PMs -&gt; better human in the loop feedback -&gt; Better models</p><p>In the following video, Simon Sylvester (CEO) shares how machine learning conceptually fits into their investment management world:</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/UJ-Du7MZr1g?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen title="Rezco | AI - Part One"></iframe></figure><p>Watch Part 2, where you can see a practical example of how ML delivers real value to their clients</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/H-r41DasQNg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen title="Rezco | AI Part Two"></iframe></figure><hr><h2 id="how-alisbuild-made-it-possible">How Alis.Build made it possible</h2><p>Best-in-class, resource-driven API development and cloud infrastructure management made easy for non-professional software developers with:</p><ol><li>Out of the box libraries, Excel add-ins and documentation;</li><li>Support from the Alis Build team on thorny technical issues; and</li><li>Access to learning and development opportunities for the team.</li></ol>]]></content:encoded></item><item><title><![CDATA[Builder Spotlight: Compliance engine that delivers Alpha]]></title><description><![CDATA[<p><a href="https://rezco.co.za/">Rezco</a>&apos;s Fund Services team took advantage the power of the Alis Exchange <a href="https://alis.build/">Build Platform</a> to deliver a <strong>Compliance Engine</strong> that enhances, rather than detracts, from investment performance.</p><h2 id="the-problem">The Problem</h2><p>Portfolio managers live and breathe <em>alpha</em>. It is what gets them up in the early hours of the morning</p>]]></description><link>https://memos.alisx.com/builder-spotlight-compliance-engine-that-delivers-alpha/</link><guid isPermaLink="false">63973fb1d0c8f5000128aa92</guid><dc:creator><![CDATA[Jan Krynauw]]></dc:creator><pubDate>Mon, 21 Nov 2022 14:50:00 GMT</pubDate><content:encoded><![CDATA[<p><a href="https://rezco.co.za/">Rezco</a>&apos;s Fund Services team took advantage the power of the Alis Exchange <a href="https://alis.build/">Build Platform</a> to deliver a <strong>Compliance Engine</strong> that enhances, rather than detracts, from investment performance.</p><h2 id="the-problem">The Problem</h2><p>Portfolio managers live and breathe <em>alpha</em>. It is what gets them up in the early hours of the morning and working past midnight. It is their driving motivation, the competitive fire that burns brighter with every opportunity and every challenge.</p><p>Compliance teams, on the other hand, are primarily concerned with ensuring the portfolio in question does not fall afoul of the relevant regulation. This is no easy task and takes countless hours spent parsing obscure legislation, compiling intricate instrument master lists and formulating different tests and scenarios against which a portfolio must pass.</p><p><strong>Typically, compliance systems and processes exist largely independent of the investment process. </strong>This creates two detractors of investment performance.</p><p>Firstly, compliance feedback on a portfolio is only delivered post trade. This leaves portfolio managers feeling like feedback is a day late and a dollar short and can cost performance through having to unwind positions.</p><p>Secondly, in the case that pre-trade feedback is provided, it is often via a separate system or set of tooling. This switching cost detracts from performance by destroying flow and focus.</p><h2 id="the-solution">The Solution</h2><p>The Rezco Fund Services compliance engine is built on <a href="https://alisx.com/">Alis Exchange</a> and offers an API first implementation that:</p><ol><li>Integrates into Portfolio Managers pre-trade workflow without incurring any switching costs;</li><li>Provides real-time compliance feedback, which does not encumber the portfolio management process; and</li><li>Is easy to configure and maintain with a full audit trail of every compliance check.</li></ol><p>How does an effective, flexible, fast, workflow agnostic, API first compliance technology add alpha to the investment process? Watch the video below to find out more.</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/s0QavqfDycc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen title="Compliance Engine Excel/Bridge Integration Demo"></iframe></figure><h2 id="the-results">The Results</h2><ul><li>Faster decision making.</li><li>Reduce cost of unwinding noncompliant positions.</li><li>Eliminate noise.</li><li>Add compliance alpha to your process.</li></ul><hr><h1 id="how-alis-build-made-it-possible">How Alis Build made it possible</h1><p>Best-in-class, resource-driven API development and cloud infrastructure management made easy for non-professional software developers with:</p><ol><li>Out of the box libraries, Excel add-ins and documentation;</li><li>Support from the Alis Build team on thorny technical issues; and</li><li>Access to learning and development opportunities for the team.</li></ol>]]></content:encoded></item><item><title><![CDATA[All-Code for Enterprise]]></title><description><![CDATA[<h4 id="tldr">TL;DR</h4><blockquote>The accessibility and ease-of-use that No-Code / Low-Code platforms offer comes at the expense of functionality.<br><br>All-code platforms attempt to escape this classic trade-off between functionality and accessibility by removing all the typical overhead that makes grown up software expensive and difficult.<br><br>The Alis Exchange Build platform aims to</blockquote>]]></description><link>https://memos.alisx.com/all-code-for-enterprise/</link><guid isPermaLink="false">63974071d0c8f5000128aaac</guid><dc:creator><![CDATA[Jan Krynauw]]></dc:creator><pubDate>Mon, 17 Oct 2022 14:55:00 GMT</pubDate><media:content url="https://storage.googleapis.com/files.memos.alisx.com/2022/12/c0bd89260745b186.png" medium="image"/><content:encoded><![CDATA[<h4 id="tldr">TL;DR</h4><blockquote>The accessibility and ease-of-use that No-Code / Low-Code platforms offer comes at the expense of functionality.<br><br>All-code platforms attempt to escape this classic trade-off between functionality and accessibility by removing all the typical overhead that makes grown up software expensive and difficult.<br><br>The Alis Exchange Build platform aims to enable a new generation of enterprise software through powerful and simple tools and platforms for business practitioners and citizen developers.</blockquote><img src="https://storage.googleapis.com/files.memos.alisx.com/2022/12/c0bd89260745b186.png" alt="All-Code for Enterprise"><p>We write software to solve problems.</p><p>Get some information. Store some information. Maybe get fancy and melt a GPU processing that information. Begrudgingly manipulate the DOM to appease retinas with this information (pesky eyeballs). Publish a PDF. Publish another PDF...</p><p><em>Low-Code</em> and <em>No-Code </em>are new labels for an old trend. Platforms have long existed to make the software creation process slightly easier. Access and Excel were the original (and are still the dominant) No-Code platforms. Webflow and Squarespace have baked into their DNA two decades of Adobe Dreamweaver and Wordpress.</p><p>A scary amount of the global economy, including pretty much the entire actuarial community, runs on a Low-Code platform you might never have heard of: Visual Basic for Applications (VBA).</p><p>The No-Code / Low-Code ecosystem, especially propelled by newer entrants like <a href="https://retool.com/">Retool</a>, Microsoft&apos;s PowerApps, <a href="https://zapier.com/">Zapier</a> and Google&apos;s App Script, plays a vital role in increasing the surface area of software for business applications.</p><p>The accessibility and ease-of-use that No-Code / Low-Code platforms offer, however, comes at the expense of functionality. And as a company grows the technical challenges faced by business teams can quickly outgrow the capabilities of these platforms. The most common symptoms of needing <em>grown up software</em> are:</p><p><strong>Performance:</strong> Do you want to implement a multi-objective linear portfolio optimisation and need to implement that in VBA? Need more than 10,000 rows? The entire company is dependent on that R script on your laptop? Good luck.</p><p><strong>Evolvability:</strong> Software is ever evolving. Most Low-Code / No-Code platforms make it almost impossible to continuously integrate and deploy improvements in production without breaking downstream processes.</p><p><b>Flexibility</b><strong>: </strong>Some of the time Javascript is a kind of okay runtime. A lot of the time it&apos;s not. Much of the time your code will need to run in a specific language and have access to a specific library. Most Low-Code / No-Code platforms are not built this way.</p><p><strong>Composability:</strong> Most Low-Code / No-Code demos are built around the simple use cases of <em>read and display some data from a database you control</em> or <em>create a web form and save the data in a light weight database</em>. Most business applications, however, require safely integrating data from multiple sources and surfacing the results in a predictable way for other processes. Without composability teams reinvent the wheel and then reinvent the wheel again.</p><p>When business teams encounter these challenges the response is typically some combination of (a) beg the overstretched IT department for capacity, (b) overpay a consulting company or (c) contract with a development outsourcing shop and become beholden to them for life.</p><p><em>All-Code</em> platforms are a novel attempt to escape this classic trade-off between <em>functionality</em> and <em>accessibility</em>. <a href="https://replit.com/">Replit</a>, for example, has made <em>grown up software</em> development 100x more accessible to aspiring developers. Their mission is to bring the next billion software creators online and they are well on their way to achieving that by removing all the overhead that makes <em>grown up software</em> expensive and difficult.</p><p>All-Code platforms promise to let you write the software you want to write while making it infinitely more accessible to do so. To do so, an All-Code platform needs to solve five big problems:</p><ol><li><strong>Standardized, ready-to-go environment:</strong> Running &#xA0;`<em>print(&apos;hello world&apos;)</em>` in Python is trivially easy. Navigating the sticky hot mess of environmental configurations and package choices on your local machine, however, requires Masters in Computer Science.</li><li><strong>Patterns, templating and frameworks</strong>:<strong> </strong>There is nothing more intimidating than a blank text file. Ready-to-go and accessible patterns, templates and frameworks lower time to value by getting the process going. &#xA0;Patterns and templates also enable productivity by making cloud native design patterns (the tricky engineering stuff that gets in the way of writing code) a lot easier to do.</li><li><strong>Tooling to remove toil:</strong> Toil, the non-value adding and finicky grunt work of software engineering, such as maintaining a cloud runtime environment or pushing code to production, often inhibits business practitioners and embedded engineers from productively delivering value.</li><li><strong>Deployment and distribution: </strong>How to deploy a piece of logic and make it easy for others to safely and securely use is a non-trivial problem. Accessible software should be easy to deploy to the cloud.</li><li><strong>Community and support: </strong>We all get stuck somewhere. Accessible software development requires having access to a resources, community and, if necessary, support that can help resolve those thorny issues and keep momentum high.</li></ol><p>The <a href="https://alis.build">Alis Exchange Build</a> platform makes it simpler and quicker for business practitioners and embedded developers to design, develop, deploy and distribute great business need oriented and enterprise-grade software.</p><p>Our mission is to enable a new generation of enterprise software through powerful and simple tools and platforms for business practitioners and embedded developers.</p><p>Let&apos;s get building.</p>]]></content:encoded></item><item><title><![CDATA[Data Engineering as a Service]]></title><description><![CDATA[<p>Financial data lies at the heart of every investment decision. As the finance industry evolves towards being more technologically advanced with <a href="https://citywire.co.za/news/the-challenges-faced-by-ai-powered-investing/a2387602">AI-driven investment decisions</a> becoming more commonplace, the ease at which financial data may be accessed and used is becoming increasingly important. &#xA0;There is a significant lag, however, with</p>]]></description><link>https://memos.alisx.com/data-engineering-as-a-service/</link><guid isPermaLink="false">63973f09d0c8f5000128aa7c</guid><dc:creator><![CDATA[Jan Krynauw]]></dc:creator><pubDate>Mon, 10 Oct 2022 14:48:00 GMT</pubDate><content:encoded><![CDATA[<p>Financial data lies at the heart of every investment decision. As the finance industry evolves towards being more technologically advanced with <a href="https://citywire.co.za/news/the-challenges-faced-by-ai-powered-investing/a2387602">AI-driven investment decisions</a> becoming more commonplace, the ease at which financial data may be accessed and used is becoming increasingly important. &#xA0;There is a significant lag, however, with major financial data providers still relying on outdated technologies, with little consideration of the end-user experience. This results in organisations spending thousands of man-hours to survey data sources, integrate with legacy data delivery mechanisms, and follow laborious manual processes to get their data. <br><br>Let&#x2019;s consider an extremely simple task. An Alis Exchange client would like to get historical price and market capitalisation data for Apple, Microsoft, Tesla using their Bloomberg Data License subscription. Simple, right? Not so fast. <br><br>At <a href="https://alisx.com/">Alis Exchange</a> we believe the answer should be a resounding yes. The sad truth of the matter, however, is that the current state of financial data providers left us baffled when attempting to answer this seemingly simple question&#x2026; We found that legacy systems and poorly designed data delivery pipelines could make even such a rudimentary request feel like a day-job.</p><h3 id="getting-data-from-bloomberg-data-licence">Getting data from Bloomberg Data Licence</h3><p>Bloomberg <a href="https://www.bloomberg.com/professional/product/data-license/">Data License</a> is the Rolls-Royce of market data providers in terms of coverage, quality and depth. It also provides a useful case study of the many hoops, contortions and escape room like puzzles that consumers of financial data are expected to solve - even from the very best of these types of systems.</p><p>The request protocol involves a cryptic request message in the form of a .txt file, that is uploaded to an SSH File Transfer Protocol (SFTP) server <em>via </em>a whitelisted IP address, an undisclosed waiting period and, finally, a .txt response file containing your data in yet another a cryptic format. If you find that sounds slightly complicated, not only are you right, but you&#x2019;re not yet enlightened to the hidden complexities of this task. Let&#x2019;s break it up into steps&#x2026; (to skip the tedious explanation of the status-quo and see our solution, skip ahead to Data Engineering as a Service)</p><h4 id="step-1-construct-the-request-file">Step 1: Construct the request file</h4><p>To start off with, you are required to manually construct a text file in a very particular format, indicating which Instruments and Fields you might want to get data for. For our example, we would like to request price and market cap data for Apple, Microsoft and Tesla from 1 Jan 2000 up to today (5 October 2022).</p><p>The request file, as seen in the image below is a pure text file with very strict formatting rules, including the use of a START-OF-FILE, START-OF-FIELDS and START-OF-DATA lines, nudging you to start filling in text, with the accompanying END statements, signifying you can stop now.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh4.googleusercontent.com/Dg1HK_LGIEeLz_55n8zmunMXuX1IFY9GhB7q_mJysGVjrD0hy9D6pBWMbaxEsREOnD-0qfn_yBlegxlAgXhr5fO605oJ20xgvPnCKKKeNLBtj_E5khonLeAa55nilLb1wIwOiIoQ-SNtps6uFAqWfEmdlQVoJJueK9AaY3TycTjcmxjdP79our6Cbg" class="kg-image" alt loading="lazy"><figcaption>Outline of a Bloomberg request text file</figcaption></figure><p>If a single one of these lines are out of place, or a single typo is present in the request, the entire request becomes void (but this would only become apparent in Step 4). With no linting implemented or documentation to guide you, you are left with a trial-and-error approach until the glorious day when you guessed the correct sequence of numbers and letters.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh3.googleusercontent.com/g63s7NGmW3IgjSuR6word7jPqACkEg2e-CWpLHXOR2ltpZIq6L7HkqQumvM1paDe36hfjsJZJ-9QZDHWLB1PF4mw5QIoYyxM-YiwegRg91w9y9kN-nu1WbcZxywRI3tpxL6txzfRtCT4wPNF0glvdzqCIdfFjZfKIp8HPbDcVZU5CrmsQSZRDD-sRA" class="kg-image" alt loading="lazy"><figcaption>Example of a Bloomberg request text file</figcaption></figure><h4 id="step-2-drop-the-request-file-on-an-sftp-server">Step 2: Drop the request file on an SFTP server</h4><p>The next step in the process involves making a Secure Shell (SSH) connection to Bloomberg&#x2019;s remote server, in order to transfer your request file. Moreover, you can&#x2019;t just do this from any old computer. Bloomberg requires any requests to be made using an IP address that they have officially white-listed. So this either implies that you either need to spin up a Virtual Machine (VM) or walk to your company&#x2019;s dedicated &#x201C;Bloomberg request machine&#x201D;.</p><p>Generally, open-source FTP applications such as FileZilla may be used for dropping the request files. After searching for the email where your colleague sent you the SFTP credentials, an SSH connection is established and you may now manually upload your request file.</p><figure class="kg-card kg-image-card"><img src="https://lh4.googleusercontent.com/lO68L_SDAVTDOALjspxh9JNtCGkM6tXHog2QV_GS4u0yg4XgjnODwqDoo3HznAy1t7PK3hXluMSX1u-T_5wc0oknJ3VIFNwFOv3B63HM6VjbwGFu5Lay0KdkBUNl5-int3XmLfFo0pxPkYyw7eLTGBnDXtPNEdSZ50CV8LkKfkW1lCwQqxbkZDTLKg" class="kg-image" alt loading="lazy"></figure><h4 id="step-3-wait">Step 3: Wait</h4><p>That&#x2019;s all you can do at this point. Go make yourself a coffee. Go reply to that email you&#x2019;ve been ignoring. Wait for an undisclosed amount of time while Bloomberg processes your request. Every now and then, you can run back to your dedicated Bloomberg computer, SSH back onto the SFTP, and check if your data is there yet.</p><h4 id="step-4-decipher-the-data-on-the-reply-file">Step 4: Decipher the data on the reply file</h4><p>The response came from Bloomberg! Success! Right?</p><p>Well, as mentioned in Step 1, your request file might have some typos or missing information, which will only become apparent by seeing Bloomberg&#x2019;s response, illuminating your shortcomings. So in the trial-and-error cycle, this would be where you get the (albeit quite cryptic) error.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh4.googleusercontent.com/YbCcL2gzevkH7TbauODgihC-zN6B503e8tF57HmKF2ru1Yob5aKobrfDoYi7GwkvR4pylgEybqBqqSKchzEOL3-nLLAHx5fgKbQhXeQzyx0rYOd4ShKY-0sM9yzVDY0Aj65M9iAl4Xf8-dsOMRSH99U2aYFuSEuMc-yYtTOoGw7tZaKrZNKa5jSm6Q" class="kg-image" alt loading="lazy"><figcaption>Example of a Bloomberg response text file</figcaption></figure><p>Let&#x2019;s take the optimistic view and assume that your first attempt resulted in a positive response from Bloomberg. Surely now we&#x2019;ve come to the end of our journey? Well, not quite yet. Next, you have to deal with yet another text file and figure out how this response data may be rendered useful. The infamous START-OF-FILE, START-OF-FIELDS and START-OF-DATA make their come-back, with their END counterparts indicating to us that we have come to the end of the response.</p><p>Characters such as | are used to separate the effective date and its corresponding historical value. Once you&#x2019;ve deciphered the reply file, you can spend your time parsing the file, converting it to the relevant data types, and copying these into your data warehouse.</p><h4 id="step-5-go-home">Step 5: Go home</h4><p>You&#x2019;ve done enough work for today. That was exhausting.</p><h3 id="introducing-data-engineering-as-a-service-deaas">Introducing Data Engineering as a Service (DEaaS)</h3><p>At Alis Exchange, we often have moments where we think: &#x201C;there has to be an easier way to do this&#x201D;. This is often followed by the dreaming phase, which is characterised by the phrase &#x201C;imagine a world where {insert the perfect solution}&#x201D;. And finally, we immerse ourselves in designing the solution, aiming wholeheartedly at making our client&#x2019;s lives as easy as possible.</p><p>Imagine a world where:</p><ul><li>Onboarding a data source took minutes not months</li><li>Data synchronisation never failed</li><li>Data sources were pre-mapped to a common identifier</li><li>Data could be consumed safely by developers in their programming language of choice without leaving their IDE</li></ul><p>Our Data Engineering as a Service offering (DEaaS), Alis DE, turns that aspiration into a realisable reality.</p><p>A core pillar of the DE philosophy is the idea of a <em>proxy </em>on existing methods of data providers. We manage all the complexities of the data providers, and wrap it with a simple-to-use interface, significantly alleviating the effort required to get data into your system.</p><p>Let&#x2019;s put the words into action by showing you the process of making the exact same request as above using DE&#x2026; (The examples shown are in Go, although all methods are implemented and available in multiple supported languages.)</p><h4 id="step-1-instantiate-your-bloomberg-client">Step 1: Instantiate your Bloomberg client</h4><p>Once you&#x2019;re signed up as a DE client, full access to the Bloomberg methods is as simple as <a>establishing a DE Bloomberg client</a> in your favourite programming language. This is a once-off process, which requires minimal effort. Read more about <a href="https://alis.build/guides/how-to-guides/make-your-first-request.html">how to make your first request</a> to an Alis Exchange service in your favourite language.</p><h4 id="step-2-make-the-request">Step 2: Make the request</h4><p>Once the client is established, use the automatically generated protobufs to guide the process of constructing your request, and interpreting your response. Each request field is well defined, with documentation providing more context on how to populate the field.</p><p>DE is a cloud-native service, which ensures a scalable, readily accessible and secure service. The request will be reliably handled, without a single concern over using the correct, whitelisted computer (this is all managed in the background by DE).</p><pre><code class="language-go">// Instruments for which to request historical data
	instruments := []*pb.GetHistoryRequest_Instrument{
		{
			Id: &quot;BBG000B9XRY4&quot;,
		},
		{
			Id: &quot;BBG000BPH459&quot;,
		},
		{
			Id: &quot;BBG000N9MNX3&quot;,
		},
	}
// Historical data fields requested for all instruments
fields := []*pb.GetHistoryRequest_Field{
	{
		FieldMnemonic: &quot;PX_LAST&quot;,
		Type:          pb.FieldType_BB_DECIMAL,
	},
	{
		FieldMnemonic: &quot;CUR_MKT_CAP&quot;,
		Type:          pb.FieldType_BB_DECIMAL,
	},
	{
		FieldMnemonic: &quot;PX_HIGH&quot;,
		Type:          pb.FieldType_BB_DECIMAL,
	},
}

// Construct the GetHistory request message
req := pb.GetHistoryRequest{
	Headers: &amp;amp;pb.GetHistoryRequest_Headers{
		Firm:        &quot;dl2345&quot;,
		ProgramFlag: pb.ProgramFlag_ADHOC,
		StartDate: &amp;amp;date.Date{
			Year:  2022,
			Month: 1,
			Day:   1,
		},
		EndDate: &amp;amp;date.Date{
			Year:  2022,
			Month: 10,
			Day:   5,
		},
	},
	Fields:            fields,
	Instruments:       instruments,
	FtpUploadRequired: true,
}

// Make the GetHistory request
res, err := BloombergClient.GetHistory(context.Background(), &amp;amp;req)
if err != nil {
	// TODO: Handle error
}</code></pre><!--kg-card-begin: markdown--><h4 id="step-3-make-your-code-do-the-waiting-for-you">Step 3: Make your code do the waiting for you</h4>
<!--kg-card-end: markdown--><p>Now that your request has been made, we wait for the response from Bloomberg. This time, however, DE will poll the SFTP server for you, and parse your response as soon as it is available. No checking on the FTP, and certainly no manual interpreting of the returned file.</p><pre><code class="language-go">// Wait for long-running operation to complete 
// (i.e. wait for response from Bloomberg)
//
// DE manages the polling of the SFTP, mapping the returned file 
// to the original request, and parsing the response file into a 
// well-defined response type.
resOp, err := wait(context.Background(), res)
if err != nil {
    // TODO: Handle error
}

// Marshal the long-running operation into the expected 
// response format
data := &amp;amp;pb.GetHistoryResponse{}
err = anypb.UnmarshalTo(resOp.GetResponse(), data,
proto.UnmarshalOptions{})
if err != nil {
    // TODO: Handle error
}

// Iterate through instruments returned by the GetHistory method
for _, instrument := range data.GetData().GetInstruments() {
    // Iterate through each record returned by the GetHistory method
    fmt.Printf(&quot;Instrument %s: Field: %s # Historical records: %v&quot;, 
        instrument.GetId(), instrument.GetFieldMnemonic(),
        len(instrument.GetHistoricalRecords())),
}</code></pre><p>You are left with a clean response, with well-defined fields, type-safe values, and all within the confines of your IDE.</p><h3 id="conclusion">Conclusion</h3><p>It is time to help along the evolution of our investment processes. Data can no longer be accessed by constructing obscure request files, performing manual processes, and interpreting unclear response files. Experience having your data to be brought to you, consumed in your language and seamlessly incorporated into your pipelines. Experience having the power of DE as a service.</p>]]></content:encoded></item><item><title><![CDATA[Scaling Systems]]></title><description><![CDATA[In the beginning there was a Proto.]]></description><link>https://memos.alisx.com/scaling-systems/</link><guid isPermaLink="false">63973cb7d0c8f5000128aa48</guid><dc:creator><![CDATA[Jan Krynauw]]></dc:creator><pubDate>Sat, 01 Oct 2022 14:38:00 GMT</pubDate><media:content url="https://storage.googleapis.com/files.memos.alisx.com/2022/12/51716a280ad64c87.png" medium="image"/><content:encoded><![CDATA[<blockquote>&quot;Keeping things simple and yet scalable is actually the biggest challenge.&quot;<br>Urs H&#xF6;lzle, 2011, Senior VP of technical infrastructure and Google Fellow at Google</blockquote><hr><img src="https://storage.googleapis.com/files.memos.alisx.com/2022/12/51716a280ad64c87.png" alt="Scaling Systems"><p>In our journey of implementing machine learning in finance, we did not anticipate is the amount of complexity introduced when things are required to happen at scale.</p><p><strong><em>Even something super simple becomes complex at scale.</em></strong></p><p>Take the example of reading an email, which is considered a simple task. &#xA0;Reading a 100 emails a day takes a bit longer but still remain a simple task. &#xA0;Reading a 100 million emails needs a complete new approach.</p><p>In this memo, I will share some of the things we have learnt around scale in our journey of scaling machine learning systems. The image below outlines the 4 main areas of scale we will cover in the next few sections.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://storage.googleapis.com/files.memos.alisx.com/2022/09/a8ff32f41a3cc670.png" class="kg-image" alt="Scaling Systems" loading="lazy" width="2426" height="988"><figcaption>Our journey of running Machine Learning models at scale</figcaption></figure><hr><h1 id="scaling-models">Scaling Models</h1><p>Google <a href="https://blog.google/technology/ai/tensorflow-smarter-machine-learning-for/">released Tensorflow</a> on November 9, 2015. &#xA0; In the data science / machine learning world this was a big deal. &#xA0;Yes, it was pre version 1.0 and hard to get working, with limited documentation but the thing that resonated with us is the <em>out-of-the-box</em> support for distributed compute. &#xA0;We had model ideas and were able to run them on many machines combining CPUs and GPUs.</p><p>We were able to scale a model. &#x1F680;</p><p>&#x1F4A1;<em>What was quite interesting is how the performance of CPUs vs GPUs varied by model architecture. For one of our architectures we found that a distributed cluster of CPUs outperformed higher spec GPUs.</em></p><p><em>The reason? It turns out a set of convolutional layers we used in the particular model design simply performed better on CPUs.</em></p><h1 id="scaling-infrastructure">Scaling Infrastructure</h1><p>The nature of answering questions using machine learning is exploratory and, to explore ideas, we needed to run many models in parallel. &#xA0;We had to scale the underlying infrastructure on which our models were running.</p><p>Fortunately scaling infrastructure is already solved by technologies like <a href="https://www.docker.com">Docker</a> and <a>Kubernetes</a>. &#xA0;We moved all our model code into a standard environment (using Docker) and were able to orchestrate many runs in the cloud (using Kubernetes).</p><p><em><a href="https://cloud.google.com/kubernetes-engine">Google Kubernetes Engine</a>, <a href="https://aws.amazon.com/eks">Amazon EKS</a> and <a href="https://azure.microsoft.com/en-us/services/kubernetes-service">Azure Kubernetes Service</a> are all examples of managed versions of Docker orchestration tools.</em></p><h1 id="scaling-services">Scaling Services</h1><p>Running models at scale created a whole new range of scale related challenges.</p><p>More complex models required additional services to help with interpretability. We created services to validate feature pipelines, run feature and data pipelines, run feature importance services at scale. &#xA0;In the current cloud environment, this is largely solved through technologies like <a href="https://www.envoyproxy.io">Envoy</a> and <a href="https://istio.io">Istio</a> running on serverless technologies like &#xA0;<a href="https://cloud.google.com/run">Cloud Run</a>, <a href="https://azure.microsoft.com/en-us/products/functions">Azure Functions</a> and <a href="https://aws.amazon.com/lambda">AWS Lambda</a>.</p><p>This felt cool. &#xA0;We were running 1000s of services of which most scaled to zero when not used. &#xA0;This was a cost effective way to run our services and seemed elegant. &#xA0;Everything was defined through our own internal API layer. &#xA0;In fact, our setup was nicely inline with the Jeff Bezos <a href="https://apievangelist.com/2012/01/12/the-secret-to-amazons-success-internal-apis">mandate to the Amazon staff in 2002</a>:</p><blockquote><br><em>Jeff Bezos, 2002</em></blockquote><h1 id="scaling-systems">Scaling Systems</h1><blockquote>&quot;In the beginning there was a Proto.&quot;<br>Jan Krynauw, CEO Alis Exchange</blockquote><p>The one thing that resonated with us throughout the years is this concept of <em>elegance</em>. &#xA0;Using the right tool for the job often creates this layer of elegance. I often describe this to my team the feeling when one pauses, stands back and looks at a particular implementation thinking: &quot;Now this is elegant &#x1F604;&quot;.</p><p>Throughout our journey we were running Machine Learning models in production and trading live portfolios - trading your own models with real money turns out to be the ultimate forcing function in our search for elegance. &#xA0;The cumulative value of &#xA0;small wins of elegance is massive at scale.</p><p>As the number of services grew, we ran into our most recent scale challenge: How do we scale this entire setup - ie. <em><strong>how do we scale this system?</strong></em></p><p>We had <a href="https://swagger.io">Swagger</a> files defining and documenting a fairly clean sets of APIs. Documentation felt ok. We had control over the definitions and internally managed the consistency between all the API layers. &#xA0;Something we felt was clean and manageable at the time, felt less elegant at scale.</p><p>In some sense, <em>everything reduces to a scale problem</em>.</p><p>In our search of yet another version of elegance we came across <a href="https://developers.google.com/protocol-buffers">Protocol Buffers</a>. The concept is super simple: If you care about something define it. &#xA0;Protocol Buffers does this by design.</p><hr><p><em>The irony was that I met one of the authors of Protocol Buffers, </em><a href="https://en.wikipedia.org/wiki/Jeff_Dean"><em>Jeff Dean</em></a><em> at a </em><a href="https://nips.cc/Conferences/2017"><em>Machine Learning Conference</em></a><em> in Long Beach California in 2017. &#xA0;At the time I had no idea what a Protocol Buffer was. &#xA0;If only I did &#x1F62C;</em></p><hr><p>Exploring this new landscape introduced a new level of elegance across our entire stack. &#xA0;The combination of tools like Protocol Buffers, &#xA0;<a href="https://grpc.io">gRPC</a>, <a href="https://cloud.google.com/apis/design/resources">Resource Orientated Design</a> and <a href="https://golang.org">Go</a> finally allows us to scale our systems. &#xA0;We defined all our resources and moved all our services to this new <em>Proto-driven</em> approach (away from things like Swagger, REST APIs, graphQL, etc.). &#xA0; The beauty is that we are still able to provide Swagger, graphQL, REST APIs to those who really needs it &#x1F914;, but these technologies no longer drive our definitions.</p><p>The acceleration across my team has been and continues to be incredible. &#x1F680;</p><p>For more details on the above have a look at our <a href="https://alis.build">Alis Build</a> platform.</p>]]></content:encoded></item><item><title><![CDATA[Supercharging the API User Experience]]></title><description><![CDATA[<p>Great API definitions are hard to write. As outlined by James in a recent <a>memo</a>, striking the right balance between domain and technical and stable but extensible requires a great deal of time, energy and effort.</p><p>After all that work, many APIs fail at the last hurdle - not realizing</p>]]></description><link>https://memos.alisx.com/supercharging-the-api-user-experience/</link><guid isPermaLink="false">63973d77d0c8f5000128aa54</guid><dc:creator><![CDATA[Jan Krynauw]]></dc:creator><pubDate>Fri, 30 Sep 2022 14:40:00 GMT</pubDate><content:encoded><![CDATA[<p>Great API definitions are hard to write. As outlined by James in a recent <a>memo</a>, striking the right balance between domain and technical and stable but extensible requires a great deal of time, energy and effort.</p><p>After all that work, many APIs fail at the last hurdle - not realizing their value creation potential because their developers fail to consider the user experience and accessibility considerations that ultimately drive adoption.</p><p>Put simply, <em>the easier it is for services to be used, the more they will be</em>.</p><h2 id="the-ingredients-to-a-great-api-user-experience">The ingredients to a great API user experience</h2><p><strong>1. Documentation</strong></p><p>Documentation is the only window a user has into your API - it has to be done right. But, at the same time, documentation is boring to maintain and takes up developer time that could be spent on building new features and offering more value to end users.</p><figure class="kg-card kg-image-card"><img src="https://storage.googleapis.com/files.memos.alisx.com/2022/09/57a6acb60d6f15c1.png" class="kg-image" alt loading="lazy" width="740" height="414"></figure><p>How do we ensure our APIs have robust documentation without falling in to the deep, dark abyss of maintenance?</p><p><strong>2. Stability and consistency</strong></p><p>APIs should not change dramatically or quickly and should still support users <em>longgg</em> after they&apos;ve been deprecated. API URLs and client libraries should include versions in the URL or package, and any breaking change to the API should result in a bump of the major version. Backwards compatibility is important - you can&apos;t just remove things from and change your API willy-nilly or you&apos;ll break your clients&apos; code. Big no no.</p><p>So how do we seamlessly integrate mechanisms for implementing versioning and backwards compatibility checks to ensure things like this don&apos;t happen?</p><p><strong>3. Meeting your user where they are</strong></p><p>The user-experience when integrating with your API should be an enjoyable one. This means client libraries in your users&apos; favourite language that feel natural to adopt. It doesn&apos;t mean spending hours crafting custom wrappers on REST endpoints to make these libraries available.</p><figure class="kg-card kg-image-card"><img src="https://storage.googleapis.com/files.memos.alisx.com/2022/09/36d5510f3df4b8a5.png" class="kg-image" alt loading="lazy" width="250" height="187"></figure><p>How do we support diverse options for accessing APIs without spending time manually writing client libraries which need to be edited every time there&apos;s a change to the API?</p><h2 id="enter-alis-build">Enter Alis Build</h2><p><em>The Alis Build platform makes easy to use protos to define &#xA0;APIs and supercharge the user experience.</em></p><p>All of our APIs are defined using <a href="https://developers.google.com/protocol-buffers">Protocol Buffers</a>, which form the basis for everything that is created on Alis Exchange. After <a href="https://alis.build/guides/getting-started/developer-flow.html#release-protocol-buffer">creating a proto</a>, <a href="https://alis.build/guides/getting-started/developer-flow.html#define-methods-and-message">defining the API definition</a> and <a href="https://alis.build/guides/getting-started/developer-flow.html#release-protocol-buffer">releasing this definition</a>, it enables us to automate many of the best practices that lie at the heart of creating great APIs.</p><p><strong>1. Documentation</strong></p><p>The core principles for documentation on Alis Exchange are:</p><ol><li>Documentation should be generated and not maintained.</li><li>The process for creating documentation needs to live as close to the developer experience as possible.</li></ol><p>Alis takes the process for creating and maintaining docs and seamlessly integrates it into the developer experience. <a href="https://alis.build/guides/how-to-guides/auto-generated-docs.html">Reference documentation is generated</a> directly from the API definitions in your protos and custom documentation lives next to the protos. All you need to do is run an <code>alis docs release</code> and allow us to handle the rest. A couple files from the developer results in a fully generated docs website.</p><p><em>Check out <a href="https://docs.de.alis.services">docs.de.alis.services</a> to see for yourself!</em></p><p><strong>2. &#xA0;Stability and consistency</strong></p><p>Alis has backwards compatibility checks and versioning baked into our process. When running <code>alis proto release</code>, breaking changes are immediately detected which prevent broken client libraries and auto-generated REST APIs from making their way into production.</p><pre><code class="language-shell">$ alis proto release xmpl.br.resources-books-v1
ERROR   rpc error: code = FailedPrecondition desc = protocol_buffer (protocolBuffers/xmpl.br.resources.books.v1) is not backwards compatible:
           CONFLICT: &quot;ListBooksResponse&quot; field: &quot;next_page_token&quot; has been removed, but is not reserved [books.proto]</code></pre><p>API versioning is also enforced at the design level, as all newly created APIs <strong>must</strong> specify a version. This version is then carried through to the client packages and API URLs.</p><p><strong>3. Meeting your user where they are</strong></p><p>When running <code>alis proto release</code> client packages are immediately generated in Go, Python and Javascript, with support for many additional languages coming soon. REST APIs for traditional JSON support are also auto-generated.</p><p>Gone are the days of creating the impression that you support a range of languages when in fact you are simply making a REST call from the language. Also, no need to go through the efforts of updates when you add features to your API. You simply focus on your protos and ... I feel like I&apos;m repeating myself now.</p><h2 id="ready-to-build-your-own-apis">Ready to build your own APIs?</h2><figure class="kg-card kg-image-card"><img src="https://storage.googleapis.com/files.memos.alisx.com/2022/09/4e20ed32f96e0fdf.png" class="kg-image" alt loading="lazy" width="512" height="302"></figure><p>Want to start using next-generation tooling that will eliminate toil from your development process, turn your every-day developer into a quality software engineer and take your APIs from good to great? <a href="https://alisx.com">Reach out to us</a>.</p>]]></content:encoded></item><item><title><![CDATA[Everyone is an API]]></title><description><![CDATA[<p>Every industry and sector has a language all of its own. A short hand honed over many years to increase the speed of communication and information flow between parties. Unfortunately, these same terms that industry insiders find useful are the reason that new entrants struggle.</p><p>API is one such term.</p>]]></description><link>https://memos.alisx.com/everyone-is-an-api/</link><guid isPermaLink="false">63973e6dd0c8f5000128aa71</guid><dc:creator><![CDATA[Jan Krynauw]]></dc:creator><pubDate>Wed, 28 Sep 2022 14:45:00 GMT</pubDate><content:encoded><![CDATA[<p>Every industry and sector has a language all of its own. A short hand honed over many years to increase the speed of communication and information flow between parties. Unfortunately, these same terms that industry insiders find useful are the reason that new entrants struggle.</p><p>API is one such term. As a very simple example, an API will take in a <em>request</em> from a <em>user</em>, <em>process</em> the information required to answer this request and return a <em>response</em> back to the same user.</p><figure class="kg-card kg-image-card"><img src="https://lh3.googleusercontent.com/v5GPxZ31Z-CpjYasMXfz5IH4E9Jca3TQWcvpCw3RzaOo-hHGUK3kjMbWi37tAJ1hlqMH76h9ucmLlMCKuxSssAy8nizXC8tGBK2aEOr8YjDzg7Vk1NjZ5o1jG_xMF7SPAzPfJAdUFLe8p0vva8KuZm3EFeE6w5iNFcoFIAC_PZLZN_jD972EWfCR" class="kg-image" alt loading="lazy"></figure><h2 id="how-is-everyone-an-api-then">How is everyone an API then?</h2><p>Everyday we take in requests from our colleagues, service providers and clients. Using our experience and knowledge we formulate an answer using our memories, spreadsheets, disparate pieces of software and possibly even pieces of paper. We return our answers using our voices, emails and chat messages, trusting that the requester understands what we have returned and that is it in a format that they can use.</p><p>Similar to a poorly designed API, at times our responses can come too late to be useful as we were working on another task. Or, we forgot a small important aspect that needed to be considered. In addition, how we deliver the answer and in what format can change from day to day.</p><h2 id="business-logic-to-api">Business logic to API</h2><p><em><strong>What would happen if we could turn our business logic into an API?</strong></em><br>Core business functions typically &#xA0;become repeatable, accessible and independent of a person or group of people. This means that effort does not have to scale linearly with business growth.</p><p>Embarking on this journey will cause one to think deeply about your process and will illuminate hidden assumptions and trade offs being made by you and your team. An additional benefit is that you will be able to identify points of failure and risk in your process.</p><p>Using <a href="https://alis.build/guides/getting-started/introduction.html">Alis Build</a>, it becomes simple to encode your business logic into APIs that can be made accessible to colleagues, service providers and clients. Grow your business without growing the often unconsidered burden of effective communication.</p>]]></content:encoded></item><item><title><![CDATA[Calling truce on the IT vs. Business holy war]]></title><description><![CDATA[<p>Today, you are likely to find a divide between the <strong><em>technical</em></strong> teams who implement technology solutions and the <strong><em>business</em></strong> teams, or stakeholders, who specify requirements for solutions in their domains. The technology expertise needed to solve problems and the domain expertise needed to know which problems should be solved exists</p>]]></description><link>https://memos.alisx.com/is-the-division-between-business-and-tech-teams-outdated/</link><guid isPermaLink="false">63973df7d0c8f5000128aa66</guid><dc:creator><![CDATA[Madelein]]></dc:creator><pubDate>Mon, 26 Sep 2022 14:43:00 GMT</pubDate><content:encoded><![CDATA[<p>Today, you are likely to find a divide between the <strong><em>technical</em></strong> teams who implement technology solutions and the <strong><em>business</em></strong> teams, or stakeholders, who specify requirements for solutions in their domains. The technology expertise needed to solve problems and the domain expertise needed to know which problems should be solved exists in seldom interacting and quite often antagonistic silos.</p><p>These silos can not only have a negative impact on the quality of solutions, but also have damaging effects on organisational culture.</p><p>But need this status quo persist?</p><p><strong><em>Business requirements</em> kill innovation</strong></p><p>The following dance will feel all too familiar for far too many in the world of enterprise and technology:</p><p>A business team has a problem. There is some process or piece of operations that needs to be made more effective or efficient. A nice web application to replace and partially automate the incumbent Excel laden process would be nice. And so the business team does what business teams do - they write a set of <em>business requirements</em>. Though well meaning, these business requirements are usually flawed - they&apos;re wrong and premature.</p><p>Firstly, business teams usually do not have the necessary technical exposure to know what is possible, their solution space is limited. Secondly, little opportunity is left for experimenting and iterating on a solution in an agile manner, where both the technical and business domain knowledge areas are at hand. This will usually lead to the recreation of a spreadsheet on the internet which, in most cases, is just a worse spreadsheet.</p><p>The technical team, having received a list of <em>features</em> to implement rather than <em>problems</em> to collaboratively solve will look unquestioningly at said business requirements and then simultaneously scoff at their naivety and cringe at their impracticality. Then it&apos;s off to the salt mines to hack together just enough javascript to pass muster at the next sprint review.</p><p>Act 2 starts when the business team then receives exactly what was asked for, but observe that they are still failing to realize the efficiency and effectiveness benefits that were the original objective. The fix - more business requirements in greater detail, more scoffs and the dance continues.</p><figure class="kg-card kg-image-card"><img src="https://storage.googleapis.com/files.memos.alisx.com/2022/09/b764df9555c857b1.png" class="kg-image" alt loading="lazy" width="882" height="864"></figure><p>The outcome? In the worst case scenario, the development team often needs to go back multiple times and rework the solution in order to meet objectives. In the best case scenario, the solution will &#x201C;work&#x201D;, but the organisation gains no competitive advantage since no opportunity for innovation at the intersection of the problem context and technologies/tools was created.</p><p>At Alis Exchange we hold the strong belief that in order to innovate towards the best possible solution for a problem, you need to have a good grasp of both the technologies or tools that are available, as well as a solid understanding of the problem context. A separation between these knowledge domains will ultimately lead to a subpar solution.</p><p><strong>Damage to organisational culture</strong></p><p>Divisions between the technical and business domains creates friction between teams and often leads to an atmosphere of outright hostility between <em>IT</em> and <em>Business</em>.</p><p>Technical teams often feel that the business teams do not have an appreciation for the work they do. Software engineering is a demanding craft and elegant, robust solutions take time and effort.</p><p>It is easy for an MBA to wave their hands and softly mutter <em>&quot;software software software&quot;</em> but those that live in the real world have to deal with scalability, extensibility, maintainability, security and a myriad of other important implementation considerations. The lack of appreciation for technical skills coupled with unrealistic expectations leads to a lack of motivation and an incentive to fight against being asked to do anything. IT teams invented <em>soft quitting</em> long before TikTok popularised the idea.</p><figure class="kg-card kg-image-card"><img src="https://storage.googleapis.com/files.memos.alisx.com/2022/09/ad1799211d5de68d.webp" class="kg-image" alt loading="lazy" width="353" height="400"></figure><p>Business teams, on the other hand, often misinterpret technical challenges as IT <em>&quot;getting in the way&quot;</em>. The sentiment is that the <em>techies</em> are just having fun whispering to computers while the <em>grown ups</em> in our corner are shouldering the burden of figuring out how to serve our customers and grow the business.</p><p>As an illustration of how deep-set this holy war goes ask yourself,<em> &quot;which of the above two arguments did I find myself most agreeing with?&quot;</em> And if the answer is either then you&apos;re part of the problem.</p><p><strong>How do we avoid this?</strong></p><p>Ultimately, you want to break down barriers to these knowledge areas. There are many solutions out there that are democratising the understanding and use of technologies, and there are also many ways in which organisations can give their teams more insight into the context of the problems that the business is aiming to solve.</p><p><em>Breaking down the barrier to building software</em></p><p>Given today&#x2019;s accessibility of information, anyone can give themselves an education on the basic technology concepts like what an API is. It might be unrealistic to become an expert, but you should be able to have a meaningful conversation with a developer expert and understand what tools are used for which purposes. Not understanding the basics of what an API is today, is like not being able to use Microsoft Office Word 10 years ago.</p><p><em>Breaking down the barrier to the problem context</em></p><p>All individuals, including developers, working on solving a given problem, must feel the pain of the customer. Organisations should work to make customer feedback and interviews accessible to all team members. Nothing beats observing a customer in the problem context first hand! Nothing makes you understand customer paint points more than eating your own dog-food by becoming a user yourself.</p><p><em>Should we even have separate expert teams today?</em></p><p>One could argue that information or expertise on how to build software is a lot more accessible today. You do not necessarily need to be an expert to start building your first piece of software. It is however much harder to acquire a deep understanding of the problems that are experienced in a certain domain. This requires first hand experience and time.</p><p>Platforms like <a href="https://alis.build/guides/getting-started/introduction.html">Alis Build</a> also make building software a lot more accessible. Ultimately providing you with a <em>control plane</em> that makes it easy to configure the components you need to build robust, scalable and secure software solutions.</p><p>Organisations can afford to invest less resources into building up silos of technical expertise on how to build software and should now invest elsewhere to differentiate the quality of their solutions. What will differentiate them today is how well they can innovate at the interaction of the deep understanding of their problem domain and available tools and technologies.</p><p>Can this really be done effectively if teams operate in silos? Perhaps we have arrived at a new future where specialised silos are no longer needed and all individuals contribute to the digital economy to help solve problems?</p><p>Think this is still far away? I leave you with this example. Twenty years ago, asset managers differentiated themselves by adopting Excel as a tool. And purely having a team of experts that knew how to use Excel was a differentiator. Later on, everyone knew how to use Excel, but it was in how well you translated your problem into an Excel model that differentiated you. Needless to say, no matter how well you use Excel today, it does not really give you much advantage.</p><p>Today we again find ourselves in a place where it is not really special to have a team of developer experts that know how to build software. So what will differentiate us?</p>]]></content:encoded></item><item><title><![CDATA[What makes a great API definition?]]></title><description><![CDATA[<blockquote>There are only two hard things in Computer Science: cache invalidation and naming things. <br>Phil Karlton</blockquote><p>Why is it so hard to name things? Or more precisely, why is it so hard to pick a set of symbols that reliably communicate the intended meaning to the interpreting audience? And why</p>]]></description><link>https://memos.alisx.com/what-makes-a-great-api-definition/</link><guid isPermaLink="false">6397351569cd02000194646c</guid><dc:creator><![CDATA[Jan Krynauw]]></dc:creator><pubDate>Wed, 21 Sep 2022 14:05:00 GMT</pubDate><content:encoded><![CDATA[<blockquote>There are only two hard things in Computer Science: cache invalidation and naming things. <br>Phil Karlton</blockquote><p>Why is it so hard to name things? Or more precisely, why is it so hard to pick a set of symbols that reliably communicate the intended meaning to the interpreting audience? And why is it particularly difficult to name things within information systems?</p><p>Let&#x2019;s unpack the three tensions of naming that excellence that underly these difficulties:</p><p><strong>Bridging the Tech / Business divide</strong></p><p>Ill considered names exacerbate divides. Usually the culprit is a technologist lazily exporting their database schema.</p><p>Excellence requires building definitions around deep understanding of the words used by domain practitioners and the meaning attached to these words.</p><p>At the same time, definitions must be usable. This means implementing a definition in such a way that it can be efficiently modeled and typed.</p><p><strong>Balancing stability with extensibility</strong></p><p>Well developed definitions are stable but extensible. Too much change creates chaos. Rigidity means that the world will pass you by.</p><p><strong>Goldilocks specificity</strong></p><p>Too general, and what&#x2019;s the point. Too specific and what&#x2019;s the point. The point of a well defined definition layer is the &#x201C;not too hot&#x201D;, &#x201C;not too cold&#x201D; level of compromise of standardization enabling the specific needs of individual use cases.</p><hr><h3 id="let%E2%80%99s-take-an-example-defining-an-%E2%80%9Cinstrument%E2%80%9D-in-the-asset-and-wealth-management-industry">Let&#x2019;s take an example: defining an &#x201C;Instrument&#x201D; in the asset and wealth management industry</h3><p>First, what is it that we are actually trying to define here. Going from, &quot;we all implicitly know what this is&quot; to &quot;this is what we are actually trying to define here&quot; is difficult.</p><pre><code class="language-protobuf">// An Instrument is a financial asset or series 
// such as an equity, bond, commodity, currency pair or index. 
message Instrument {
	// TODO: let&apos;s define an instrument
}</code></pre><p>Next, let&apos;s decide how this thing will be named. Immediately things get tricky. The name itself carries information. Across Alis Exchange we strongly encourage the use of Resource Oriented Design naming conventions (read more <a href="https://google.aip.dev/122">here</a>) to help users more easily intuit the collection or sub-collection a resource belongs to and anticipate how to use and work with these names.</p><p>In this case, any user can rely on the fact that the ID portion of an instrument name is either a FIGI from the OpenFIGI database or a custom created FIGI that obeys the same naming conventions (read more <a href="https://www.openfigi.com/assets/content/figi-check-digit-2173341b2d.pdf">here</a>) and reason accordingly.</p><pre><code class="language-protobuf">// An Instrument is a financial asset or series 
// such as an equity, bond, commodity, currency pair or index. 
message Instrument {
	// The instrument name is the unique identifier across organisations.
    // Format: instruments/{instrument}. 
	// {instrument} must be a valid Bloomberg or custom FIGI,
    // as defined by www.openfigi.com..
    string name = 1;
}</code></pre><p>Now we start to add the fields that define an <code>Instrument</code> object. The security description and display_name intentionally deviate from the OpenFIGI specification. We thoughtfully decided to deviate from the definition after weighing the needs of users of the system against the value of adhering to a global specification.</p><p>For some fields, it is also helpful to enumerate possible values. For example, we want to restrict Market Sector to a set of choices that data producers and consumers can more easily reason about. Safety and usability often go hand in hand.</p><pre><code class="language-protobuf">// Instrument is a resource in the IN domain.
message Instrument {
    // ...
    // Figi Type. Either a global or custom FIGI, else set to unspecified
    FigiType figi_type = 2;
    // Human readable display name
    string display_name = 3;
    // Security Description
    string description = 4;
    // Market Sector
    // The asset class/category of the particular instrument
    // Format: EQUITY, MONEY_MARKET, etc.
    MarketSector market_sector = 5;
    // The instrument market sector
    enum MarketSector {
        // Market Sector not specified
        MARKET_SECTOR_UNSPECIFIED = 0;
        // Commodities
        COMMODITY = 1;
        // Corporate Bonds
        CORPORATE = 2;
        // Currency
        CURRENCY = 3;
     //...
}</code></pre><p>It is important to know where to draw the boundary of a definition. For example, in an early version of the API definition we added fields that would allow users to store instrument data relevant to their compliance process. We later realized that this data would be better managed in a separate service and therefore decided to safely deprecate the field.</p><pre><code class="language-protobuf">// Instrument is a resource in the IN domain.
message Instrument {
    // ...
    // Compliance attributes
    // A set of attributes specific to the compliance domain
    Compliance compliance = 13 [deprecated = true];
    // All compliance related attributes.
    message Compliance {
        // UCITS attributes.
        Ucits asisa = 1;
    // ...
}</code></pre><p>And finally, a well designed API bridges the Tech / Business divide by well documenting domain relevant information within the API. For example, the <code>Instrument</code> definition has a set of fields that enable the user to store associations to other external identifiers used by market data providers (such as SEDOL, CUSIP, RIC and PermId). These fields are well documented with the information a user needs to understand the field and a reference to sources of further information where applicable.</p><pre><code class="language-protobuf">// Instrument is a resource in the IN domain.
message Instrument {
    // ...
    // External identifiers
    ExternalIDs external_ids = 8;
    // External identifiers
    message ExternalIDs {
        // figi as defined by www.openfigi.com.
        // If no figi is provided, a custom figi will be created using the remaining attributes.
        string figi = 1;
        // Composite Financial Instrument Global Identifier - The Composite Financial Instrument Global Identifier
        // (FIGI) enables users to link multiple FIGIs at the trading venue level within the same country or market
        // in order to obtain an aggregated view for an instrument within that country or market.
        string composite_figi = 2;
        // Share Class Financial Instrument Global Identifier - A Share Class level Financial Instrument Global Identifier
        // is assigned to an instrument that is traded in more than one country. This enables users to link multiple
        // Composite FIGIs for the same instrument in order to obtain an aggregated view for that instrument across all
        // countries (globally).
        string share_class_figi = 3;
        // ISIN
        // An International Securities Identification Number (ISIN) is a code that uniquely identifies a specific
        // securities issue.
        string isin = 4;
        // SEDOL (Stock Exchange Daily Official List)
        // a list of security identifiers used in the United Kingdom and Ireland for clearing purposes.
        // The numbers are assigned by the London Stock Exchange, on request by the security issuer.
        string sedol = 5;
        // CUSIP
        // a nine-digit numeric (e.g. 037833100 for Apple) or nine-character alphanumeric (e.g. 38259P508 for Google)
        // code that identifies a North American financial security for the purposes of facilitating clearing and
        // settlement of trades.
        // https://en.wikipedia.org/wiki/CUSIP
        string cusip = 6;
        // RIC (Reuters instrument code)
        // is a ticker-like code used by Refinitiv to identify financial instruments and indices.
        // https://en.wikipedia.org/wiki/Reuters_Instrument_Code
        string ric = 7;
        // Primary RIC (Reuters instrument code)
        // is a ticker-like code used by Refinitiv to identify financial instruments and indices.
        // https://en.wikipedia.org/wiki/Reuters_Instrument_Code
        string primary_ric = 8;
        // Bloomberg Ticker
        // a string of characters or numbers to identify a company or entity uniquely in Bloomberg.
        string bloomberg_ticker = 9;
        // MSCI Security Code is a unique identifier assigned to each security by MSCI.
        string msci_sec_code = 10;
        // A Central Index Key or CIK number is a number given to an individual, company, or foreign government by
        // the United States Securities and Exchange Commission. The number is used to identify its filings in
        // several online databases, including EDGAR.
        string cik = 11;
        // InvestOne Id
        // InvestOne is an investment accounting solution for institutional asset managers.
        string invest_one = 12;
        // Morningstar SecId
        string morningstar_sec_id = 13;
        // Morningstar CompanyId
        string morningstar_company_id = 14;
        // MCH Id
        // MCH (Multi-Currency Horizon) is an investment accounting solution for institutional asset managers.
        string mch = 15;
        // Multifonds Id
        // Multifonds is an investment accounting solution for institutional asset managers.
        string multifonds = 16;
        // Fundamental Id
        // Fundamental is an investment accounting solution for institutional asset managers.
        string fundamental = 17;
        // Morgan Stanley Id
        // Morgan Stanley is an investment trading solution provider for institutional asset managers.
        string morgan_stanley = 18;
        // JSE Alpha Code
        // The ticker used by the Johannesburg Stock Exchange
        string jse_alpha_code = 19;
        // Refinitiv PermID
        // PermIDs are open, permanent and universal identifiers where underlying attributes capture the
        // context of the identity they each represent.
        // https://permid.org/
        string perm_id = 20;
        // Datastream Symbol
        string datastream_symbol = 21;
        // IEX Identifier
        string iex_id = 22;
    }
    // ....
}</code></pre>]]></content:encoded></item></channel></rss>