Picking the Right Database – Open Source For You

MMS Founder
MMS RSS

Posted on nosqlgooglealerts. Visit nosqlgooglealerts

Right Database

The right database is what you need for your application’s success. Here we cover the key database types as well as what you should check before choosing one for your application.

In today’s data-driven world, businesses and organisations are faced with a wide range of options when it comes to selecting a database system to handle their data storage and management needs. The choice of the right database is crucial as it can significantly impact the performance, scalability, and overall success of an application or a project. Whether you are building a high-traffic e-commerce website, developing a mobile application, or working on a complex data analytics project, understanding the intricacies of database selection can help you build a robust and efficient system. So let’s explore the essential considerations for selecting the right database for different use cases along with the types of databases and their pros/cons.

  • Data model: The primary aspect is the nature of data that you wish to store. Data can be structured or unstructured, and can range from being a simple key-value to storing a document against a key. It can be data against a domain entity or relationships among the domain entities. Based on these use cases you can end up with primarily row-based, column-based, document-based or graph-based modelling at a high level. The data modelling in itself is heavily influenced by the domain modelling and design.
  • Query patterns/use cases: Application read and write patterns are a key decider because the data being stored is eventually for an application to read or write. So it’s crucial to make it read and/or write friendly. As one delves into the data flow level details of any application design, the query patterns become clearer. For instance, an application may want to look up a particular value against a key, in which case a row/document oriented database would make more sense, or say, get the keys for a range of values, in which case a columnar database would be a better choice.
  • CAP theorem: Production databases are generally deployed as distributed systems for the sake of fault tolerance and reliability. Hence various factors come into play, namely, consistency (i.e., how consistent is the value returned by all the members in a cluster), availability (i.e., how operational is the system despite failures or network partitions), and partition tolerance (i.e., how tolerant is the distributed system for network failures among the members in the cluster). The famous CAP theorem helps one disambiguate as to what is required and what can be traded off among consistency, availability and partition tolerance. Given network partitions are practically unavoidable, if your use case demands consistency then you may need to trade off availability or vice versa. For instance, in a simple 2-node database system (one master and one replica), if the use case demands consistency then the master will need to block the transactions against a certain key until the slave also gets updated for that key. However, during this window of master-replica synchronisation, any updates against the key will be blocked, thereby trading off the availability.
  • Scale: As you get into the non-functional aspects of the system, scale requirements get crucial. This concerns forecasting the volume of data and requests to the database. A few systems scale well horizontally while others do so vertically, and in some use cases, certain keys can end up being heavily accessed.
  • Performance: This involves assessing the performance requirements of your application. At some point of system design, you will understand which queries are read-heavy and which are write-heavy. The application response time decides the database transaction latency requirements.
  • Interoperability with ecosystem: A database may never end up being called only from one or two services. Over time new requirements can add up, and your database technology should be able to communicate with the rest of your infrastructure with ease. For instance, as your organisation expands you may wish to export the data from your database to a warehouse or, say, trigger actions on row updates, at which point your database should integrate well with the adjacent technologies in your architecture. You can also look into the ecosystem support for the technology choice – in terms of how good the support is, open source knowledge and off-the-shelf available libraries (for example, ORM or object-relational mapping to manage the data access for relational databases).
  • Security and compliance: In this age of growing fraud, security mechanisms like authentication, authorisation, encryption at rest and/or in transit are pretty basic offerings that you must look for. Compliance requirements can vary based on the organisation and can include handling sensitive data, ensuring the database complies with regulations, auditing, etc.
  • Development and operational overhead: Eventually, it is the developers who will maintain the system and hence need to ensure that their life is going to be easy while dealing with the decided choice. For instance, some databases are serverless while some need you to create and manage your own cluster. One also needs to evaluate how steep the learning curve will be for a newbie joining the team to learn about the technology.
  • Cost: Cost is an important consideration when making the selection. Consider not only the upfront costs but also the long-term costs associated with scaling, maintenance, and support. Some databases are free to use while some are licensed.

Types of databases

Let’s look into the broad types of databases based on data modelling that will usually be a pivot point for you to start making the choice.

Relational/row-based databases

  • These databases store and organise data in the form of tables using rows and columns with a predefined schema. They are ideal for handling complex querying (e.g., joins between tables), transactional support (through commits/rollbacks), and data integrity (through constraints like primary/foreign key, etc) to support ACID properties. These are also called SQL-based databases, given SQL is the most common form of accessing data.
  • A major downside is the schema extensibility and that makes these less suited for non-structural data or data whose structure is not known fully and can vary over time. This is where NoSQL (not only SQL) databases find their fit.
  • Examples include MySQL, Postgres, and Oracle databases. These are widely used in finance/banking domains where data consistency/integrity is of paramount importance, and also ERP and CRM.

Columnar-based databases

  • Unlike row-based databases, where data is stored as rows on the disk, columnar databases store data as columns, thereby optimising for queries against columns. Hence, they find good use for analytical queries. These databases are often used as data warehouses for business intelligence and reporting. Examples are Apache Cassandra and AWS Redshift.
  • These databases are not optimal for transactional workloads that demand high concurrency as they are generally optimised for read-heavy workloads. They could also be an overkill when your data set is small and doesn’t demand an analytical set of use cases but rather needs ACID properties. The read cost increases based on how many columns you like to pick in the query.

Document-oriented databases

  • These databases store data in self-describing documents in JSON/BSON or any custom form that is flexible/dynamic in schema. The structure of documents can be easily extended over time, and each key can have its own structure of the document. General use case is storing various attributes against a domain entity. They are indexed using one or more keys or even using attributes for a few technologies.
  • Examples are MongoDB and CouchDB; almost every modern-day application can be found using these databases.
  • You can choose between technologies based on consistency and availability needs, as discussed with respect to the CAP theorem earlier in this article. Examples include MongoDB and AWS DynamoDB.

Key-value databases

  • These are simple databases used to store values against a key. The key spaces are highly partitional and horizontally scalable, making these best suited for high throughput, low latency reads and write use cases.
  • Examples of key-value databases include Redis, Riak DB, and AWS DynamoDB. A few databases serve a dual purpose – both as a key-value store and as a document database. For instance, AWS DynamoDB can be used as a document database (to store a document against a key) or even a simple value against a key.

Graph databases

  • These databases model data in the form of a graph, and use nodes and edges. These nodes and edges can have properties. They are well suited for modelling highly connected data and conducting complex multi-hop traversals, reverse lookups and relationship analysis which is either too complex with other databases or even impossible to achieve.
  • Examples include Neo4j, AWS Neptune, and Azure Cosmos DB.

Time series databases

  • These are designed for efficient storage, retrieval and analysis of timestamp-based information like sensor data, system metrics like CPU, memory usage, financial market data, etc. Trying to achieve these use cases with other databases will mean conducting complex queries or incurring a lot of I/O cost, which is where time-series databases come to the rescue.
  • Examples include Influx DB and Open TSDB.

In-memory databases

  • For high performance/low latency applications that demand microsecond range of read/write latency (as opposed to other databases that usually deliver milliseconds range performance), in-memory databases are the choice. The improved performance is because data is stored and accessed from the primary memory/RAM as opposed to another database that involves disk I/O.
  • The downside over other databases is the cost. Because primary memory is generally more costly than disk, one pays a higher cost for the benefit of low latency while choosing in-memory databases. Examples include SAP HANA and Redis.

Besides these, there are several other database types such as ledger databases, spatial databases, and vector databases that are popular for large language models or LLMs and have made a mark in different fields. I’ve covered just the top commonly used database types for sake of the article’s length.

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


ScyllaDB Is Moving to a New Replication Algorithm: Tablets – The New Stack

MMS Founder
MMS RSS

Posted on nosqlgooglealerts. Visit nosqlgooglealerts

<meta name="x-tns-categories" content="Data / Software Development / Storage“><meta name="x-tns-authors" content="“>

ScyllaDB Is Moving to a New Replication Algorithm: Tablets – The New Stack

Should JavaScript developers abandon libraries and write directly to the HTML Document Object Model?

CONTEXT: JavaScript co-founder Douglas Crockford recommends this approach as the best way to build web apps.

Yes. Most JavaScript libraries are so bloated that it’s easier to write directly to the DOM now.

0%

No, it is impractical. The DOM is imperative, not declarative. You need event handlers everywhere.

0%

No, because people will not learn the DOM — it is too weird.

0%

I dunno, I’m just here for the free beer.

0%

2023-08-02 06:31:31

ScyllaDB Is Moving to a New Replication Algorithm: Tablets

sponsor-scylladb,sponsored-post-contributed,

Support for tablets is in experimental mode using Raft. This ultimately will allow ScyllaDB to scale faster and in parallel.


Aug 2nd, 2023 6:31am by


Featued image for: ScyllaDB Is Moving to a New Replication Algorithm: Tablets

Like Apache Cassandra, ScyllaDB has historically decided on replica sets for each partition using Vnodes. The Vnode-based replication strategy tries to evenly distribute the global token space shared by all tables among nodes and shards. It’s very simplistic. Vnodes (token space split points) are chosen randomly, which may cause an imbalance in the actual load on each node.

Also, the allocation happens only when adding nodes, and it involves moving large amounts of data, which limits its flexibility. Another problem is that the distribution is shared by all tables in a keyspace, which is not efficient for relatively small tables, whose token space is fragmented into many small chunks.

In response to these challenges, ScyllaDB is moving to a new replication algorithm: tablets. Initial support for tablets is now in experimental mode.

Tablets allow each table to be laid out differently across the cluster. With tablets, we start from a different side. We divide the resources of the replica-shard into tablets, with a goal of having a fixed target tablet size, and then assign those tablets to serve fragments of tables (also called tablets).

This will allow us to balance the load in a more flexible manner by moving individual tablets around. Also, unlike with Vnode ranges, tablet replicas live on a particular shard on a given node, which will allow us to bind Raft groups to tablets.

This new replication algorithm allows each table to make different choices about how it is replicated and for those choices to change dynamically as the table grows and shrinks. It separates the token ownership from servers, ultimately allowing ScyllaDB to scale faster and in parallel.

Tablets require strong consistency from the control plane; this is provided by Raft. We talked about this detail in the ScyllaDB Summit talk below (starting at 17:26).

Raft vs. Lightweight Transactions for Strongly Consistent Tables

ScyllaDB is in the process of bringing the technology of Raft to user tables and allowing users to create strongly consistent tables that are based on Raft. We already provide strong consistency in the form of lightweight transactions, which are Paxos-based, but they have several drawbacks.

Generally, lightweight transactions are slow. They require three rounds to replicas for every request and they have poor scaling if there are conflicts between transactions. If there are concurrent conflicting requests, the protocol will retry due to conflict. As a result, they may not be able to make progress. This will not scale well.

Raft doesn’t suffer from this issue. First and foremost, it requires only one round to replicas per request when you’re on the leader — or even less than one per request because it can batch multiple commands in a single request. It also supports pipelining, meaning that it can keep sending commands without waiting for previous commands to be acknowledged. The pipelining goes down to a single CPU on which every following state machine runs. This leads to high throughput.

But Raft also has drawbacks in this context. Because there is a single leader, Raft tables may experience latency when the leader dies because the leader has to undergo a failover. Most of the delay is actually due to detection latency because Raft doesn’t switch the leader back and forth so easily. It waits for 1 second until it decides to elect a new leader. Lightweight transactions don’t have this, so they are theoretically more highly available.

Another problem with Raft is that you have to have an extra hop to the leader when the request starts executing not on the leader. This can be remedied by improving drivers to make them leader-aware and route requests to the leader directly.

Also, Raft tables require a lot of Raft groups to distribute load among shards evenly. That’s because every request has to go through a single CPU, the leader, and you have to have many such leaders to have even load. Lightweight transactions are much easier to distribute.

Balancing the Data across the Cluster

So let’s take a closer look at this problem. This is how the load is distributed currently using our standard partitioning (the Vnode partitioning), which also applies to tables that use lightweight transactions.

Replication metadata, which is per keyspace, determines the set of replicas for a given key. The request then is routed to every replica. On that replica, there is a sharding function that picks the CPU in which the request is served, which owns the data for a given key. The sharding function makes sure that the keys are evenly distributed among CPUs, and this provides good load distribution.

The story with Raft is a bit different because there is no sharding function applied on the replica. Every request that goes to a given Raft group will go to a fixed set of Raft state machines and Raft leader, and their location of CPUs is fixed.

They have a fixed shard, so the load distribution is not as good as with the sharding function with standard tables.

We could remedy the situation by creating more tokens inside the replication metadata so that we have more ranges and more narrow ranges. However, this creates a lot of Raft groups, which may lead to an explosion of metadata and management overhead because of Raft groups.

The solution to this problem depends on another technology: tablet partitioning.

Tablet Partitioning

In tablet partitioning, replication metadata is not per keyspace. Every table has a separate replication metadata. For every table, the range of keys (as with Vnode partitioning) is divided into ranges, and those ranges are called tablets. Every tablet is replicated according to the replication strategy, and the replicas live on a particular shard on the owning node. Unlike with Vnodes, requests will not be routed to nodes that then independently decide on the assignment of the key to the shard, but will rather be routed to specific shards.

This will give us more control over where data lives, which is managed centrally. This gives us finer control over the distribution of data.

The system will aim to keep the tablets at a manageable size. With too many small tablets, there’s a lot of metadata overhead associated with having tablets. But with too few large tablets, it’s more difficult to balance the load by moving tablets around. A table will start with just a few tablets. For small tables, it may end there. This is a good thing, because unlike with the Vnode partitioning, the data will not be fragmented into many tiny fragments, which adds management overhead and also negatively affects performance. Data will be localized in large chunks that are easy to process efficiently

As tables grow, as they accumulate data, eventually they will hit a threshold, and will have to be split. Or the tablet becomes popular with requests hitting it, and it’s beneficial to split it and redistribute the two parts so the load is more evenly distributed.

The tablet load balancer decides where to move the tablets, either within the same node to balance the shards or across the nodes to balance the global load in the cluster. This will help to relieve overloaded shards and balance utilization in the cluster, something which the current Vvnode partitioner cannot do.

This depends on fast, reliable, fault-tolerant topology changes because this process will be automatic. It works in small increments and can be happening more frequently than current node operations.

Tablets also help us implement Raft tables. Every Raft group will be associated with exactly one tablet, and the Raft servers will be associated with tablet replicas. Moving a tablet replica also moves the associated Raft server.

Additional Benefits: Resharding and Cleanup

Turns out the tablets will also help with other things. For example, resharding will be very cheap. SSTables are split at the tablet boundary, so resharding is only a logical operation that reassigns tablets to shards.

Cleanup is also cheap because cleaning up all data after a topology change is just about deleting the SSTable — there’s no need to rewrite them.

Group
Created with Sketch.

TNS owner Insight Partners is an investor in: Pragma.

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Finalists announced sixth Diversity in Tech Awards – Business Plus

MMS Founder
MMS RSS

Posted on mongodb google news. Visit mongodb google news

The finalists have been announced for the 2023 Diversity in Tech Awards in association with JP Morgan, which take place at the RDS Concert Hall on 27 September.

More than 400 executives from Ireland’s international tech community are expected to attend the event, with Irish aeronautical engineer Dr Norah Patten scheduled to give a keynote address about her experience of breaking the glass ceiling.

A panel discussion entitled The ROI of DEI: Driving Business Profitability through Diversity and Inclusion featuring Steven Fuller of Race In STEM, Angelika Sharygina of Mindguardian, Kyran O’Mahoney of IA Labs and a representative of JP Morgan also set to take place.

Since launch in 2018, The Diversity in Tech Awards have highlighted the shift in companies making workplaces more diverse and inclusive, while also recognising their efforts to narrow the gender gap.

This year the awards have been split into two categories, Diversity in Tech and Women in Tech, in recognition for the efforts of promoting diversity and narrowing the gender gap. The nominations are listed below:

  • Diversity Role Model Award (sponsored by IAS Integral Ad Science) – Accenture (Dublin), Amnexis (Dublin), eBay (Dublin), Merck (Dublin), NCBI – Working for people with Sight Loss (Dublin), Tenable (Dublin), Trinnovo Group (United Kingdom).
  • LGBTQ+ Inclusion Award – Amazon Web Services (United States), Cognizant Technology Solutions (Dublin), eBay (Dublin), Experian Ltd (United Kingdom), Greenhouse Software (Dublin), Microsoft Ireland (United Kingdom), Oracle EMEA Ltd.(Dublin), Workday (Dublin)
  • Disability inclusion Award (sponsored by Carelon Global Solutions) – CPL (Dublin), Employers for Change, The Open Doors Initiative (Dublin), EY (United Kingdom), Fidelity Investments (Dublin), Inclusion and Accessibility Labs (Dublin), SAP SE (Germany)
  • Cultural Inclusion Award – Carelon Global Solutions Ireland (Limerick), Cognizant Technology Solutions (Dublin), eBay (Dublin), Fidelity Investments (Dublin), LinkedIn Ireland (Dublin), Version 1 (Dublin)
  • Health & Wellness Award – Axonista Ltd (Dublin), Carelon Global Solutions Ireland (Limerick), EY (Dublin), LearnUpon (Dublin), MongoDB (Dublin), Tata Consultancy Services (Dublin)
  • Social Impact Award (sponsored by ESB) – Chainlink Labs (United Kingdom), Deloitte (Dublin), Innovate Communities (Dublin), The Big Idea (Dublin), Version 1 (Dublin)
  • Diverse Company of the Year (sponsored by Oracle) – CPL (Dublin), eBay(Dublin), EY (United Kingdom), Fiserv (Dublin), Google (Dublin), MongoDB (Dublin), Salesforce Ireland (Dublin), SAP SE (Germany)
  • Tech Leadership Award (sponsored by FTI Consulting) – Fiserv (Dublin), Inclusio (Dublin), KPMG (United Kingdom), Meta (Saudi Arabia), Microsoft (Dublin), Version 1 (Dublin), Vodafone Ireland (Dublin)
  • Entrepreneurship Award (sponsored by Fiserv)- EudaOrg (Dublin), Online Buzzing (Dublin), Platform55 (Dublin), ProMotion Rewards (Dublin), shareclub (Dublin), Technological University Dublin (Dublin)
  • Digital Transformation Award – Dell (Dublin), Carelon Global Solutions Ireland (Limerick), Citi (United Kingdom), EY (Dublin), J.P. Morgan Chase (United Kingdom) Meta (Saudi Arabia)
  • Trailblazer Award – Fidelity Investments (Dublin), Rent the Runway (Dublin), Johnson & Johnson (Dublin), Meta (Dublin), Mission Unstoppable (Dublin), MongoDB (Dublin), The Big Idea (Dublin), Women in AI (Dublin)
  • Young Female STEM Pioneer (sponsored by Mongo DB) – CodLad(Dublin), EY (Dublin), Open College Network (United Kingdom), University College Dublin (Dublin), Workday (Dublin)
  • Rising Star Award – ESB (Dublin), EY (Dublin), Fidelity Investments (Dublin), Galvia (Galway), Inclusion and Accessibility Labs (Dublin), Revolut (Dublin), Version 1 (Dublin), Version 1 (Dublin)
  • Data Scientist Award (sponsored by J.P. Morgan) – CodLad (Dublin), Ericsson (Dublin), EY (Dublin), EY (Dublin), Women in AI (Dublin)
  • Mentorship Award – Carelon Global Solutions Ireland (Limerick), Deloitte Ireland (Dublin), Fidelity Investments (Dublin), IADT (Dublin), IBM (Dublin), Tenable (Dublin), Verizon Connect (Dublin), Workday (Dublin)

Finalists for the Diversity in Tech Awards are chosen by a judging panel from a wide range of corporate, not-for-profit and consultancy organisations.

Some of this year’s judges include Erica Ryan, regional VP of MongoDB; Lorraine Deschamps, head of corporate citizenship with Fiserv; Gráinne Bryan, senior managing director of technology with FTI Consulting; Vessy Tasheva, founder & CEO of Vessy.com; and Sheree Atcheson, global diversity & inclusion senior exec with Valtech.

“We are extremely excited to bring the Diversity in Tech Awards back to the RDS this year. Since the awards were created in 2018 as the Women in Tech Awards, the event focused on promoting better balance in tech,” said Tracey Carney, managing director of the Diversity in Tech Awards.

Diversity in Tech
The Diversity in Tech Awards take place next month.

“In 2020, we pivoted to the Diversity in Tech Awards, and while continuing to keep women in tech as a core part of the agenda, it has grown into a programme celebrating all facets of diversity within the tech industry.

“The event is not only about celebrating excellence, but also about sharing knowledge and experience. The calibre of finalists this year is exceptional, and we can’t wait to congratulate each and every one of the amazing finalists joining us in September.” 

Photo: Norah Patten.

Article originally posted on mongodb google news. Visit mongodb google news

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Building a Lifelong Technical Career in Software Development

MMS Founder
MMS Ben Linders

Article originally posted on InfoQ. Visit InfoQ

Technical experience matters because it adds to the value chain. In engineering companies, the technical knowledge accumulated by people over many years can provide the basis for the next generation of products and projects. Sven Reimers spoke about building a lifelong technical career in software development at QCon London 2023.

Spotting opportunities to pursue a technical career is typically hard, Reimers mentioned. If you are approached with a task or job, which offers new possibilities or angles on what you are currently doing, try to see beyond the actual assignment and figure out where the road would take you if you stay on it for long enough. If you like what you see, do not be afraid even if it is currently out of your comfort zone – leaving it means learning new things, which in turn makes you a more complete technical expert:

Having been in the same area for about a decade I got an offer to start a new project at another department, so I had to leave friends behind and an environment I knew from the inside out – moving to a domain I was a newbie in, knowing no one and just relying on my own know-how to be successful. I think you get the idea what comfort zone is all about.

To become a primus inter pares, Reimers took the opportunity to openly share his knowledge with his colleagues and learn from their questions. If he couldn’t answer them directly he helped them find an answer or build a solution or even took extra time to improve his knowledge, e.g. reading specs and tutorials for new technologies and trying out stuff by prototyping simple things.

In the end this resulted in a feedback loop, the more questions he answered, the more questions were asked and this increased his technical knowledge and put him into the “primus inter pares” position:

Being in this position increased my visibility in the organisation and opened up new inputs for this learning feedback loop.

If you are really not interested in being a people manager, communicate this clearly in your organisation, Reimers suggested. Show that you are nevertheless interested in taking responsibility for business-critical technical decisions and that you are willing to take the technical lead to realise this:

If you think something is worthwhile to be pursued to be done, e.g. upgrade to a newer version of Java, first get the management onboard. After that, accept that the management gives you the task to make that happen – so accept the responsibility to get this done.

This will show your commitment, your perseverance, your ability to deliver and will give even more influence for upcoming decisions, Reimers concluded.

InfoQ interviewed Sven Reimers about mentoring and leadership in technical careers.

InfoQ: What are the benefits and challenges of mentoring technical people and how can this impact careers?

Sven Reimers: Mentoring people is a rewarding task by itself. Typically you receive positive feedback because mentoring is not a business target, but always a personal interaction. The only challenge I typically see is to have enough time for mentoring. I am always struggling to find the right balance between project/product work and the time budget for mentoring.

Mentoring helps build up your communication skills without being exposed to real world project constraints – it is typically just a one to one communication and you can improve on how you understand other people and even more important on how other people may understand you.

InfoQ: What about leadership skills? Are they needed if someone wants to stay on the technical track?

Reimers: If you want to move beyond a certain level in your career at least basic leadership skills are necessary. There are at least two important reasons for that. Firstly, you are part of a decision process you are shaping with your technical knowledge so you need to reflect on what impact for the business your suggestions will have. Secondly, you will have to communicate your reasoning, so that you can help non technical people better understand the consequences.

About the Author

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Achmea Investment Management B.V. Has $32000 Holdings in MongoDB, Inc. (NASDAQ:MDB)

MMS Founder
MMS RSS

Posted on mongodb google news. Visit mongodb google news

Achmea Investment Management B.V. trimmed its position in MongoDB, Inc. (NASDAQ:MDBFree Report) by 96.9% in the first quarter, according to its most recent Form 13F filing with the Securities and Exchange Commission. The institutional investor owned 137 shares of the company’s stock after selling 4,328 shares during the quarter. Achmea Investment Management B.V.’s holdings in MongoDB were worth $32,000 at the end of the most recent reporting period.

Several other hedge funds and other institutional investors have also recently bought and sold shares of MDB. Bessemer Group Inc. acquired a new stake in MongoDB in the 4th quarter valued at $29,000. BI Asset Management Fondsmaeglerselskab A S bought a new stake in shares of MongoDB in the 4th quarter worth about $30,000. Lindbrook Capital LLC lifted its holdings in MongoDB by 350.0% during the 4th quarter. Lindbrook Capital LLC now owns 171 shares of the company’s stock valued at $34,000 after purchasing an additional 133 shares during the last quarter. Y.D. More Investments Ltd acquired a new position in MongoDB in the fourth quarter valued at about $36,000. Finally, CI Investments Inc. grew its stake in MongoDB by 126.8% during the fourth quarter. CI Investments Inc. now owns 186 shares of the company’s stock worth $37,000 after buying an additional 104 shares during the last quarter. 89.22% of the stock is owned by institutional investors.

MongoDB Price Performance

MDB stock opened at $398.74 on Thursday. The company has a debt-to-equity ratio of 1.44, a quick ratio of 4.19 and a current ratio of 4.19. MongoDB, Inc. has a 52 week low of $135.15 and a 52 week high of $439.00. The company’s 50-day simple moving average is $383.81 and its 200 day simple moving average is $280.54.

MongoDB (NASDAQ:MDBGet Free Report) last released its quarterly earnings results on Thursday, June 1st. The company reported $0.56 earnings per share for the quarter, beating analysts’ consensus estimates of $0.18 by $0.38. MongoDB had a negative net margin of 23.58% and a negative return on equity of 43.25%. The company had revenue of $368.28 million during the quarter, compared to the consensus estimate of $347.77 million. During the same period in the previous year, the business earned ($1.15) earnings per share. The firm’s quarterly revenue was up 29.0% on a year-over-year basis. Sell-side analysts forecast that MongoDB, Inc. will post -2.8 earnings per share for the current fiscal year.

Insider Activity

In other news, CAO Thomas Bull sold 516 shares of the firm’s stock in a transaction on Monday, July 3rd. The shares were sold at an average price of $406.78, for a total transaction of $209,898.48. Following the completion of the transaction, the chief accounting officer now owns 17,190 shares of the company’s stock, valued at $6,992,548.20. The transaction was disclosed in a legal filing with the Securities & Exchange Commission, which is available through this hyperlink. In other news, CAO Thomas Bull sold 516 shares of the stock in a transaction on Monday, July 3rd. The shares were sold at an average price of $406.78, for a total transaction of $209,898.48. Following the completion of the sale, the chief accounting officer now directly owns 17,190 shares in the company, valued at $6,992,548.20. The transaction was disclosed in a filing with the SEC, which is available at this link. Also, CEO Dev Ittycheria sold 50,000 shares of the business’s stock in a transaction on Wednesday, July 5th. The shares were sold at an average price of $407.07, for a total transaction of $20,353,500.00. Following the completion of the transaction, the chief executive officer now owns 218,085 shares in the company, valued at approximately $88,775,860.95. The disclosure for this sale can be found here. In the last three months, insiders have sold 114,427 shares of company stock worth $40,824,961. Corporate insiders own 4.80% of the company’s stock.

Wall Street Analysts Forecast Growth

A number of equities analysts have commented on the company. Barclays boosted their price objective on MongoDB from $374.00 to $421.00 in a research note on Monday, June 26th. Royal Bank of Canada increased their price target on MongoDB from $400.00 to $445.00 in a research note on Friday, June 23rd. 22nd Century Group reissued a “maintains” rating on shares of MongoDB in a research report on Monday, June 26th. 58.com reiterated a “maintains” rating on shares of MongoDB in a research report on Monday, June 26th. Finally, Morgan Stanley lifted their price target on shares of MongoDB from $270.00 to $440.00 in a research note on Friday, June 23rd. One equities research analyst has rated the stock with a sell rating, three have assigned a hold rating and twenty have issued a buy rating to the company’s stock. According to data from MarketBeat.com, the stock has an average rating of “Moderate Buy” and a consensus target price of $378.09.

Check Out Our Latest Report on MDB

MongoDB Profile

(Free Report)

MongoDB, Inc provides general purpose database platform worldwide. The company offers MongoDB Atlas, a hosted multi-cloud database-as-a-service solution; MongoDB Enterprise Advanced, a commercial database server for enterprise customers to run in the cloud, on-premise, or in a hybrid environment; and Community Server, a free-to-download version of its database, which includes the functionality that developers need to get started with MongoDB.

Further Reading

Want to see what other hedge funds are holding MDB? Visit HoldingsChannel.com to get the latest 13F filings and insider trades for MongoDB, Inc. (NASDAQ:MDBFree Report).

Institutional Ownership by Quarter for MongoDB (NASDAQ:MDB)

This instant news alert was generated by narrative science technology and financial data from MarketBeat in order to provide readers with the fastest and most accurate reporting. This story was reviewed by MarketBeat’s editorial team prior to publication. Please send any questions or comments about this story to contact@marketbeat.com.

Before you consider MongoDB, you’ll want to hear this.

MarketBeat keeps track of Wall Street’s top-rated and best performing research analysts and the stocks they recommend to their clients on a daily basis. MarketBeat has identified the five stocks that top analysts are quietly whispering to their clients to buy now before the broader market catches on… and MongoDB wasn’t on the list.

While MongoDB currently has a “Moderate Buy” rating among analysts, top-rated analysts believe these five stocks are better buys.

View The Five Stocks Here

7 Energy Stocks to Buy and Hold Forever Cover

Do you expect the global demand for energy to shrink?! If not, it’s time to take a look at how energy stocks can play a part in your portfolio.

Get This Free Report

Article originally posted on mongodb google news. Visit mongodb google news

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Presentation: Infrastructure as Code: Past, Present, Future

MMS Founder
MMS Joe Duffy

Article originally posted on InfoQ. Visit InfoQ

Transcript

Duffy: Welcome to infrastructure as code: past, present, and future. My name is Joe Duffy, founder, and CEO of Pulumi. I’m here to talk to you about all things infrastructure as code. We’ll start with a little bit of history. Where do we come from? We’ll talk about current state of infrastructure as code and what tools exist out there, and where we might be headed from here.

Where We Came From

Where did we come from? I think you look at the evolution of server-side management and provisioning servers. At the beginning, of course, you’ve got hardware. You’ve got to rack and stack that, move it into a data center. Eventually, virtualization made a lot of this easier. Once you’ve got a server, it’s a stateful machine. If there are dependencies, or pieces of software that need to run on that, of course, how do you install those? The first step is you manually do so. You SSH into a machine. You manually patch it as that software needs to be updated over time. These days a lot of pointing, clicking. We’ve got consoles in all the cloud providers, or even on-prem with vSphere management consoles. All these things have problems. Where we came from was not repeatable. You would go configure some infrastructure, maybe install some packages. What if you needed a second server that looked the same? What if something failed? Repeatability was a challenge with this mode of doing it manually, either through command lines, or in UIs? It also doesn’t scale. I mentioned going from one to two servers. What if you’re going from 1 to 10, or 100, or 1000s? What if you’re going from one environment to multiple environments? It’s easy to make a mistake. If you’re manually running commands, and you fat finger a command and something fails, now you’re in a mode where you have to manually recover from that failure. These sorts of failures, we hear about them all the time. They lead to reliability problems, outages, security problems. There’s definitely a better way to go about things. To foreshadow a little bit, that’s what infrastructure as code is all about.

It sounds familiar. If you look back in the 1970s, back then we were building software packages. How were we building software packages? Again, running manual command lines. We’re compiling software, packaging it up, linking software. From there, we created a tool called Make. Make is an interesting source of inspiration for where we’re going to go in terms of infrastructure as code, in that Make is all about taking some set of inputs, performing some set of commands, and then having some outputs as a result: source code in, compiled program out. The way Make works is actually super interesting, because you’re using a domain specific language. We’ll see that infrastructure as code, many tools have domain specific languages. In either case, Make has to understand dependencies between all of these so-called targets, and then orchestrate the execution of the build process so that those inputs can properly translate repeatably in an automated fashion to those outputs.

You’ll see, a lot of these concepts show up in the way that we have approached how to manage infrastructure and how to automate infrastructure. The first tool that I’ll point to in this evolution is CFEngine. CFEngine was really the first approach of taking a similar approach to what we saw with Make where dependencies can be described. The process of automating infrastructure is encoded in machine readable textual declarations, hence the term infrastructure as code. Infrastructure as code allows you to automate manual processes. We’re not going and SSHing into servers and running manual commands to update packages. We’re really encoding those things as repeatable steps, so that as the needs of our software evolve, we can repeat, reuse, and scale that. Also, as the scalability changes, the requirements, we can easily scale that infrastructure without having to manually worry about issuing commands that can fail and recovering from those.

If we fast forward to these days with the modern cloud, we’ll see that the complexity of infrastructure these days is a totally different league than 20 years ago, and so, increasingly, being able to treat infrastructure like software has unlocked a lot of practices and processes that can help us tame the complexity of that infrastructure. Really just eliminate a whole bunch of manual effort, increase the ability to collaborate and really do more with less. If you look at this, this is my attempt at infrastructure as code family tree. We’ll see, Make came out way back in the ’70s. CFEngine actually was early ’90s. Although, if you looked at CFEngine 1, 2, and 3, those were spaced apart with some pretty significant changes for each major revision. Then we’ll walk through actually every other tool on this roadmap, but you’ll see a few branches in here that are interesting to trace through, which I’ll do in this talk.

Imperative vs. Declarative

We’ll first talk about some general concepts, and then we’ll get into some specific tools. The first major concept is the notion of imperative versus declarative. What do I mean by that? I’ll give you an example just to make it concrete. What if our objective is to create a Python web server listening on port 80, available over the internet? The imperative way is to describe how to go about creating a Python web server. Here are some steps. We might create a new AWS EC2 instance, assuming we’re running this in the cloud. We might then SSH into that instance, install Python, copy our web server files from maybe a Git repo or somewhere else that we’ve got them stashed. Start a Python web server process. Then add a port 80 firewall rule to allow traffic. That’s fine but that really speaks to those manual steps that we talked about earlier. What if something fails in between steps two and three, for example, or so on, and we have to manually recover? The declarative approach instead is to literally say to some Oracle, create a Python web server listening on port 80. That Oracle, the infrastructure as code engine, the infrastructure as code tool that we’re using, will then decide how to perform those steps. We’ve removed ourselves from the messy business of figuring out every precise step necessary to actually provision that and allow that Oracle to figure out things like, what if it fails? How to actually distill that into the concrete steps. Nearly all the infrastructure as code tools we’ll look at have some notion of declarative approach to them. It widely varies based on the tool.

Demo

Let me get a little more concrete. I’m going to actually show you a demo of that specific Python web server listening on port 80 in an infrastructure as code tool. This is general concepts. I’ll be using Pulumi, the company I work for, just as an example, but the concepts transcend any one tool. Here, we’ve got just an editor. One of the things about infrastructure as code is often many tools are using general-purpose languages. We can use tools like VS Code, the editor we’ve got here. We can use package managers and all the familiarities that we have with languages. Again, depends on the tool, some use YAML, some use domain specific languages. In this case, we’re using Pulumi. I can use any language. I’ve chosen to use Python. Really, if you look at what’s happening here, we’re just setting some objects. Again, this is declaring the desired state of my infrastructure. That concept of desired state is important. If we trace through, we’re saying, we need to allow internet traffic on port 80. The way we do that on AWS is to use a security group with IngressArgs that allow incoming traffic over the internet on Port 80. We need to use a Linux Amazon Machine Image, AMI, for EC2. It’s effectively just the image that we want the server to run. Then we go ahead and we configure our server and we declare that it’s going to use that AMI that we just looked up, and put it in a security group that we created, and run a Python web server. Then at the end, we’re going to spit out the automatically assigned addresses.

Notice that this is declaring the state. It’s not necessarily talking about exactly how to go about creating that web server, that’s left to the declarative engine. Pulumi, I just say, pulumi up. Most infrastructure as code tools, they’ll show you a plan of what’s going to happen before actually performing that. Here, we see that it says, we’re going to create a security group in an instance. If we want to look at some of the details, we can. It will show us things like the instance type and all the other settings. In this case, we’re just going to say yes. That’s going to go ahead and start chugging away. Notice that that first step showed me what’s going to happen first. This is a really key concept, because although you could go script against the cloud providers, you could go use the SDKs that the cloud providers offer, that still has the problem of being able to know what it’s going to do before you run the script, and what happens if it fails. The benefit of an infrastructure as code tool is you remove yourself from all of that. The infrastructure as code tool can handle things like showing you what it’s going to do beforehand, so you can always make sure that there are no unintended consequences of a deployment activity. If something were to fail here, I’d be able to trivially pick up where I left off. This is going to go create the server. It takes a little bit to create the server in Amazon. You’ll see here it’s done, and it gives us the autogenerated IDs. The wonderful thing now is if I wanted to take this and deploy it a second time, maybe this is my staging environment and I want to go deploy to production. That’s trivial. Or maybe if it’s production, East Coast versus West Coast, or production EU, maybe they all have different settings. I can still start from a common code base and repeatedly scale that. Again, if I wanted a second server, a third server, this demo was creating something from scratch, but infrastructure as code tools can take an existing environment and evolve it over time by basically diffing the current state with the future desired state. If I were to go ahead and curl this HTTP address, I will see, Hello, World, the server is up and running. I’m going to go ahead and destroy this, because we don’t want to leave our server sitting around costing us money.

Expression Language vs. Evaluation Engine

You saw there the basic concepts of infrastructure as code. We provisioned a web server by declaring it. I think there are two key concepts, there’s declarative and imperative. Another key concept here is the language versus the evaluation engine. You’ll see that I claimed that the previous example was a declarative example, and yet I was expressing the desired state using an imperative language, Python. Many infrastructure as code tools offer different choices. You can do YAML, or JSON. You can use a domain specific language like HashiCorp’s Configuration Language, or Puppet script. You can use a general-purpose language like Ruby with Chef or JavaScript, Python, Go with Pulumi. The key concept here is that you’re expressing the desired state in one language, and then the evaluation engine is actually carrying out the deployment activities. The deployment engine and the evaluation engine can be declarative, such that it has a goal state, if something fails, it can resume where it left off. Yes, that expression language, it can be beneficial to be able to have the imperative constructs. In Python, I might take that example I just showed you, put it in a class so that I can have a web server class that encapsulates some of those concepts. I can have a for loop. If I wanted to create 3 servers, I could say, for i in range, (0,3), provision. Yet none of that takes away from the fact that ultimately, at the end of the day, the evaluation engine is declarative. Separating these concepts in your mind as you think about infrastructure as code, can be quite helpful when understanding the options available, and which ones are the ones that you want to choose for your project.

On the Importance of DAGs

Another key concept, I hinted at this with the Make example. Ultimately, if you looked at that example we just had, we had a web server EC2 instance. The EC2 instance actually consumed, you remember, it referred to the security group that we had declared. That forms a DAG, a directed acyclic graph. This is a concept that is pervasive in many of the infrastructure as code tools beginning all the way to CFEngine. I believe it was two, could have been three. It’s a key concept because what it allows the engine to do is parallelize operations and also perform operations in the correct order. If you think back to what we just showed, we create a security group, and then a web server. The web server depended on the security group, so, clearly, we have to wait until that security group is completed, the provisioning is completed before we can go create the server. Similarly, I just destroyed the stack. That means it has to do it in the reverse order. If it tried to destroy the security group first, it would find that the web server depended on that. This concept that an infrastructure as code engine not only needs to create this declarative plan, it also needs to understand references between all of the infrastructure components within your stack. This is similar to Make as well. Make needs to build things in the right order. If something consumes the output of a previous build step, it has to do those in the correct order. DAGs are very important. It’s an internal implementation detail if you’re just using the tool, but it definitely helps to understand this aspect of infrastructure as code as well.

Desired State and Convergence

I’ve mentioned this notion of desired state many times. This is also a common concept amongst many infrastructure as code tools, where, effectively, the infrastructure as code engine has to eventually converge on your desired state. You think of the security group in the web server, we’ve declared that to be our desired state. Now the infrastructure as code tool’s job is to figure out, where are we? Are we starting from an empty environment? Are we starting from an environment that’s partially constructed? Is it fully constructed and it’s just a minor change to the environment, like we’re going from a T2 micro to a T3 large or something in terms of the web server size? Then it can just update one property on that EC2 VM. The idea that this desired state is known by the system and then the system can converge towards it is actually critical to not only infrastructure as code tools, but also modern technologies like Kubernetes. If you’re declaring a Kubernetes configuration, the API server and control plane is effectively doing the same thing. This is a critical concept. It’s also why infrastructure as code tools can resume in the face of a failure. Because that desired state is known, the Oracle can always be trying to converge. If something fails along the way, it can simply pick up where it left off and continue attempting to accomplish that desired state. This is another key concept that you’ll encounter with infrastructure as code tools.

Y2K: Commence Data Center Modernization

Let’s talk about now some specific tools. We’ll go through the evolution of computing and cloud computing, starting from data center modernization in the 2000s, where we really started moving whole hog from rack and stack and physical servers, and data centers, and manual configuration to software managed VMs and automation with VMware. The great thing is, we went from KVMs and switches where we actually had to physically be located with your server to actually do anything with it, or Telnet into it, or SSH into it, to actually having a software control plane that manages our servers. That’s really a key innovation. Because what that did is it meant that infrastructure now is software effectively, it’s programmable. Software has an API. vSphere, for example, had that software defined control plane. When you look at AWS, it’s pretty incredible, actually, you can curl a REST API to get a server somewhere in some data center. At Pulumi, we like to say, program the cloud. This was the key innovation that happened along the way that allowed us to build increasingly powerful infrastructure as code tools, and other tools and capabilities as well.

Configuration

Let’s talk about one really important concept. We’ll talk about configuration-based infrastructure as code and provisioning-based infrastructure as code. These are two primary different families of IaC tools. Configuration, once you created a server, a virtual machine or a physical server, you need to install and configure software on it. You need to copy and edit files, run commands and processes, start daemons and services. Configuration based infrastructure as code was really born in a stateful world, a world of virtual machines where you patch those servers in place anytime they needed to be upgraded. In the early era, these were the initial forays into infrastructure as code primarily with virtual machines. CFEngine even predated these, but you look at Chef, Puppet, SaltStack and Ansible, really what these tools were about was how to install and upgrade and patch software on virtual machines. That was the primary mission. Of course, they have since evolved to a lot more than that. At the time, that was one of the major challenges, how to automate, how to make that repeatable.

Puppet is really an early approach here that builds on some of the momentum of CFEngine, but takes a slightly different approach. Puppet gives you a domain specific language. It’s very Ruby like but it’s DSL, where in this case, we’re basically declaring some firewall rules that we want to accomplish. Again, look at how declarative this is. This is not a Bash script that goes and runs a set of commands to accomplish this, it’s actually saying, firewall for protocol ICMP, make sure it’s set to accept, and so on and so forth. Of course, this will translate into some SSH command, some edits to some configuration files on the machine, where we’re able to operate at a much more declarative, higher level, more repeatable level of abstraction.

Chef builds on this as well and takes things in a slightly different direction, which is actually using Ruby. It’ll look a lot similar to what we just saw, we’re still saying we’re declaring firewall rules but we’ve got the full expressiveness of the Ruby language. Again, remember, because the separation between expressive language and the infrastructure as code engine, although we now have access to all the rich capabilities of Ruby, we’re still getting the belt and suspenders of infrastructure as code. Thanks to this, really Chef enabled and unlocked a lot of amazing capabilities, like cookbooks, which were Chef’s sharing and reuse mechanism. With programming languages, we’re accustomed to sharing and reusing packages and patterns, so that we don’t have to copy and paste scripts all over the place. We can actually say, here’s a common configuration, define it once and then use it a whole bunch of times. That’s a very powerful capability. In addition to that, and the expressiveness of the language, we get things like testing, the ability to actually test our code. This was the first example of using really, a full-blown general-purpose language, but marrying that with the rock-solid infrastructure as code engine. We’ll see this pattern repeats, although from here we go in a slightly different direction with many of the other tools.

Ansible approached this from a different angle, and instead of a DSL, instead of a general-purpose language, actually used YAML, a markup language to express effectively the desired state of the configuration. One of Ansible’s major innovations in this space was having a serverless design, not in the way that we talk about serverless and Lambdas today, but not needing an agent, so agentless. Effectively, it could manage any machine that had Python installed on it, so you don’t have to worry about running an agent or running some heavyweight processes on the machines that you’re trying to manage. Which has made adopting Ansible at scale within organizations, just very seamless. Almost every machine already has Python on it. If it doesn’t, it’s pretty noncontroversial and easy to get that installed. Again, we’ve seen DSL, general-purpose language, and YAML, and you’ve already seen basically the three approaches to expression languages that you’ll find in all infrastructure as code tools.

DSL vs. GP vs. ML

Some of the benefits of a DSL is, it’s purpose built, it’s easier to get started. That DSL can afford to basically make language design decisions that are intended to streamline and make it super easy to use for that one purpose-built situation. Some of the cons of DSLs, however, are that it is. Its pros are also its cons, which is, it’s single use. It’s really, you learn it for that one thing, but it doesn’t transcend that to other use cases. Compare that to Python, where if you learn Python, there’s many other tools that use Python, and you’ve now learned something that is transferable to other domains and contexts. Because of that limited familiarity, somebody coming from a different background, or for the first time coming to the space, they have to learn that DSL. Now, because DSLs are often simpler, maybe that learning curve is easier. If you just graduate from college, you know Python, you’re not going to know that specific DSL, most likely. Many DSLs are destined to grow up into a general-purpose language. It’s just not designed that way from the outset, and so you often end up with funny for loops, or funny if statements that maybe were not designed intentionally, but bolted on after the fact. General-purpose languages, again, are multi use. They give you the ultimate expressiveness which can be a challenge, but in this context, because infrastructure as code, the declarative engine at the core, that expressiveness, it limits the blast radius of how much you can shoot yourself in the foot, and has brought familiarity.

The cons are, if you don’t know the general-purpose language, it sometimes can be more complex to learn it when you’re just getting started. Frankly, marrying that with declarative infrastructure as code is not trivial. We’ve seen that Chef was able to do that. We’ve seen that Pulumi was able to do that. There aren’t many examples of being able to do that because you do need to narrow down the object model and really design a system from the outset that can work with the best of both worlds. Finally, markup language is really extreme simplicity. JSON, YAML are effectively universal data formats that are used everywhere throughout computer software these days. It also aligns well with that declarative approach. Really, it is data, so you’re declaring. There’s no compute in that. Except that markup languages lack expressiveness. If you do need a for loop, or you do need some level of abstraction, or templating, or you’re declaring something like the web server that needs to reference the security group, you have to invent constructs to enable those things which often feel like you’re now jamming a general-purpose language into what was meant to be a simple data format. In fact, you look at some systems like Helm and the Kubernetes ecosystem, they’ve had to add Go templates to generate the YAML. Because in many complex situations, you do run into the wall of complexity, that leads to a lot of copy and paste, a lot of custom tooling built up around this supposedly simple format. There’s really not great tooling to help manage those things at scale. All of these are pros and cons. I just wanted to give you the full landscape. Again, the right solution to the right problem domain is typically my guidance for when to pick one over the other.

DevOps

Along the way, we introduced this concept of DevOps, developers and operations, and really taking those things and working together. DevOps really is a set of practices to harmonize software development and operations so that we’re not thinking of these things as, developers go write the code over here. They throw the code over the wall with a ticketing system in between to the operations team, who then goes and clicks a few things. Really, this is the idea of reimagining the software development lifecycle with infrastructure at the forefront, and really helping the two sides of the house, developers, operations, infrastructure collaborate. This really helps us to achieve continuous software delivery where we’re shipping daily, hourly, constantly, instead of just quarterly, or some of the ways that we did things 20 years ago. Really, I mention DevOps here, because infrastructure as code was an essential technology to first facilitating DevOps. Then DevOps also helped carry infrastructure as code into the mainstream.

Cattle vs. Pets

Let’s keep going on the journey here. I think DevOps predated the cloud, just barely, and then the cloud came on the scene. I love this press release, AWS first service that they launched with S3 back in 2006. This really changed the game completely. One of the things that it introduced was this notion that infrastructure is an API call away, and it’s much more repeatable and scalable. We have managed services. Effectively, we can offload a lot of the operations tasks and management of our infrastructure to the AWS control plane, the AWS services themselves. As we hit this inflection point, there’s another concept that I want to mention, because it really leads from configuration-based infrastructure as code to provisioning-based infrastructure as code, which we’re about to dive into, this notion of cattle versus pets, which is probably terrible analogies. It’s not mine, but it’s pretty well known. The idea is, in the world of VMs, those were like pets. Every machine, especially in the world of physical racked and stacked data center computers, every one of those is a special stateful being. They have specific names like pussinboots.cern.ch. They’re unique, lovingly hand-raised and cared for. When something goes wrong with them, you try to get it back to health. If something fails on the hardware, you go swap out the SIM card and install something new. When a piece of software gets corrupt, or there’s a security vulnerability, you go patch that thing.

Whereas in the shift to the cloud, we move more towards this notion of cattle, which is, we’ve got a lot of these machines, and they’re almost identical to each other. When one fails, you swap in a new one, whether that’s because hardware fails, and we just get a new machine, we plug it in. Or if something needs to be upgraded often, instead of going and patching that and worrying about the fact that it’s stateful, and that means that we have to consider if something fails, the machine might be in a bad state, we just go and create new ones. Then using things like load balancers, we can redirect traffic from the old to the new. This slide I took directly, in 2012, from the initial introduction of this concept.

Provisioning

That leads to provisioning. In a world with cattle instead of pets, it doesn’t make sense to really think a lot about, patching that virtual machine. In fact, we can just bake images, and we’ll see with containers and Docker and Kubernetes is the new way we do things. We need to bake images with the latest software in them and then just go provision new versions and update all the old references to the new. What that means is we really don’t have to think about state transitions from A to B to C to D. If something fails along the way we can just say desired state, so getting back to this notion of desired configuration, and the infrastructure as code tool can figure out how to get from wherever we are today to where we want to go tomorrow.

That’s led to this middle era of infrastructure as code tools. There are cloud specific tools like AWS CloudFormation, Azure Resource Manager, Google Deployment Manager, and then Cloud-Agnostic, Terraform. CloudFormation can use JSON or YAML. Looks a lot like the Ansible example we saw earlier, it’s just declaring AWS infrastructure here. This is actually basically doing the same thing we saw on our demo earlier, effectively, just spinning up an EC2 instance, that runs some commands when it spins up. We’ll notice a few things though, that !Sub here in FN::Base64, again, because of the limitations of a markup language, CloudFormation has introduced a mini-DSL embedded within it, where you can actually substitute commands to reference other objects or perform computations, like in this case, we’re substituting in Base64 encoding some strings.

Azure Resource Manager has very similar concepts. It’s just written in JSON instead of YAML. Terraform, however, takes that approach of a domain specific language. Again, very similar to what Puppet did where it didn’t have to be constrained by the limitations of a markup language, and yet didn’t have to go and support a full-blown language. Terraform allows you to express yourself in its DSL, the HashiCorp config language. We’ll see here this var.instance_type, var.instance_key. We can reference on the security groups, aws_security_group.sg.id. We have some facilities for programming, but within a simpler declarative DSL. Terraform, again, is multi-cloud, so it can support AWS, Azure, Google Cloud, also on-prem things like vSphere.

Enter Containers

All of that was early 2010s. Then Docker and Kubernetes came on the scene, and really changed how we think about application architectures, and encouraged us to move beyond lift and shift. I think a lot of the prior technologies were still very oriented around, how do we provision VMs, and how do we configure them? Kubernetes and cloud native, in fact, actually really dovetail nicely with this concept of declarative infrastructure as code, because the Kubernetes object model and way of doing things is all about eventual consistency, assuming things will fail, and really working in terms of desired state, and loosely coupled dependencies. Unfortunately, there’s lots of YAML in there, but the concepts at the core of how Kubernetes work align very nicely with the core concepts of infrastructure as code that we’ve already talked about. At this point, where did the general-purpose languages go? We saw that with Chef. We saw that basically, for 10 years, we just moved entirely away from general-purpose languages, which meant that we lost the ability of for loops, and if statements, we lost abstraction facilities like function classes and modules. A lot of the editor support is now missing. Most editors are not going to understand CloudFormation’s way of doing a DSL to reference things. You’re not getting statement completion or red squiggles if you make a mistake. Unless somebody goes and implements a specific plugin for it, you’re not getting interactive documentation for things like Terraform’s DSL. It led to a lot of copy and paste, and a lot of recreating the wheel.

Today’s era, we’re seeing a resurgence of two things. One, more cloud native technologies, not just Kubernetes and Helm, what people typically mean when they say cloud native, but really embracing managed services like AWS Lambda, or Azure Cosmos DB, offloading some of the heavy lifting of managing services to the cloud providers themselves. Also, seeing a renaissance of, let’s use those general-purpose languages. Let’s marry those with declarative infrastructure as code. Let’s give ourselves the ability to tame the complexity and go from small numbers of services to many services, to many environments, and use software to tame that complexity like it was designed to do. This led to Pulumi’s introduction, the company that I founded back in 2017. We already saw this in action, but the idea is, use JavaScript, TypeScript, Go, Python, C#, Java, we actually even support YAML, if you prefer that markup language approach. The idea here is no matter what choice you pick for the expression language, you’re still getting all that great declarative provisioning-based infrastructure as code, belt and suspenders, previews, and all of that.

Summary – Picking an IaC Solution

If you’re picking an infrastructure as code tool today, it’s very common to see folks using Pulumi with Ansible, or Terraform with Chef, or any combination thereof, because configuration is still super useful if you’re doing virtual machines. If you’re doing stateful workloads and stateful virtual machines, you’re going to have to configure them, you’re going to have to patch them. Those tools are very much vibrant and being used widely in the ecosystem today. If you’re really going all in on modern cloud architectures, provisioning-based infrastructure as code is basically table stakes. You’re going to want to pick Pulumi, Terraform, something in that category. For simple use cases, it’s fine to start with the DSL or markup language. We saw that with Pulumi you can pick either of those and still stay within the Pulumi ecosystem. If you want something expressive, familiar, that can really work in a very complex setting, and that is familiar to developers, general-purpose languages tend to be the way to go. Then of course, Kubernetes only, you got to pick something that works in the cloud native ecosystem. We saw some examples. Pulumi works great there. Crossplane is another example. Or just the Kubernetes native tools themselves are very infrastructure as code like.

The Future

I’m going to wind down just talking about a few trends that are exciting to me that we can expect to see in infrastructure as code domain over the next few years. The first which is empowering developers. You rewind the clock 20 years ago, and developers really didn’t think much about the infrastructure. They’d write a three-tier application, two virtual machines in a database, and the infrastructure team could easily take it from there. We’d update the applications every quarter. Life was good. It turns out these days, infrastructure and application code, the line between that is getting blurrier, first of all. AWS Lambda, is that an application concept or an infrastructure concept? Somewhere in between. What about building and publishing a Docker container into a private container registry? That’s somewhere in between as well. What we’re finding is, increasingly, because developers are creating the business value, letting them move as fast as possible and embrace the cloud, as much as possible, is something that most innovative companies out there, especially those where the cloud is helping them ship faster is really key. These days, all software builds are cloud software. This totally makes sense. However, you need to still have those guardrails in place, of how to provision a network, a cost-effective Kubernetes cluster, reliability, security. That’s why infrastructure as code is still an essential tool to empowering developers, where the infrastructure team can define those best practices, set those guardrails, but developers can still go and self-serve some subset of the infrastructure that makes sense.

That gives rise to this notion of a platform team. We’re seeing this increasingly. A platform team is the team that sits between the operations and IT organization, and the developers. Oftentimes, as the infrastructure platform team, the goal is to allow developers to be self-serve with guardrails in place, and be the connective tissue between the developers and operations team. Many times, the platform engineering team takes a software engineering mindset. They’re building systems. They’re putting in place Kubernetes and scaling it up. They’re defining the common infrastructure as code components that are going to be used elsewhere, and the policy components. That software engineering mindset is often prevalent within the platform team. You’ll find that it’s an intersection of software engineering experts and infrastructure expertise in this group. This is definitely a pattern we see in the most modern organizations.

We’ll see that taming complexity is continuing to be on everybody’s mind. I think there is essential complexity and accidental complexity. With the cloud today, we’ve got a lot of accidental complexity. If you’re a developer, you just want to spin up a microservice and define a couple containers, a Pub/Sub topic, a queue, a serverless function, there’s a lot of accidental complexity in that space. We’re seeing already the rise of tools that talk about infrastructure from code, something Pulumi does, and some new entrants in the market. We’ll continue to see that level of abstraction increasing over time, so there’s less toil, we can focus a lot more on just business logic.

Security is unfortunately today still an afterthought. I think another trend that we’re clearly seeing is principle of least privilege, policy as code, scanning early and often, making sure that software is secure by construction. Infrastructure as code has a huge role to play in ensuring that. We’ve seen a ton of great technologies here, InSpec by Chef. I mentioned the ability for Chef to test code. A lot of that work manifested in InSpec, so you can actually ensure that things are secure by default. We’ve got things like OPA, the Open Policy Agent, which is doing that in the realm of cloud native. We’ve got HashiCorp Sentinel, which does offer the Terraform tool. Pulumi CrossGuard, which allows you to do policy as code in Pulumi. Snyk, which is a more general-purpose solution across a lot of these different technologies, and truly distributed application architectures. I think that one of the most exciting things about the cloud, the cloud has really made it easy to create software with infinite scale, infinite data. That’s a really exciting change in the entire industry, where we went from single computers, to multiple computers connected through HTTP, to multi-core, and now really, truly distributed application architectures, often leveraging containers, and serverless, and managed services. This has unlocked incredible capabilities that are giving rise to entirely new companies and business models and entirely new architectures.

Then, finally, artificial intelligence. I think GitHub Copilot, when it first came out, because Pulumi is just code, we cracked it open, started writing some infrastructure as code. GitHub Copilot was able to actually author and complete some of our infrastructure as code for us. The recent introduction of ChatGPT from OpenAPI, you can literally go and say write a Pulumi program to create an ECS Fargate microservice, and it spits out the code to create a microservice.

Summary

We’ve seen where we come from. A rich history. Many giants whose shoulders we stand upon, starting from Make, CFEngine, and Puppet, Chef, and so on. To today, present day, where infrastructure as code really is table stakes for any cloud infrastructure, whether it’s on-prem, hybrid, public cloud, or anywhere in between. We’ve got many great tools to choose from, a lot of great innovations, thanks to containers, cloud native, and being more developer centric. Then, where we go from here, really moving beyond just building blocks to best practices, distributed application architectures, and having things like security built in from the outset. The good news is we’re starting from a really solid foundation.

Questions and Answers

Andoh: Can we define declarative implementation as a very thorough imperative implementation done by somebody else and reused? In some sense, everything is imperative until it’s made declarative as a layer above for specific cases that demonstrated the need to be curated.

Duffy: The engine of Pulumi, although the engine itself is declarative, is actually written in Go, which, of course, is an imperative language. In fact, I like to think of programming languages occupying space along a spectrum from imperative to declarative. You look at a language like Haskell, Haskell arguably is declarative, because side effects are explicit and built into the model. Then you look at a language like F#, where it has lots of declarative facilities, and in fact, you can use F# with Pulumi, or CDK. It’s actually a nice fit, because it’s more of a declarative model, but it’s got some imperative constructs in it, as well. I think of these things as more of a spectrum. I do think that’s a good way of thinking about it. There’s more esoteric solutions, like proof-carrying code, and TLA+, and all these more research and academic languages that really are more declarative in nature. Most of the time, we’re trying to approximate declarative using imperative languages.

Andoh: You do have this declarative engine, and especially for Pulumi, as part of your solution to infrastructure as code. You also talk about the tenant of infrastructure code as being declarative, and we’re seeing the future is declarative. Are there any downsides for the engine or just the solution to not be declarative native, in the process of bring your own language construct to that evaluation engine?

Duffy: I think you could definitely argue it both ways. There’s more of an impedance mismatch when you have to take something that fundamentally is not declarative, and map it on to something that is declarative. Yet, at the same time, a lot of programmers are accustomed to imperative languages. We like our for loops. We like our shared mutable state, even though, on paper, it’s sometimes not a great idea. The approach that we took at least was to accommodate the different preferences of different end users, who might already have a language that they know, but still give them a way to map that onto the declarative core. YAML is pretty mainstream and popular. That’s more of a data format. You look at Q, which adds some really super exciting capabilities around type checking, and the ability to do things like for loops within the context of a purely declarative data model. The unfortunate thing is there’s no really super popular declarative programming language. Haskell is probably the closest, but people like to tinker with it. Certainly, in FinTech, you can go to Wall Street Quants, like people are using Haskell like crazy, but more broadly in the industry a little bit less.

Andoh: You mentioned the future of infrastructure as code and you also talked about policy and the rise of policy of code and how infrastructure of code has a huge part to play in that? Could you expound on that a little bit?

Duffy: I lived through an interesting time back in the Trustworthy Computing days where we had all these viruses and issues with Windows when we worked at Microsoft. The thing that we found out was like, you can detect a lot of those through static analysis and analyzing code or analyzing the environment. It’s a whole lot better if you didn’t get yourself into that situation to begin with. What we did back then was we started moving things more into the programming languages, more static type checking. You look at what Rust has done, for example, eliminating entire classes of common security problems by having a robust type system. I think policy as code is effectively in that realm of static type checking, and sometimes dynamic as well. Detecting errors like, “I didn’t mean for this database to be open to the internet. My entire microservice there’s, again, a pathway from the intranet. Or, I forgot to encrypt files at rest. Or, I’m using an end-of-life’d version of MySQL.” Catching these things, ideally, at deployment time, but worst case, after they’ve already made their way out. We’ve seen a lot of great tools there. HashiCorp has Sentinel. Chef had InSpec. At Pulumi we created policy as code. We still have a long way to go because it’s still an afterthought. It’s not to the point where it’s checked as part of authoring my program, and it’s just secure by default. I think that’s where we all want to get to is secure by default. You’ll see supply chain security as well as part of this, companies like Chainguard trying to make it secure by construction. I think as an industry, we’ll see a lot more movement in that direction.

Andoh: Unit tests and integration tests, are they recommended when we implement pipelines with Pulumi?

Duffy: Definitely. I think one of the benefits to using general-purpose languages is you get the whole ecosystem around that language. If you’re using Python, you can use the built-in unit testing. Every language has a unit test framework. There’s a spectrum of testing. There’s unit testing. There’s pre-deployment testing. Actually, a common thing is open a GitHub pull request, spin up a whole fresh copy of that infrastructure, run a battery of tests against it, and tear it down. Only pass the pull request, if that set of tests work. That’s another form of testing. Then once you actually merge it, there’s post-deployment testing and a variety of techniques like A/B testing, Canaries, blue-green deployments that are more sophisticated if you want to actually push testing into the post-deployment part of the process as well. We see people doing a lot of everything along that spectrum.

Andoh: You mentioned desired state and looking at state but you didn’t mention the word drift. In terms of infrastructure as code, and both the configuration part and the instantiation part, can you talk about drift and the complexities that you’re seeing there and solutions?

Duffy: I just got back from re:Invent, and talking to a lot of folks, and I heard a lot of people say we require any changes to infrastructure go through infrastructure as code. There are great class scenarios where if there’s a security issue, somebody can go in and make manual changes. A lot of people are locking down the ability to make changes. Sometimes either it’s standard practice, or occasionally somebody will log in and make a manual change. When they make a manual change, the actual state of your infrastructure no longer matches what you thought you deployed. Infrastructure as code tools like Pulumi, Terraform, others can actually detect that and say, what you thought you deployed is actually different. Maybe you opened Port 22, to SSH into a box and do some debugging, and then you forgot to close it afterwards. Drift detection can tell you, “You didn’t mean to leave port 22 open.” Then it can reconcile the state. It can go either reapply the changes, or if you want to, maybe you added a tag to a server, you can ingest that back into your infrastructure as code. That’s what drift detection is. Definitely a very important thing to do. Start from, everything must go through a pipeline and then later on drift detection after that.

See more presentations with transcripts

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


AWS Launches General Availability of Amazon EC2 P5 Instances for AI/ML and HPC Workloads

MMS Founder
MMS Steef-Jan Wiggers

Article originally posted on InfoQ. Visit InfoQ

AWS recently announced the general availability (GA) of Amazon EC2 P5 instances powered by the latest NVIDIA H100 Tensor Core GPUs suitable for users that require high performance and scalability in AI/ML and HPC workloads. The GA is a follow-up to the earlier announcement of the development of the infrastructure.

The Amazon EC2 P5 instances stem from a long-time collaboration between AWS and NVIDIA and are the 11th version of an instance for visual computing, AI, and high-performance computing (HPC) clusters. These instances are equipped with 8 x NVIDIA H100 Tensor Core GPUs, boasting 640 GB of high-bandwidth GPU memory, powered by 3rd Gen AMD EPYC processors, offering 2 TB of system memory, and featuring 30 TB of local NVMe storage. Additionally, P5 instances deliver an aggregate network bandwidth of 3200 Gbps using the second-generation Elastic Fabric Adaptor (EFA) technology, supporting GPUDirect RDMA, enabling lower latency and efficient scale-out performance bypassing the CPU during internode communication.

The company claims the instances will reduce up to 6 times in training time (from days to hours) compared to previous generation GPU-based instances and up to 40 percent lower training costs.

An infographic showing the P5 instances and NVIDIA H100 Tensor Core GPUs compare to previous instances and processors (Source: AWS News Blog)

With Amazon EC2 P5 instances, users can leverage them for training and running inference for increasingly complex Large Language Models (LLMs) and computer vision models behind generative AI applications such as question answering, code generation, video and image generation, and speech recognition. In addition, they can use the instances for high-performance computing workloads like pharmaceutical discovery, seismic analysis, weather forecasting, and financial modeling.

Furthermore, P5 instances are deployable in hyperscale clusters called EC2 UltraClusters. These UltraClusters combine high-performance computing, advanced networking, and storage capabilities in the cloud. Each EC2 UltraCluster functions as a robust supercomputer, allowing users to execute complex AI training and distributed HPC workloads across multiple interconnected systems.

Dave Salvator, a director of accelerated computing products at NVIDIA, stated in an NVIDIA blog post:

Customers can run at-scale applications that require high levels of communications between compute nodes; the P5 instance sports petabit-scale non-blocking networks powered by AWS EFA, a 3,200 Gbps network interface for Amazon EC2 instances.

In addition, Satish Bora, an International GM at nOps.io, commented on a Linked post of Jeff Barr:

It appears a small datacenter in an instance; what a power.

AWS competitors Microsoft and Google have similar offerings for AI/ML and HPC workloads. For instance, recently, Microsoft made Azure Managed Lustre generally available. The EC2 UltraClusters use Amazon FSx for Lustre, also a fully-managed shared storage built on Lustre file system, an open-source parallel filesystem. In addition, Microsoft released Azure HBv4 and HX Series virtual machines for HPC workloads. Furthermore, Google, for instance, released the Compute Engine C3 machine series optimized for high-performance computing.

Lastly, Amazon EC2 P5 instances are currently available in the US East (N. Virginia) and US West (Oregon) regions, and pricing details can be found on the EC2 pricing page.

About the Author

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Avalonia Reaches v11 GA Release

MMS Founder
MMS Almir Vuk

Article originally posted on InfoQ. Visit InfoQ

Beginning this month, the Avalonia team announced the release of version 11.0 of their framework, bringing significant changes and new features. These changes include features like automated testing capabilities, improved accessibility support, the introduction of Input Method Editor (IME) support for text input, and advanced text rendering and layout options.

Furthermore, developers can now take advantage of control theme enhancements, full support for Ahead-of-Time (AOT) compilation and trimming for smaller application sizes, and the introduction of Template Studio for Avalonia inside of Visual Studio and a broader spectre of platforms. A few months ago, InfoQ also interviewed Mike James, the company’s current CEO, which readers can read and get more insights into the Avalonia UI platform.

Regarding the broader platform support, iOS, Android, and WebAssembly are now included inside Avalonia UI. Future support for Apple’s visionOS is previewed, and the community has enabled Avalonia UI on Samsung’s TizenOS. Its unique architecture ensures easy integration of new platforms, as previously highlighted in a report.

Avalonia 11.0 introduces a powerful new composition renderer, elevating visual capabilities and performance. With support for implicit animations, connected animations, and render thread animations, it offers dynamic and high-performance UI experiences. Its efficiency ensures smooth operation, even on low-powered embedded devices, reaffirming Avalonia’s adaptability and wide application.

Another significant advancement in text rendering capabilities, offering enhanced control over visual elements in your UI. Rich text rendering, supporting inline elements, allows for versatile variations in a single TextBlock, including font styles, hyperlinks, and embedded controls – a novel feature previously unattainable. The roadmap includes exploring full rich text editing in upcoming versions, promising an even more immersive user experience.

Furthermore, the latest version introduces Input Method Editor (IME) support, enhancing global reach and inclusivity. Users can now effortlessly enter characters and symbols not readily available on their input devices. This feature seamlessly integrates with on-screen keyboards on mobile and web platforms, ensuring compatibility with various OS-provided text functionalities.

Avalonia’s latest version, v11, introduces robust accessibility support to ensure inclusivity for all users, including those with disabilities. The framework now incorporates industry-standard features for improved accessibility, such as keyboard navigation, screen reader support, and high-contrast themes. Also, version 11, introduces improved automated testing capabilities, extending support to traditional frameworks like Appium. The addition of a ‘Headless’ mode enables rapid testing of the entire application, enhancing efficiency in functionality validation and bug detection.

Other changes in Avalonia v11 include significant improvements to control themes, providing developers with enhanced flexibility and control over the appearance of their applications. Additionally, there is full support for Ahead-of-Time (AOT) compilation and trimming, resulting in reported ~60% smaller application sizes, faster downloads, quicker startup times, and reduced end-user storage usage. Moreover, developers can now take advantage of Template Studio for Avalonia, a user-friendly, wizard-based tool to simplify the creation of new Avalonia apps within Visual Studio.

Lastly, in addition to the major version release of Avalonia 11.0 in July, Avalonia provided a sneak peek of their upcoming extension for Visual Studio Code, set to significantly enhance the Avalonia development experience within the code editor. The extension offers XAML code completion and an integrated XAML previewer. Notably, the preview features the Integrated XAML Previewer, a tool that facilitates real-time visualization of XAML code, enabling efficient design and tuning of user interfaces.

To get started with Avalonia UI v11 RC, users can download the Nuget package and also interested readers can learn more about Avalonia UI and get started exploring the new and revamped official documentation, alongside quick guides and the main Avalonia GitHub repository.

About the Author

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Tech Giants Set The Stage But AI Revolution Will Span From Pharma To Farming, Ivan Feinseth Says

MMS Founder
MMS RSS

Posted on mongodb google news. Visit mongodb google news

Tigress Financial Partners Chief Investment Officer Ivan Feinseth recently shared his perspective on the blurred lines between hype and reality in artificial intelligence (AI), its burgeoning role across diverse sectors, and a few standout companies paving the way forward.

Tech leaders — Microsoft Corporation MSFT, Alphabet Inc GOOG GOOGL, and Amazon.com, Inc AMZN — will likely spearhead AI developments, but other sectors like farming and infrastructure will also join the revolution, he told Benzinga.

“Every company is going to have to be an AI company,” Feinseth quipped, drawing the quote from c3.ai Inc AI founder Tom Siebel.

Like Siebel, Feinseth envisions a world where every company, irrespective of its core product or service, leverages AI to extract value from their data, thus gaining a competitive edge.

AI’s future will seep into the pharmaceutical industry for drug discovery and analysis, Feinseth predicts. He also envisions a future where traditionally non-tech companies, like Caterpillar Inc CAT and Deere & Company DE, transform into AI entities.

Read Also: Caterpillar Will Give You $500 Per Month As The Stock Hits All-Time Highs: Here’s How

The ongoing shift to AI is a necessity, primarily due to labor shortages and the younger generation’s declining interest in farming, he explained. AI will have to bridge the labor gap and boost crop yields, he added, citing a product demonstration by Deere at the Consumer Electronics Show two years ago featuring fully autonomous equipment.

Ingersoll Rand Inc IR, one of the largest manufacturers of compressors and vacuum pumps, is another potential AI beneficiary, Feinseth noted. Mongodb Inc MDB and Monday.com Ltd MNDY can see tailwinds, as they provide the tools to customize AI, allowing companies like Deere and Caterpillar to create proprietary solutions rather than relying on generic, off-the-shelf software.

The ability to create custom applications could be pivotal in differentiating companies in the increasingly AI-driven market, he noted.

Feinseth underlined that, whether it’s “hype AI” or “real AI,” AI’s influence is here and becoming an inevitable part of every industry’s future. It’s not about replacing humans with machines, but rather about creating an environment where the two can work together to boost productivity.

Article originally posted on mongodb google news. Visit mongodb google news

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Presentation: Leveling Up Your Architecture Game

MMS Founder
MMS Thomas Betts

Article originally posted on InfoQ. Visit InfoQ

Transcript

Betts: Welcome to leveling up your software architecture game. If you ask most people, outside of software folks, for examples of architecture, they point to famous buildings. There’s plenty of them around London, for example. Architecture in that traditional sense, has a shared collective understanding. If you asked for examples of software architecture, you’ll probably get a shrug from people outside the software community, and even within the software community doesn’t have a clear answer. Sure, we have diagrams, but that’s like pointing to the blueprints of the building, rather than the building itself. Because we can’t see it, we can’t see the software, software architecture is harder to define. If software architecture is harder to define, that means the role of a software architect is also not clearly defined. Imagine you’re at a party and someone says, what do you do? Somebody introduces themself as an architect. You’re like, I know what they do. They design buildings and places for people to live. They say, what do you do? You say, I’m a software architect. You get a, ok, smile and a nod. Maybe they sip their drink as they try and figure out how to talk to you. Nobody quite understands it. That’s why I sometimes go with the same definition my mother uses, which is, he does something with computers. That’s accurate. Now that I’ve established that there’s no clear definition for either software architecture, or software architects, how can we come up with a game plan to level up our software architecture game? The challenge is, we need to get to the fundamental skills of what is needed to be a software architect. Then once we understand those low-level requirements, we can find ways to improve upon them, and use them as building blocks to establish a framework for next level software architecture. Architects love to create frameworks.

Background

I’m Thomas Betts. I’m the lead editor for architecture and design at InfoQ, and a cohost of the InfoQ podcast. Much of what I’ll be talking about comes from the experts that I’ve interviewed and the articles I’ve edited over the years for InfoQ. One of the core values of InfoQ and QCon is information Robin Hoods. This is a chance to take that knowledge and share it much more broadly. My day job, I’m an application architect at Blackbaud, which is the leading software provider for the social good community. If you haven’t heard of Blackbaud, and you live in the UK, you might be more familiar with JustGiving. That’s one of our brands. My official job title is laureate software engineer. I’m once again showing, even our HR system can’t figure out, what does an architect mean?

Outline and Goals

I’ll start by covering the responsibilities that architects need to do. Then I’ll identify some of the fundamental skills, so think those small building blocks we’re going to use to create our framework and achieve our goals. Finally, we’ll look at ways that great architects are combining all those skills, taking the practice of architecture to the next level. From this point forward, I’m going to be talking about software. In the interest of brevity, I might not always say, software architecture or software architect, but I think we’ll all be on the same page.

Responsibilities of Architects

One thing that architects are typically known for, and in some organizations, all that they’re known for, is creating those diagrams I showed earlier. That is part of the job. Those diagrams are useful. However, creation of diagrams is not the primary responsibility of an architect. That’s just what you make. Thinking about a system, designing those components and the interactions, that’s the job. The diagram is just one tangible output. I want to make this distinction because if we work on the fundamental skills and behaviors that it takes to do the job of architecting, those can apply to any situation. That breadth of applicability is crucial to being a next level architect. If we’re able to improve the practice of doing architecture, that will lead us to having better software. That seems like an admirable goal.

The work that’s undertaken by architects varies a lot from one company to the other and even within a company, but there are some broad themes that I think always apply. First, architects need to understand both business and technical requirements for whatever project or product they’re working on. Architects have to make decisions and design software systems. Then architects are also responsible for explaining that design to stakeholders, developers, product owners, whoever else. None of those responsibilities says you have to have architect in your job title. That’s because anyone can practice architecture. Some of those people will be enterprise architects, systems architects, application architects. Even the lead engineer has some architecture responsibility. It’s like those staff-plus roles we keep talking about. I want to dispel the myth that you have to get to a certain level, before you can start doing architecture. The main differentiator isn’t the type of work being done, it’s the scope of the influence and the impact of the decisions that a person makes. I also want to point out that leveling up your architecture game does not mean moving up job titles, like on this list. The skills that make you successful, apply to any level of the org chart, regardless of the title you have.

Four Characteristics of Great Software Architects

That brings us to the fundamental skills that we need to practice. There are four that I’ve identified that come into play every day for architects, and they build upon each other. At the base is communication. The second one is decision making. That might seem surprising, because making decisions sounds like the first line of a job description. Trust me, it is second in importance to communication. Third, is being able to adapt to change. Fourth, we have leadership. These are all important. On any given day, you might need to focus on one more than the other, but this is the baseline rank.

Communication

Number one, a most important skill for an architect, communication. Why do I believe that? Because every software problem is fundamentally a communication problem. That’s important. That’s true when we have two machines that are trying to communicate, or a person that’s trying to develop or use a piece of software, or two people that are trying to communicate about software. Maybe it’ll help if we look at some examples. First, we have well known errors that specifically say, I don’t understand you. A 400 bad request is when a client asks a server something, and the server doesn’t know how to handle that request. That communication problem is so common that it’s the first of the 400 series client errors in the HTTP spec. That specification is full of all the rules of how two systems can communicate. It is again, software to software. When we show a 400 or a 404 error to a user, that’s a leaky abstraction. We’ve now communicated our problem that shouldn’t be their problem. Some people say that every software problem is really a DNS problem. That’s fun, but if you look at it, DNS is really just another tool that helps with communication. When we have those DNS problems, those are still communication problems.

What about when we start using the software and it doesn’t quite do what we want it to do, doesn’t meet the requirements. Or, you built the system, and you look at the design, it’s like, that doesn’t match. Why wasn’t it built the way we wanted it to be built? Why did that happen? Maybe the developer didn’t read all the requirements. Maybe they read the requirements, but they were vague, or they were subject to interpretation, and what they did wasn’t what the person who wrote them expected it to be. Maybe the developer wrote a bug. I know that happens from time to time. That means you told the computer to do something different from what you intended. It’s a communication problem. No matter the specifics, all these examples come down to a breakdown somewhere in communication, either between the people, or when translating the requirements into code, or when those two systems are trying to communicate. Communication problems are the root of all software problems. That means the biggest impact that a software architect can have is by improving communication. We can improve how our systems talk to each other. We can improve how developers build those systems. We can improve how people talk about those systems. Architects are able to make positive changes in all three of those communication paths.

How do we get started improving communication? We again, go back to the fundamentals. Think back to a time when you were sitting in a classroom, learning how to communicate with others. I know there’s a famous book that says this all came from kindergarten. Don’t get me wrong, lots of great stuff comes out of kindergarten. For today, we’re talking about going back to college. English Composition is a required course for first year students at most colleges in the U.S. Why? Because writing is required in nearly every course. If you’re going to be effective in communicating your ideas, in any subject, you need to be able to write effectively. For the same reason, a lot of colleges require a speech or oral communication class. I want to emphasize a three-word phrase that’s taught in Comp 101, that’s applicable to all forms of communication: know your audience. That’s it. Always consider who you are communicating with, what information you’re trying to convey, and how best to get that point across. Architecture diagrams are useful, but they might not be the best tool for every audience. You might need to write a document or give a presentation. What developers need to implement something is different than what the product owners and business stakeholders need. Knowing your audience is crucial for when you’re communicating out.

Communication is always two-sided. How do you improve your ability to receive communication? This is one of the statements that sounds so obvious, it almost doesn’t merit mentioning. To improve your ability to receive information, you need to ask questions. Just think, have you ever heard someone after something goes wrong, and they’re sitting over there saying, if they’d only asked me? Too often, we don’t take enough time seeking out the information that other people around us have. That’s also covering the idea of, question every assumption. Ask those questions. Is that really true? As a personal note, this is something that I have to work at. I’ve taken all those personality profiles, and everything confirms that I’m really good at doing low-level analyticals, deep dive, figuring out things. I am not good at naturally asking people questions. I can’t just say, that’s not something I do. I actively work at it. I’m guessing that most of the people listening to this are in that same personality profile, or are on that same spectrum of not naturally asking other people questions. You need to work at it. Because we’re talking about the receiving side of communication, asking questions is only effective if you listen to the answers. Listen to people, trust what they’re saying. Don’t just dismiss it. Then use that to help you inform your decisions.

Now that we’re listening, the last little bit of communication advice doesn’t come from college, it comes from the world of improv. The idea of, yes, and, is the foundation of improv, because it’s what allows a scene to continually build. The opposite of that would be saying no, or yes, but, and then changing direction, which creates friction and destroys the flow of that scene that’s progressing. This is true also for architecture discussions. As an architect, you have to avoid the temptation to simply say, that’s not right, when you hear someone that has an idea that you disagree with. That can take a level of humility, and admitting that you don’t have all the right answers. If you think you have a suggestion that’s better, acknowledge what someone else said. Then add to it and gradually guide them towards your idea. Understand where they’re coming from. Taking that time to understand other opinions, or other options, then providing reasoned arguments for and against them, rather than simply a yes or no decision, or yes or no response, that’s a core skill for architects.

Decision Making

Which gets us to our second important skill, decision making. This is the primary day-to-day job responsibility for architects, making decisions. When making architecture decisions, there’s some steps you always go through. It’s like the scientific method. It starts with understanding what decision needs to be made. Then you come up with some options. You evaluate those options, and you choose when you make a decision. Finally, you communicate your decision. You can’t skip any of these steps. For small decisions, this might be a quick call and talk through things with people, and you don’t need them rigor but you always go through this process. The first and the last steps point to the importance of communication. If you don’t understand the decision that’s going to be made, then everything after that can be wasted effort. If you cannot effectively communicate your decision, you risk not how having it carried out as you intended. As for improving your decision-making skills, we’re going to focus in the center of the box, those core steps of the process where we create the options, evaluate them, and then choose one. We will come back to the communication steps.

When you ask an architect any question, the default answer is, it depends. Why do they say that? There’s a lot of reasons. The follow-up question should always be, what does it depend on? That’s what’s going through their head. That means understanding the various criteria that are important to that decision. Sometimes, you’re provided specific functional requirements, something like, the system must store file attachments up to 10 megabytes. That’s great. Very useful. More often, we deal with the non-functional requirements, things that are referred to as the -ilities, because they include scalability, maintainability, extensibility. Also, sometimes referred to as quality attribute requirements, because these are the qualities of the system. There’s always a cost factor. Sometimes it’s more obvious than others and more explicit. A build versus buy decision is probably easy to see the cost differential, looking at a PaaS versus an IaaS option, you might be able to see the cost. These are some of the examples of the things you have to think about as the criterias for your decision.

We’re going to focus on those -ilities, the quality attributes, because that’s really where architecture gets wrapped around sometimes. You have to evaluate those non-functional requirements that are usually not well defined, if they’re defined at all. If you can get something measurable, maybe you have an SLA that you have to meet, that’s helpful. When you don’t have that, at a minimum, just try and rank them in order of importance and do those high-level quality tradeoffs. Which one do you want more than the other? For example, asynchronous messaging versus synchronous API calls. Asynchronous messaging has more scalability than a synchronous call, but it introduces eventual complexity, and maybe it makes your system more complex: eventual consistency, and a more complex system. What’s more important? Do you want to have that data that’s immediately accessible or do you need the scalability? It’s going to depend on your situation. Tradeoffs are always context specific. What quality attributes are most important? It depends.

Once you’ve evaluated your options, and decided on the one that you think is best for your situation, you need to communicate that decision. This was the fifth step in our scientific method. What’s the most effective way to communicate your decisions? Again, it depends. Maybe it’s drawing diagrams, because diagrams will always be important. You might use a very structured format like UML, or SysML. Maybe you just wing it each time, boxes and arrows, and that’s fine. One technique that’s been consistently useful is Simon Brown’s C4 model. C4 is a hierarchical set of diagrams that are for context, containers, components, and code. Whatever technique you use, remember that the point of a diagram is to help communicate your design decisions. If your goal is to communicate your design decisions to various stakeholders, you need to know your audience. The C4 model acknowledges this with each layer of the hierarchy from context to code, having a slightly different intended audience. Even the best diagrams, they have some limitations, because a diagram is just a model. As someone once said, all models are wrong, but some are useful. Diagrams are often useful because they show what to build. What they don’t show is why it should be built that way.

We went through the decision-making process. We evaluated multiple options. We looked at the tradeoffs, we chose one. That diagram only captures the winner. Imagine watching the Olympics, and all you see are the gold medalists. There’s no other athletes. There’s no coverage of the events. You know right away, something’s missing. I want more information. The other challenge with diagrams is you have to keep them up to date. When do you have to go and update a diagram? You update them when your decisions change. The problem is that those changes aren’t always explicit. It’s not always, I change our design from A to B. Sometimes it just drifts a little bit. That means diagrams can get stale, because those implicit changes that no one wrote down have affected the design and now what is actually implemented doesn’t match the diagram. When it comes to communicating our design decisions, we can do better than just drawing pictures.

Architecture Decision Records, or ADRs, are a great tool for the entire decision-making process. The term was first coined by Michael Nygard, back in 2011. In his blog post, he points out that agile methods are not opposed to documentation, only to valueless documentation. The value of the ADR is it fills in the gaps. It explains the why behind the decision. ADR is just a lightweight template with sections that align to the steps I outlined earlier as the scientific method. At a minimum, you can start by describing the context of the decision and then jump down to, here’s the chosen option. If that’s all you read, that’s basically the same information that was provided in the diagram, here’s the decision. There’s more because the ADR captures everything in between. It lists all the options that were considered. It lists the decision criteria that were important, and how those tradeoffs were made, describing the pros and cons of each option. That’s powerful stuff. It’s not really that complicated. It’s just a useful template. If you’re like me, you’ve probably stared at a lot of blank whiteboards thinking, what should that system look like? A blank ADR starts with a template with the sections you need to fill in. It’s already a little more helpful than the blank whiteboard. ADRs are helpful because they help you start thinking about communication. It makes you take the time to write down the decision that’s being made: write down your options, describe the tradeoffs. That naturally gets you thinking, how would I explain this to someone else? It’s like trying to teach a class to a group of people, and you have to learn the material more than if you just learned it for yourself. ADRs have that same effect for you as an individual because they just force you to go through the deliberate thinking process.

I know some people are more comfortable drawing boxes and arrows than writing prose. This doesn’t need to be a lot of writing. There’s an emphasis on it being really lightweight. I personally prefer to write ADRs using Markdown. There’s a few different templates out there. The one I use is from MADR. It comes with a CLI. I can type MADR new, the name of my decision, and I get a new file. It’s added to a little index catalog. Then I just start writing, and it tells me what to fill in. Because it’s Markdown, in Markdown, you can do mermaid diagrams. If you have simple diagrams that you need to include that might help you describe and visualize those two options you’re considering, you can put those in there as well. ADR starts with a header that has header information. The ID and the name get added when you create a new file. The date and the deciders I think are really important. The date tells you, is this a new decision? Was this in the last few months, or is it a couple years old? If it’s a couple years old, how much do I trust it? The deciders, I don’t like saying it’s a who to blame, but it’s who to blame. Because you should not put down a department name or a job title, put down your name and stand by your decisions. That way, if someone has a question, they can come back and ask you and you can review it together. The status is there because you should never delete an ADR. That if you made a decision six months ago, and you’re making a new decision that changes that, you should change the status to supersede it and explain, go look at this new one. Then the new one can refer back to, this supersedes the previous one. Then what’s nice about it being in Markdown, it’s just a text file. Text files are great for checking into the source control. Then you get all the benefits that Git or whatever your source control provider has. You can see the history. You can use pull requests for gathering feedback. It lives where everyone is going every day, right in your source control repository. It’s not a separate Wiki that only the architects know about or a SharePoint site or a share drive. It’s right there. Treat it like your code. Version it like your code. Use it like your code.

ADRs and diagrams are not the only ways to communicate design decisions. Design decisions are not the only things that architects need to discuss. Always be thinking about your audience. What do they need to know and what should you leave out? I’m not saying you should deliberately hide information. There are times when you need to be able to give a high-level summary with the elevator pitch without all the details, and then other times you need to go into those details. That’s where knowing your audience comes in handy because if you only have five minutes to present versus an hour, you’ve got to figure out what’s important for that audience. During that first phase of our scientific method, you need to do some research. Two of the techniques that I’ve found useful are event storming, and domain storytelling. Event storming is useful for understanding the business process, and seeing all the actors and interaction paths. You get a bunch of people together in a room, put some butcher paper up on the wall, and go wild with Sticky Notes. You rearrange them until you have your process mapped out. This is moved online using tools like Miro. Then, domain storytelling is similar, but it adds a specific graphical language, little glyphs that you use just to describe your process. That creates visual documentation. It helps you visualize what that workflow is. You can show it to your audience and say, does this map your perception of how this process flows? Both those techniques are useful for either understanding existing processes, or for designing new ones. If you’re going to come up with a new system, map it out. Those are just two techniques. My point being that next level architects need to be aware of these techniques and others when we’re designing complex systems, because they really help with gathering that information in that early communication phase.

Adaptability

We’ve got our first two superpowers, improve communication, because we know our audience, and better decision making, and communicating those decisions, because we’re using Architecture Decision Records, ADRs. Our third skill for leveling up as architects is adaptability. Planning is important, but nothing ever goes exactly as planned. The Agile Manifesto backs us up saying we should value responding to change over following a plan. How do we improve how we respond to change? Making a change from our plan instead means that we’ve changed one or more of our decisions. That’s either the circumstances have changed, or maybe there was an assumption that we made that we found out was invalid. Hopefully, our overall goal has remained about the same, and we only need a minor course correction. In any case, if we’ve documented how the decision was made, we can revisit it. We can read that ADR and then supersede it with a new decision based on our new information. Without the ADR, all we’d have is the original diagram, and we’d spend too much time and effort maybe designing something drastically different, when all we needed to do was look at, we chose option B last time, option C was right there, we didn’t think it made sense. Now we think C makes more sense. Having those available to allow you to reevaluate, makes it a lot faster to make small decision changes and do those minor course corrections based on new information as it arises.

We spent decades trying to be agile for developing software, and architecture has been playing catch-up. We want our architecture to be agile. It has to respond to change. Some ideas of how to design your architecture to allow for continuous evolution are captured in a seven-part article series by Pierre Pureur and Kurt Bittner on InfoQ. Pierre is also coauthor of a book on Continuous Architecture. One idea that’s discussed in those articles is the minimum-viable architecture. The MVA is the architecture that supports your MVP, minimum-viable product. You make your design decisions, but with the idea that those decisions are just what you need right now. You know they’re going to change later when your software has been adopted, and you have new scalability concerns or different user requirements. You can now revisit those decisions and make new ones. The MVA allows you to validate your decisions and see how they perform in the real world. That means the architecture can continually evolve, because it’s based on decisions that we expect to continually evolve. That’s agile architecture.

We want our system to be agile. We also need to be agile as architects. This goes back to that idea of architects design the architecture, but they also practice architecture. Clearly, the biggest factor in the last few years has been the move to hybrid and remote teams, no hiding that. That has led to some communication challenges. Innovative architects are finding ways to adapt and thrive. There’s an entire track at QCon about remote and hybrid working because there’s so much good information there. Those ideas discussed are actionable right away. It might take you a year to implement the new technology hereabout, but you might be able to try some of those new processes for improving communication on remote teams tomorrow. One common observation in those discussions is that asynchronous forms of communication are more standard and are being used more effectively. ADRs lend themselves to asynchronous communication. We don’t have the conference room whiteboard to stand around for hours, that means the architects can’t hide and do it alone. It also means that people can’t walk by and see what’s going on in there. Having it not hidden in the architecture wing of the building, maybe that’s a good thing. Maybe it’s now more accessible because the ADRs are out there in source control. We’re also seeing changes in the work habits that are influencing the software that gets built. I call this the COVID Corollary to Conway’s Law, that highly effective distributed teams are able to build highly effective distributed systems. Conversely, when teams struggle with interpersonal distributed communication, those communication problems will manifest within the software that they build.

Adaptability is important because technology is always changing. That means we’ll see new quality attributes that are driving our design decisions, and the ones we have will evolve over time. Have you seen the Principles for Green Software Engineering? One of the philosophies in there is that everyone has a role to play in the climate solution. Architects actually have a major role, because architecture decisions can have a significant impact on the carbon footprint of a system. If you think about how you’re building many microservices versus one mega server, but do those services need to be on all the time? Can you go to functions? Can you go to smaller processes that only run when you need them to? How do you make those tradeoffs to affect your sustainable and carbon impact? We’re also seeing other quality attributes evolve, like extensibility. That used to be, make some good APIs, so that people can extend your software. The intended audience of those APIs was always professional developers, people who could write a lot of code. We now have the rise of low-code and no-code platforms. That means our extensibility plans have to accommodate citizen developers. That’s going to change how architects design systems. Then, being adaptable means you’re just more prepared for whatever comes next. You’re not fixed and set in your ways, because we don’t know what the future holds. If you are stubbornly set in your ways, like this is how I’m always going to design systems, we’re going to leave you behind. You won’t get to the next level.

Leadership

The last of our four skills for great architects is leadership. For several years, architect as technical leader has been on the InfoQ Architecture and Design Trends report. That’s because software architecting is a skill that all developers need. Experienced architects have an obligation to share that experience, and help others. Several years ago, I worked at Nordstrom. A high-end department store chain that is known for excellent customer service. That’s where I was introduced to the idea of the inverted pyramid. You can look this up. It’s taught in business schools. Other companies have adopted it, but it’s what Nordstrom is really known for. Their org chart is upside down. It is an inverted pyramid. Employees do not report up to managers, managers support their employees. The person that’s selling shoes, the one interacting with the customer, they’re at the top of the org chart, not the CEO. When I was a technical lead, I supported the engineers on my team. I’m no longer at Nordstrom, and every company I’ve worked for before and since has had a traditional top-down org chart. That’s still a driving force of how I see my role and responsibilities. It’s the idea of servant leadership. That can apply regardless of your org chart structure. It means not being hands-off in how I approach my job. I can’t just draw a diagram, throw it out the ivory tower, and hope the team implements it correctly. That’s also why I enjoyed talking to Andrew Harmel-Law about the architecture advice process. One of the key takeaways from that conversation was that anyone can make architecture decisions. I’ve hit on this already. What he says is that those people have to do two things, consult with two groups: people that are affected by the decision, and people with relevant experience. He uses ADRs as a framework, to have developers encouraged to make architectural decisions. The architects are there to provide advice and help identify those people who will be affected by the decision or the people who have the relevant knowledge, because the architects may know more of the organization. It all brings us back to the importance of communication. We’re communicating how to make architecture decisions.

That advice process really shows that the architecture is not only for architects. If your role is primarily as an architect, then you need to be that technical leader. That means empowering those engineers to make good decisions. If your ADRs are stored in source control, they can serve as a good example of how to go through the decision-making process. How do we evaluate the tradeoffs? Building software is a process of dealing with uncertainty. I think architects had to be comfortable working in that zone of uncertainty. Engineers sometimes are shielded from it because people have made the decisions for them. When faced with the unknown, we need to have our engineers not just sit idle waiting for an architect to tell them what to do. Instead, we want to provide the support and grow their ability to make good decisions. Provide the safety net, but show them how to get out of that rut and continue on when they don’t know where to go.

Putting it All Together

That gets us through all four of the important skills. Let’s put them together and talk about some practical examples. To recap, our four characteristics of great software architects. They start with communication, decision making, adaptability, and leadership. Maybe you’re wondering if there’s something else that should be on the list. He hasn’t talked about microservices, stream processing, Kubernetes, Kafka, Quarkus. Architecture is not a game of buzzword bingo. New architecture patterns and tools and technologies, they’ll come and go. You need to use critical thinking skills and good decision making to understand if they are right for you. It depends. That means, in addition to being able to communicate your good decisions, you sometimes need to explain why if we use that, that would be a bad decision. Here, I understand why. Talking back to the idea of architecture not just being limited to architects. Those job titles sometimes include architect in them. Even when you don’t, you still have architecture work. That means that the roles, that everything we’ve talked about that architects need to do, can apply at any of these technical levels. You can make these decisions, whether or not you have architect in your title. The role of architect and engineer, they’re getting more entwined. Again, we’re getting out of the ivory tower where the architect does one thing and engineers do something different. They are very much interrelated now. In fact, just as every engineer has some level of architectural responsibility, I think every architect has some level of engineering and programming responsibility. That’s why I say that all architects should write code. Maybe that’s a controversial statement. It shouldn’t be. Software architects need to write code. I’ve made my decision. I can just walk away now and tell you, and hope you all go off and implement that. I wrote it in a large font, I clearly was clear. You’ve probably been paying attention and thinking, that decision would be more useful if he explains why.

First, writing code is a way to validate your designs, especially when you’re defining a new pattern. ADRs are very helpful for walking through the tradeoffs. Sometimes you don’t really understand what that design is going to look like until you try to implement it. I think you can relate to that. That also means that you get to share in the pain and frustration when things don’t go right, because they don’t always go right. When they do, you’ve got a little skin in the game, both for the positive and negative. You can celebrate with the team when it works well. As an industry, we are definitely seeing fewer ivory tower architects than we used to, maybe a decade ago. Remote work has isolation built into it, and you can feel very isolated in making your design decisions. You need to be proactive, and ensure that you’re having all those interactions that are necessary to be successful. Writing code is a great way to interact with engineers. You get to feel that osmosis that you lost when you were walking around and just listening to them talk about things. If you want more details, I wrote an ADR for this decision.

The Design Team

When I say architects should write code, I really do not mean full time, they would be engineers. One of the interaction patterns I’ve encountered at a few companies, but it isn’t everywhere, is the design team. Architects usually participate in these. That’s because system design has to consider multiple viewpoints. The design team brings together stakeholders who represent three distinct viewpoints. That’s why sometimes it’s called a triad. The product owner represents business needs. We need someone for the user experience, some designer. Then, we need someone at the table to talk about the technical needs. We’ll call them an architect, but it doesn’t have to be an architect. It could be a dev lead, any staff-plus engineer. These are roles, these aren’t job titles. It’s just different ways of thinking, and someone has a responsibility to have that separate viewpoint.

Software is created to solve business needs. That’s the what that needs to get built. The technical seat at the table is responsible for how the software will get built. The design team is where you start capturing those technical decisions that you need to make, the things that aren’t obvious and you have to go and figure out. At the table of the design team, you can discuss the functional and non-functional requirements, and what tradeoffs you need to think about. That’s the first step in our scientific method, gathering the information for the decision to be made. Ideally, you’re looking a little bit into the future, that this team is looking a few months ahead on the work that you plan to do. That gives you time for the big decisions to actually sit down and do the analysis you need to. There are sometimes when that’s just an afternoon, but there’s sometimes it might take weeks. Put the design team a few steps ahead of the actual team that’s implementing decisions.

Asking for Help

I said ADR can be a template, it can be a better starting point than a blank whiteboard. Sometimes it can be a struggle to just write the first few words. Luckily, we now live in a world of OpenAI chatbots, such as ChatGPT, and Bing. You can ask about the tradeoffs between the options you’re considering and have the conversation about the pros and cons. They may not know the specifics of your situation, but they can help you regarding typical circumstances. If you really want to jumpstart, just ask them to write an ADR. Here’s Bing’s recommendation when I asked if architects should write code. Bing thinks they should. I did ask Bing after I’d written my own ADR and most of this presentation was done. I was pleased that some of its points lined up with the points that I gave. With any use of AI, please don’t take what it says at face value. I did say you should question every assumption and question your AI’s decisions as well. Again, is useful for maybe filling in the blanks and thinking about something you hadn’t considered.

Architecture decisions are made at many levels, within a single dev team, or across a few teams. They’re at the product level. They’re at the department and corporate level. Individually, you as an architect are likely responsible for decisions at one of those levels. It also means that you can have influence on people’s behavior, at least one level above and below. That’s where you go and help the engineers make architecture decisions that are just affecting their team. I think working with the stakeholders and the design team, you have an ability to influence their behavior. If they see how ADRs are effective for technical decisions, why not see if they work for non-technical decisions. This is very much an innovator trend. If you look at the MADR project, the latest version has renamed it to Any Decision Record. There’s nothing in the template that only applies to architecture. That’s really an artifact from the first people who used it being software architects like Michael Nygard. They needed to improve the decision-making process and communicate those decisions, and so ADRs were born. Now that we have them, it doesn’t mean the ADRs have to stay within the realm of software. I would love to see ADRs be used to describe how we got to our corporate goals or new product approvals. Some companies are pretty good at communicating the rationale down to employees, but that’s not always the case. Maybe ADRs is a way that we can help improve those.

Communication Based on Participants

The design team is just one group that an architect will interact with. Architects need to work with the engineering teams that build the software, as well as a lot of business stakeholders, especially that time gathering information and communicating decisions. That means working with people across the company. Gregor Hohpe describes this as riding the architect elevator from the IT engine room, up to the CEO penthouse. My advice before you step off onto a different floor, always keep in mind, know your audience. How are you going to communicate to those people on that floor? I’ve also described that every software problem is a communication problem. It may sound like most of what I’ve talked about only applies between two people. If you think about it, most of the communication things I’ve described can also apply to human-computer interaction, and between two computers. Think about when you’re writing code. That’s a human telling a computer what to do. Know your audience is the computer. There’s always more than one way to write code that has the same desired output. That can be something as simple as formatting your curly braces, or choosing a different algorithm, or even a different language. When you’re making the decision about how to write code, the audience that you actually need to consider is other developers who have to read that software, read that code later. That’s your audience that’s more important. If I have a choice between two ways of writing things, I always favor the more human readable choice. We can come back and reevaluate it for performance later. Even in the computer to computer scenario, the specification and requirements for that interface need to be clearly defined so that developers know how to write their code appropriately. That’s something like the 400 bad requests that are part of the HTTP specification. It’s also about using OpenAPI and AsyncAPI, or other ways to have a specification that clearly expresses, how do you communicate with my service.

One of the best references for dealing with all three of these pathways of communication is Domain-Driven Design by Eric Evans. The subtitle of his book is tackling complexity in the heart of software. Having a ubiquitous language within a bounded context, gets right at two major problems about tackling when talking about software. What’s the scope of the system or subsystem we’re talking about? What are the words we will use to talk about it? Take that language from your business domain, use that language in your design and implement in your software using the same language. That goes a long way to tackling complexity and alleviating a lot of communication problems. Architects, in this day and age can no longer just focus on technology, you have to understand the sociotechnical concerns. That’s another way that we have to be adaptable. Team Topologies embraces the idea of Conway’s Law, and describes four ways that teams should be organized. Those are four topologies. Architects need to either accept the organizational structure, and engineer their systems, architect their systems to align with that org structure, or they have to perform a reverse Conway maneuver, restructure the organization to align with the desired architecture. That can be challenging. In either case, the goal of architects is to find ways to reduce the cognitive load of development teams. It also means you have to recognize that desire for things like low coupling and high cohesion, that’s not just among your system components. That’s also desirable among the teams that are building those components. That’s the book review part of the talk.

Key Takeaways

I want to revisit what we’ve covered, aligning with those four characteristics of great architects. Because every software problem is really a communication problem, the biggest impact a software architect can make is by improving communication. Know your audience, and find new and effective ways to communicate with them. When making decisions, use Architecture Decision Records to explain why a decision was made. Be adaptable, both in how you practice architecture, and in the architecture that you design. Finally, be a leader by providing advice to help make other people make better decisions. I want to finish with a modified quote from Kelsey Hightower. He originally said engineer, but since every architecture can be done by everyone, I’m going to substitute architect in there. I totally believe this, that you become a 10x, not when you do the work of 10 people, but when you make 10 other people better than they were before. I can’t think of a better description of leveling up your architecture game.

See more presentations with transcripts

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.