<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: David Saltares</title>
    <description>The latest articles on DEV Community by David Saltares (@dsaltares).</description>
    <link>https://dev.to/dsaltares</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F219724%2Fcfe5593b-45f7-4ed8-9a65-91e330c6d5d7.jpg</url>
      <title>DEV Community: David Saltares</title>
      <link>https://dev.to/dsaltares</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dsaltares"/>
    <language>en</language>
    <item>
      <title>How to hire 8 engineers in 8 weeks</title>
      <dc:creator>David Saltares</dc:creator>
      <pubDate>Mon, 26 Apr 2021 12:28:22 +0000</pubDate>
      <link>https://dev.to/aulaeducation/how-to-hire-8-engineers-in-8-weeks-2ijh</link>
      <guid>https://dev.to/aulaeducation/how-to-hire-8-engineers-in-8-weeks-2ijh</guid>
      <description>&lt;p&gt;Hiring engineers is top of mind for any engineering leader, this year at Aula it is the same for me. As VP Engineering I have the daunting task of tripling the size of our Engineering team. Happy to say we are well on track, in the last 8 weeks we have successfully hired 8 wonderful engineers and more than doubled our size!&lt;/p&gt;

&lt;p&gt;I wrote this post for other engineering leaders who’ve just been given the opportunity to rapidly grow their organisations.&lt;/p&gt;

&lt;p&gt;Where does one even start?&lt;/p&gt;

&lt;h2&gt;
  
  
  💜 Context
&lt;/h2&gt;

&lt;p&gt;At &lt;a href="https://www.aula.education/"&gt;Aula&lt;/a&gt;, we’re building the Learning Experience Platform for higher education.&lt;/p&gt;

&lt;p&gt;Aula took the decision to grow its Engineering and Product organisation at the beginning of 2021. We’re building the features that will make educators fall in love with our platform and enable them to create engaging learning experiences for their students.&lt;/p&gt;

&lt;p&gt;Check out our &lt;a href="https://portal.aula.education/tabs/9-vision"&gt;platform vision&lt;/a&gt; to learn more about what we are building.&lt;/p&gt;

&lt;p&gt;Not only do we want to grow fast but we want to ensure that we are focusing on building a high performing, diverse and inclusive team.&lt;/p&gt;

&lt;p&gt;We thought as many engineering leaders are facing the same challenges we should share what we have learned along the way to help you do it too. And of course, if you want to come and join us in this adventure, &lt;a href="https://aulaeducation.recruitee.com/"&gt;we are still hiring&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔝 Prioritise hiring
&lt;/h2&gt;

&lt;p&gt;Giving my team the capacity to achieve our goals was the best way I could help, so I made hiring my number 1 priority.&lt;/p&gt;

&lt;p&gt;Not having a huge Recruitment team meant I had to get stuck into the process of recruitment myself. &lt;/p&gt;

&lt;p&gt;Look at your calendar, if at least 50% of your time is not spent on hiring related activities, hiring is not your top priority and you need to fix it. Prioritising hiring will mean saying no to other things.&lt;/p&gt;

&lt;p&gt;My recommendation here is to roll up your sleeves and jump into your &lt;a href="https://en.wikipedia.org/wiki/Applicant_tracking_system"&gt;ATS&lt;/a&gt;. Being hands on in recruitment will help you understand the candidates attracted to your organisation, refine the recruiting process and ensure that everything is kept moving forward. I spend 30 minutes every morning checking CV’s, looking at interview feedback and ensuring that I know exactly what is happening in my recruitment pipeline.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.notion.so/aulaeducation/Mission-and-Virtues-at-Aula-9f2c356b2d8e44f9bfdb772ec3ca396c"&gt;Uncomfortably focused&lt;/a&gt; is one of our virtues here at Aula. I know that the team has suffered in the short term because I haven’t been able to spend as much time as I would have liked supporting them. However in the long run, bringing in new team members to support what we are building has led to everyone being happier. &lt;/p&gt;

&lt;h2&gt;
  
  
  💬 Get ready to talk to a lot of people
&lt;/h2&gt;

&lt;p&gt;Recruiting is a people game, doing this successfully means you're about to meet a lot of new people.&lt;/p&gt;

&lt;p&gt;One of the most important things is to make the time to do that. If you want your business to start growing, then this is the first thing you should do is make sure you are ok with the idea that hiring starts with conversations.&lt;/p&gt;

&lt;p&gt;In the first quarter of 2021, we had more than 1100 people enter the top of our recruiting funnel and spoke with more than 200 engineers who could potentially fit the job. &lt;/p&gt;

&lt;p&gt;I send messages on LinkedIn, emails to potential candidates and ask friends in my network for help.&lt;/p&gt;

&lt;p&gt;This can be tremendously draining for an introvert such as myself. Well, it may be draining for just about anyone! Make sure to take breaks and rest well.&lt;/p&gt;

&lt;h2&gt;
  
  
  ♻️ Standardise the process
&lt;/h2&gt;

&lt;p&gt;Standardising your hiring process is one of the most high leverage things you can do.&lt;/p&gt;

&lt;p&gt;Create wiki pages where you list the questions and problems for each stage of the process. Detail what the team wants to learn from the candidate with each question and what a poor/ok/great answer could look like. Create scorecards for each stage every interviewer will fill in.&lt;/p&gt;

&lt;p&gt;Ask every candidate the exact same questions.&lt;/p&gt;

&lt;p&gt;This will benefit you in at least three ways:&lt;/p&gt;

&lt;p&gt;⚖️ Consistency allows you to get better insights, compare and evaluate candidates much more easily.&lt;br&gt;
📚 A documented process will help team members with little interviewer experience get trained.&lt;br&gt;
🤔 Standardised interviews will reduce the biases of the process. To minimise bias, you should also have two interviewers at each stage.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤝 Build great relationships with your recruiters
&lt;/h2&gt;

&lt;p&gt;There is no way you will double the size of your team alone. Having a top notch recruitment team is essential.&lt;/p&gt;

&lt;p&gt;Make sure your whole team understands the profile you’re looking for and why they would join your company. The recruiters you are working with are an extension of your voice in the market and will be pitching candidates.&lt;/p&gt;

&lt;p&gt;We do engineering hiring standups 3 times a week, run retrospectives every month, constantly give each other feedback and document everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✍️ Build great content
&lt;/h2&gt;

&lt;p&gt;In order for your jobs to stand out, you need to tell a story. From the job ad to all your interactions with candidates through the process. You will have to raise awareness about what you’re all about and tell this story a thousand times.&lt;/p&gt;

&lt;p&gt;The best way is to write it or film it and put it out there!&lt;/p&gt;

&lt;p&gt;At Aula, we have built great pieces of content that continue to help us through this journey:&lt;/p&gt;

&lt;p&gt;🧠 &lt;a href="https://www.notion.so/aulaeducation/The-Aula-Brain-4da091a8797840108311d99815b3b36f"&gt;The Aula Brain&lt;/a&gt; - our public handbook.&lt;br&gt;
👩‍💻 &lt;a href="https://dev.to/aulaeducation/aula-behind-the-scenes-of-the-learning-experience-platform-our-stack-1gno"&gt;A blog post about our tech stack&lt;/a&gt;.&lt;br&gt;
🛣️ &lt;a href="https://portal.aula.education/"&gt;Our public roadmap&lt;/a&gt;.&lt;br&gt;
💼 &lt;a href="https://www.notion.so/aulaeducation/How-we-work-b1af4d53998949e5b05697158261c27a"&gt;How our Product Development team works together&lt;/a&gt;.&lt;br&gt;
📽️ &lt;a href="https://www.youtube.com/watch?v=zIXtXYkqqJg&amp;amp;feature=emb_logo"&gt;Camila’s story&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Language matters. Make sure you avoid gender bias from your content as much as possible. I recommend you run your content through an analyser such as &lt;a href="http://gender-decoder.katmatfield.com/"&gt;Gender Decoder&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Automate as much as possible
&lt;/h2&gt;

&lt;p&gt;There will be an enormous amount of repetitive work. It’s best to automate as much of it up front.&lt;/p&gt;

&lt;p&gt;A lot of our interview scheduling is done through &lt;a href="https://calendly.com/"&gt;Calendly&lt;/a&gt;. So much email back and forth has been avoided by this!&lt;/p&gt;

&lt;p&gt;Every time a candidate is moved through the pipeline, our ATS automatically sends emails and assigns tasks for the next steps. This saves time but also lifts a huge mental burden.&lt;/p&gt;

&lt;p&gt;Don’t remove the human element from the process, especially when it comes to giving feedback. Candidates invest valuable time interviewing with you. Anyone who is rejected deserves a customised message with specific feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  📆 Pre-book interview slots
&lt;/h2&gt;

&lt;p&gt;The engineers in your team will have to do a ton of interviews. This takes a lot of time and focus from sprint work. It’s not just the interview slot but the prior prep and evaluation that comes after as well.&lt;/p&gt;

&lt;p&gt;Context switching can kill productivity and increase stress.&lt;/p&gt;

&lt;p&gt;To help engineers focus, have pre-booked weekly interview slots. Predictability will facilitate better time management.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔍 Track everything &amp;amp; iterate
&lt;/h2&gt;

&lt;p&gt;Use the data to make better decisions and set targets.&lt;/p&gt;

&lt;p&gt;Track everything. Measure your data and analyse it to make better decisions that can help you optimise to achieve your goals. Data can help you make changes to attract more applicants, avoid losing candidates or screen better and save engineering interviewer time.&lt;/p&gt;

&lt;h2&gt;
  
  
  🙌 That’s it!
&lt;/h2&gt;

&lt;p&gt;Really keen to hear if you think I missed anything important and let me know if you found this useful.&lt;/p&gt;

&lt;p&gt;There's so much more that could be covered!&lt;br&gt;
🏫 Interviewer training&lt;br&gt;
👩‍🎓 Onboarding&lt;br&gt;
🚀 And more!&lt;/p&gt;

&lt;p&gt;Good luck!&lt;/p&gt;

</description>
      <category>hiring</category>
      <category>leadership</category>
      <category>react</category>
      <category>aws</category>
    </item>
    <item>
      <title>Aula - Behind the scenes of The Learning Experience Platform - Our stack</title>
      <dc:creator>David Saltares</dc:creator>
      <pubDate>Mon, 08 Feb 2021 17:00:49 +0000</pubDate>
      <link>https://dev.to/aulaeducation/aula-behind-the-scenes-of-the-learning-experience-platform-our-stack-1gno</link>
      <guid>https://dev.to/aulaeducation/aula-behind-the-scenes-of-the-learning-experience-platform-our-stack-1gno</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Aula is the Learning Experience Platform (LXP) for higher education. We make it easy for educators to create community-first learning experiences that truly engage students. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/6Mi5wySZUM0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  😅 TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Terraform.&lt;/li&gt;
&lt;li&gt;React, React Native and Redux.&lt;/li&gt;
&lt;li&gt;AWS Lambda/serverless running on Node.js, S3, SNS, SQS, etc.&lt;/li&gt;
&lt;li&gt;MongoDB Atlas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚙️ The stack
&lt;/h2&gt;

&lt;p&gt;Let's dive right in! 🏊‍♂️&lt;/p&gt;

&lt;h3&gt;
  
  
  ⌨️ Javascript
&lt;/h3&gt;

&lt;p&gt;Our entire stack is written in Javascript. This includes our web applications, mobile client and all of our back-end services.&lt;/p&gt;

&lt;p&gt;Using modern Javascript throughout our codebase feels great. It gives our small team of full-stack developers a consistency, which coupled with Javascript's flexibility empowers us to be productive and move at a very fast pace.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏛 Isolated, reproducible environments
&lt;/h3&gt;

&lt;p&gt;We work with higher education institutions, a regulated sector where data privacy and security are of the utmost importance. No Aula back-end service should be able to access data from multiple institutions. Additionally, institutions should scale according to their needs in a cost effective manner.&lt;/p&gt;

&lt;p&gt;That is why each partner institution we work with gets their own fully isolated environment. In practical terms, this translates into a separate sub-account and &lt;a href="https://aws.amazon.com/vpc/?vpc-blogs.sort-by=item.additionalFields.createdDate&amp;amp;vpc-blogs.sort-order=desc" rel="noopener noreferrer"&gt;Virtual Private Cloud (VPC)&lt;/a&gt; on AWS. Traffic can go in and out of the VPC through a &lt;a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html" rel="noopener noreferrer"&gt;NAT instance&lt;/a&gt; running on an &lt;a href="https://aws.amazon.com/ec2/?ec2-whats-new.sort-by=item.additionalFields.postDateTime&amp;amp;ec2-whats-new.sort-order=desc" rel="noopener noreferrer"&gt;EC2&lt;/a&gt; machine via &lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjh1xlwlcyoo144sxrxbk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjh1xlwlcyoo144sxrxbk.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every time we sign a new partner institution we set up a VPC and all the other AWS resources we require. This is an involved and error prone process and that is why we let machines do it!&lt;/p&gt;

&lt;p&gt;We heavily rely on &lt;a href="https://en.wikipedia.org/wiki/Infrastructure_as_code" rel="noopener noreferrer"&gt;infrastructure as code&lt;/a&gt; and use &lt;a href="https://www.terraform.io/" rel="noopener noreferrer"&gt;Terraform&lt;/a&gt; to define and provision new environments. Terraform removes the human error factor and makes creating new environments a far easier process.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚛 Storage
&lt;/h3&gt;

&lt;p&gt;Each use case requires a particular type of storage. As previously mentioned, each store is separate per institution and lives within their corresponding VPC.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.mongodb.com/2" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt; via &lt;a href="https://www.mongodb.com/cloud/atlas" rel="noopener noreferrer"&gt;Atlas&lt;/a&gt; for our long-lived application data: posts, comments, messages, assignments, etc.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.elastic.co/elasticsearch/" rel="noopener noreferrer"&gt;ElasticSearch&lt;/a&gt; running on EC2 to power our search feature.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/s3/" rel="noopener noreferrer"&gt;S3&lt;/a&gt; to store images, videos and other files users can share on the platform.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://redis.io/" rel="noopener noreferrer"&gt;Redis&lt;/a&gt; for our &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API" rel="noopener noreferrer"&gt;WebSocket&lt;/a&gt; server instances to communicate and deliver real-time updates to our front-ends.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🏎️ Microservices
&lt;/h3&gt;

&lt;p&gt;At Aula, we have built our back-end around the &lt;a href="https://microservices.io/" rel="noopener noreferrer"&gt;microservices&lt;/a&gt; paradigm. We believe it to be the best fit for our use case because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We can collaborate more easily without conflicts.&lt;/li&gt;
&lt;li&gt;Services can auto-scale independently in a much more cost-effective way.&lt;/li&gt;
&lt;li&gt;Issues affecting one service can be isolated, allowing the rest of the application to function as usual.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We minimise the drawbacks of microservices with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shared utility libraries to reduce boilerplate.&lt;/li&gt;
&lt;li&gt;Tooling to manage deployment complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of our back-end logic runs on &lt;a href="https://aws.amazon.com/lambda/" rel="noopener noreferrer"&gt;AWS Lambda&lt;/a&gt; and the &lt;a href="https://www.serverless.com/" rel="noopener noreferrer"&gt;Serverless framework&lt;/a&gt; with the Node.js runtime. This allows us to focus on the business logic rather than managing servers. We find that Lambda functions scale phenomenally well. Migrating from a Docker/EC2 model to Lambda has truly transformed Aula Engineering, dramatically improving stability and developer experience.&lt;/p&gt;

&lt;p&gt;Let's go through the journey of two common workflows at Aula, such as &lt;em&gt;creating a post&lt;/em&gt; and &lt;em&gt;sending a message&lt;/em&gt;, and see what happens under the hood.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8xafifdd76yfzkvvxz04.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8xafifdd76yfzkvvxz04.png" alt="Overall back-end architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The client makes an HTTP request to an API endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/api-gateway/" rel="noopener noreferrer"&gt;API Gateway&lt;/a&gt;, managed by AWS invokes the corresponding Lambda function that implements the route handler.&lt;/li&gt;
&lt;li&gt;The Lambda function will handle authentication, run some business logic, save content to the database as well as pushing an event to our &lt;a href="https://aws.amazon.com/sns/" rel="noopener noreferrer"&gt;SNS&lt;/a&gt; event bus. This will allow other services to react to the event in a non-blocking, fault-tolerant way.&lt;/li&gt;
&lt;li&gt;An &lt;a href="https://aws.amazon.com/sqs/" rel="noopener noreferrer"&gt;SQS&lt;/a&gt; queue for live updates picks up the event and triggers a new Lambda function that forwards the event to our Websocket server.&lt;/li&gt;
&lt;li&gt;Our Websocket server runs on &lt;a href="https://aws.amazon.com/blogs/aws/aws-fargate/" rel="noopener noreferrer"&gt;Fargate&lt;/a&gt; and communicates across instances via Redis. The new post or message event reaches other relevant users via sockets! Fargate removes a lot of the complexity of scaling a cluster of containers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Lambda, SNS, SQS pattern described above is used for many other features like push notifications or search indexing. The use of &lt;a href="https://en.wikipedia.org/wiki/Dead_letter_queue" rel="noopener noreferrer"&gt;dead letter queues (DLQs)&lt;/a&gt; when a particular queue message fails to be processed provides us with great error recovery capabilities. Messages are not lost and processing can be retried.&lt;/p&gt;

&lt;h3&gt;
  
  
  User analytics
&lt;/h3&gt;

&lt;p&gt;Aula is a data-driven company. We rely heavily on user analytics to make product decisions. Furthermore, educators using Aula depend on student engagement data to identify those who may be falling behind and need a bit of help.&lt;/p&gt;

&lt;p&gt;It's essential that our analytics pipeline is reliable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcs8ua3n8uvtwc7thfl7d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcs8ua3n8uvtwc7thfl7d.png" alt="Analytics pipeline"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both our clients and back-end services may generate analytics events. These events are processed by a lambda function that uses &lt;a href="https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html" rel="noopener noreferrer"&gt;Kinesis Firehose&lt;/a&gt; to aggregate events into an S3 bucket. Analytics events and our MongoDB store are synchronised into our &lt;a href="https://www.snowflake.com/data-warehousing-glossary/virtual-warehouse/" rel="noopener noreferrer"&gt;Snowflake&lt;/a&gt; data warehouse, and are transformed for consumption by &lt;a href="https://www.metabase.com/" rel="noopener noreferrer"&gt;Metabase&lt;/a&gt;, our &lt;a href="https://en.wikipedia.org/wiki/Business_intelligence" rel="noopener noreferrer"&gt;Business Intelligence&lt;/a&gt; tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F08nxvkb9isgddcjr8pk5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F08nxvkb9isgddcjr8pk5.png" alt="Student engagement chart"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚛️ Web and mobile clients
&lt;/h3&gt;

&lt;p&gt;At Aula, we love &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;React&lt;/a&gt; for its one-way data flow, composability and huge community. We use React in all our client applications. On mobile, &lt;a href="https://reactnative.dev/" rel="noopener noreferrer"&gt;React Native&lt;/a&gt; gives us all the benefits of React plus access to native features when needed.&lt;/p&gt;

&lt;p&gt;On top of being fantastic tools, their level of consistency keeps the mental burden on the team to a minimum, which allows us to be flexible and work across the product easily.&lt;/p&gt;

&lt;p&gt;In order to avoid repetition when building features for both web and mobile, both platforms share the whole Redux store, actions, reducers and selectors. The re-use also results in fewer bugs and a more consistent experience across devices 🐛!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fe0fcatacay317qlot1bl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fe0fcatacay317qlot1bl.png" alt="sharing code between mobile and web"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ♻️ Build, test and deploy workflow
&lt;/h3&gt;

&lt;p&gt;Managing a collection of microservices, multiple front-ends and many different environments can certainly become cumbersome without the appropriate tooling. We have automated all these processes with a combination of off-the-shelf products and our own Aula &lt;a href="https://en.wikipedia.org/wiki/Command-line_interface" rel="noopener noreferrer"&gt;CLI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All of our code lives in a &lt;a href="https://en.wikipedia.org/wiki/Monorepo" rel="noopener noreferrer"&gt;monorepo&lt;/a&gt; hosted on Github, which we also use for issue-tracking. When a PR is open, a &lt;a href="https://circleci.com/" rel="noopener noreferrer"&gt;Circle CI&lt;/a&gt; job kicks off that lints and tests the changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj8u76ss98oxs3oooj882.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj8u76ss98oxs3oooj882.png" alt="PR checks"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once a PR is merged, another Circle CI job is spun, which:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Builds the front-ends and services that have changed.&lt;/li&gt;
&lt;li&gt;Creates a new monorepo version.&lt;/li&gt;
&lt;li&gt;Deploys the version to our staging environment.&lt;/li&gt;
&lt;li&gt;Runs E2E tests written in &lt;a href="https://www.cypress.io/" rel="noopener noreferrer"&gt;Cypress&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Deploys the version to our internal Aula environment. We &lt;a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food#:~:text=Eating%20your%20own%20dog%20food%20or%20dogfooding%20is%20the%20practice,a%20kind%20of%20testimonial%20advertising." rel="noopener noreferrer"&gt;dog-food&lt;/a&gt; our own product 🐶!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9tgu8xi18ak9fs9yb07f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9tgu8xi18ak9fs9yb07f.png" alt="Jobs that run after merge on Circle CI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We trigger deployments to production via Aula CLI, which in turn spins up jobs on Circle CI.&lt;/p&gt;

&lt;p&gt;The Aula CLI also provides tooling around other common workflows such as test user creation and individual service deployments.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚨 Logging, monitoring and alerting
&lt;/h3&gt;

&lt;p&gt;Observability is paramount when maintaining a SaaS product. You should not wait until your users tell you something is not quite working before you act 😱!&lt;/p&gt;

&lt;p&gt;All our back-end services output logs and metrics into &lt;a href="https://aws.amazon.com/cloudwatch/" rel="noopener noreferrer"&gt;CloudWatch&lt;/a&gt;. Alarms are then set based on our &lt;a href="https://en.wikipedia.org/wiki/Service-level_agreement" rel="noopener noreferrer"&gt;SLAs&lt;/a&gt;. For example, when the availability of a REST endpoint goes below 99.9% for 1 minute, an alarm is raised and routed to &lt;a href="https://www.atlassian.com/software/opsgenie" rel="noopener noreferrer"&gt;Opsgenie&lt;/a&gt;, our on-call management tool.&lt;/p&gt;

&lt;p&gt;Alerts are periodically tuned to maximise how useful they are whilst keeping noise to a minimum.&lt;/p&gt;

&lt;p&gt;Client-side errors are tracked via &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Next
&lt;/h2&gt;

&lt;p&gt;We have a public &lt;a href="https://portal.aula.education/tabs/8-in-development" rel="noopener noreferrer"&gt;product portal&lt;/a&gt; where you can peek into our roadmap and see what we're working on right now.&lt;/p&gt;

&lt;p&gt;As a team, we continuously improve our processes and technologies. For example, we're introducing Typescript as we build a &lt;a href="https://portal.aula.education/c/59-aula-editor-v2-0" rel="noopener noreferrer"&gt;brand-new content editor&lt;/a&gt; based on &lt;a href="https://www.slatejs.org/examples/richtext" rel="noopener noreferrer"&gt;Slate&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  👋 Join us
&lt;/h2&gt;

&lt;p&gt;Do you want to join a remote and diverse team, work with exciting technologies and build a community-first platform that helps educators make learning truly engaging? We're looking for &lt;a href="https://aulaeducation.recruitee.com/o/senior-software-developer" rel="noopener noreferrer"&gt;Senior Software Developers&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>react</category>
      <category>startup</category>
      <category>serverless</category>
      <category>node</category>
    </item>
  </channel>
</rss>
