-
Hieroglyphy: Taking JavaScript Type Coercion to its Illogical Conclusion
JavaScript is (in)famous for being a highly dynamic language that allows a developer to write very "flexible" code. One language feature that makes a significant contribution to this flexibility is the idea of type coercion; that is, JavaScript will automatically (and silently) transform a value of one type into a value of a different type.
As you can imagine however, the more you explore the language's flexibility, the higher a price you pay in terms of code legibility.
Largely for the sake of amusement, this blog takes JavaScript's flexibility to the most extreme (and illogical) conclusion by providing you with an encoding library that takes a regular JavaScript program as input and returns a very long character string that is executable, functionally identical, and completely unreadable! -
Implementing the SHA256 Hash Algorithm in WebAssembly Text
WebAssembly Text (WAT) is ideally suited for implementing CPU intensive algorithms such as calculating a file's SHA256 hash. This blog describes not only how I got this algorithm working in WebAssembly Text, but takes a wider view and looks at the areas where improvements could be made in the overall developer experience of working with WAT. -
Quick notes on how to be a Principal Dev
Do you want to be a principal dev? Look no further. These notes will sort you right out. -
WebAssembly Memory Growth and the Detached ArrayBuffer Problem
When JavaScript acts as the host environment for WebAssembly, shared memory is visible to JavaScript as an ArrayBuffer. WebAssembly memory is allowed to grow, but JavaScript ArrayBuffers are not; so what happens when your Rust program (compiled to WebAssembly) asks for more memory? -
Human-centered Code Reviews
An examination of the practices, values and ways of working that underpin effective code reviews -
In defence of the testing pyramid
I don’t think there’s anything wrong with the testing pyramid. It’s just not quite detailed enough to be useful. Good first approximation, but we can do better. -
Creating a Miro Clone in the browser
We recently worked with a client who asked us to create a freestyle web canvas, for adding various types of 'Card'. -
Plotting Fractals in WebAssembly
This set of blogs builds a progressively more optimised set of WebAssembly Text programs that plot the Mandelbrot and Julia Sets. -
Introduction to WebAssembly Text
An introduction to programming directly in WebAssembly Text -
Write Better Build Scripts
We need simple and efficient build automation both locally, when developing, and in CI pipelines. The use case is slightly different but the goals are the same — scripts need to be simple to write, simple to read and understand, and they need to be repeatable, but we don’t want to repeat unnecessary work. -
toString || !toString
toString, or not toString?
That is the question—
Whether 'tis nobler in the mind to suffer the slings and arrows of outrageous type coercion... -
Next.js Deployment on Netify with Github Actions
A practical, hands-on guide on how to deploy your Next.js app on Netlify using Github Actions as a CI/CD pipeline -
Bazel Impressions
Early impressions of bazel -
NATS Impressions
Early impressions of NATS, its tooling, and how it fits into the universe -
wasmCloud Impressions
Early impressions of WasmCloud -
Dapr Impressions
Early impressions of dapr, its tooling, and how it fits into the universe -
Infrastructure Musings
Semi-structured musings about what my vision of infrastructure nirvana is, and what's available at the moment to help us on our way there -
Safe From the Wolves - Building Security In
Last week I virtually attended the reasonably interesting DevOpsCon London event. My main takeaway is that Shift Left on Security is the current buzz-phrase in the DevOps community, with some suggesting an expansion of the existing merger to create DevSecOps. -
Platform (R)evolution
A look at how platforms for distributed systems are evolving — how they are rising up to meet ever lighter workloads — and charting a journey from Kubernetes, through Istio and Dapr, to wasmcloud and beyond. -
Microfrontends
As we build larger and larger single page apps, it becomes increasingly difficult to maintain the codebase, particularly if multiple teams are working on it -
Networking with a Raspberry
Want to learn about networking, proxies and web servers? Read on. -
a11y is your ally
Accessibility for the Web practices by offering a software engineer perspective -
What's Next, After Kubernetes?
Kubernetes is really good. But it does nothing to address what I think is one of the biggest problems we have with microservices — the ratio of functional code (e.g. our core business logic) to non-functional code (e.g. talking to a database) is way too low.
In this post, I first explore the Onion architecture, how it applies to microservices and how we might peel off the outer, non-functional layers of the onion, so that we can focus on the functional core.
Then we look at how Kubernetes can be augmented to support this idea (with a service mesh, and a distributed application runtime).
Finally, and most importantly we ask what comes after Kubernetes (spoiler, a WebAssembly actor runtime) that can support core business logic more natively, allowing us to write that logic in any language, run it literally anywhere, and securely connect it to capability providers that we don't have to write ourselves (but could if we needed to).
-
Writing a Browser-based WebAssembly Application in Rust
Based on a personal project that started back in 2004 as an Excel spreadsheet, this blog describes how to create a Rust application, compile it to WebAssembly and then run in the browser. -
Guiding Principles for Agile Technology Choices
An attempt to capture some guiding principles for making technology choices - picking tools, tech stacks and making architecture decisions. -
Full-stack Rust
For a while now, I've been wondering how practical it is (as of right now) to use Rust for web applications and services on the server and for web UI in the browser. So I've been spending quite a lot of time exploring the developer experience, whilst trying to understand whether Rust in the browser is actually a good idea! -
Extending Istio with Rust and WebAssembly
Istio recently released verion 1.5 and one of the major changes in it is the deprecation of Mixer in favour of WebAssembly Envoy filters. Let’s build one to see what it takes. -
Understanding JavaScript: Hoisting
The JavaScript compiler uses a strategy called "hoisting" in which certain variable declarations are moved to the top of a function. Here, we take a look not only at this feature and its consequences, but also at some situations in which this behaviour does not happen. -
Understanding JavaScript: Objects and Arrays
In this blog, we take a look at the fact that JavaScript Objects can be accessed as if they were arrays, and the fact that all JavaScript Arrays are in fact Objects. -
Understanding JavaScript: Type Coercion
Since JavaScript is a dynamically typed language, it employs a strategy called "type coercion". This behaviour means that under certain circumstances, values of one datatype will automatically be transformed into the equivalent value of another datatype.
In this blog we take a light-hearted look at not only how and when type coercion takes place, but also some of its more unexpected consequences.
-
Microplatforms - Product Platforms as Code
Microplatforms are an automation-based approach to provisioning and operating platforms running digital products and services, which emphasises autonomy of cross-functional product teams.
This is the developer and engineer sketchpad for digital product consultancy, Red Badger.