One of the objections to the iPad becoming a mainstream productivity device is the lack of seamless interplay between apps. With the addition of drag and drop, Apple has once again pushed the iPad forward as a strong contender in the productivity space.

At this year’s Worldwide Developers Conference (WWDC), we saw the continued evolution of Apple’s offerings. Pundits may say these changes aren’t revolutionary enough, but we’re excited about a number of refinements.

You’ve probably heard statements like “JavaScript is a toy language because it doesn’t support multithreading.” But in fact, JavaScript is well-suited for a plethora of concurrency problems while avoiding common multithreading gotchas. You might say JavaScript is single-threaded… just so it can be multithreaded! But you’ll need some patterns to write concurrent code that is performant and readable. Enter the Async IIFE.

When your Vapor tests hit the database, test data can get in the way of your development data, and your development data can cause your tests to fail because of records the tests don’t expect. Let’s fix those problems by creating a separate testing database and resetting it after each test. Along the way, we’ll talk about what database to use and how to create records for your tests.

Having high-quality code in your app saves time and budget in the long term and gets an overall better, more sustainable product. But high-quality code doesn’t come easy—there are principles and best practices that must be maintained throughout the entire development process.