Update: While simplifying a complex code example shortly before publishing, I messed up some details. Thanks to reader feedback for pointing this out, I’m very grateful! I also messed up an internal link, but that’s fixed as well. Thanks again Link to heading The Reconciliation Engine Link to heading In my previous articles (1, 2), I explored how React.memo works and smarter ways to optimize performance through composition. But to truly master React performance, we need to understand the ...| Posts on cekrem.github.io
The Promise of Memoization Link to heading When React applications start to slow down, React.memo, useMemo, and useCallback are often the first tools developers reach for. After all, preventing unnecessary re-renders seems like a straightforward path to better performance. But in the React ecosystem, memoization is far more complex than it first appears. In this post, we’ll look at how these tools actually work under the hood, the subtle ways they can fail, and when they’re truly benefici...| Posts on cekrem.github.io
Introduction Link to heading When dealing with large lists or complex DOM structures, performance optimization often feels like a complex puzzle. But sometimes, the simplest solutions are the most effective. Enter content-visibility: auto - a CSS property that can dramatically improve rendering performance with minimal effort. You can (and IMHO should) read all about it here! 🤓 The Magic of content-visibility: auto Link to heading content-visibility: auto tells the browser to skip renderin...| Posts on cekrem.github.io
One of the most common questions I get about Elm is: “How do I integrate it with existing JavaScript ecosystems?” While Elm’s isolation is a strength, real-world projects often require working with external libraries, APIs, or UI components. Doing incremental migration is also the recommended way to introduce Elm, and luckily there are may ways to accomplish this. Today, I’ll show you how to combine two powerful technologies: Elm Ports: The official way to communicate between Elm and ...| Posts on cekrem.github.io
I recently added a new feedback widget to this site – Feedback.one – and I’m impressed enough with it that I thought it deserved its own post. Beyond being a useful tool, it’s also an excellent example of how functional programming languages like Elm can shine in production environments. What is Feedback.one? Link to heading At its core, Feedback.one is a simple but powerful tool that adds a non-intrusive feedback button to your website. With one line of code, you get:| Posts on cekrem.github.io
Introduction Link to heading When it comes to React performance optimization, React.memo is often the first tool developers reach for. It’s the hammer we grab when we notice re-render issues, and suddenly everything looks like a nail. But what if I told you that in many cases, there are simpler, more elegant solutions that align better with React’s compositional nature? Today, I want to explore some fundamental concepts about how React renders components and share composition patterns tha...| Posts on cekrem.github.io
In a world dominated by React, Vue, and Svelte, it might seem strange to highlight Elm – a niche language that has existed since 2012 but has had fewer releases since then than React has in a year. But right now, when frontend development is becoming increasingly complex, and clients are doing heavy lifting that previously belonged on the other side of an API call, it’s worth taking a closer look at what Elm does right.| Posts on cekrem.github.io
In part 1, we laid out our Clean Architecture vision. In part 2, we explored Double Loop TDD. Today, we dive into the refactoring journey that emerged from implementing these principles. The source code at the time of writing is available on GitHub. The Controller Conundrum Link to heading One of the most significant architectural changes in this iteration was moving the ContentController from the infrastructure layer to the interface adapters layer. This shift better aligns with Clean Archit...| Posts on cekrem.github.io
From Hugo to Kotlin: The Journey Continues Link to heading In my previous post, embarked on a bold and ambitious journey to replace Hugo with a custom Kotlin-based blog engine built using Clean Architecture principles (to the letter!). Today, I want to dive deeper into the development process, specifically how I’m using Double Loop TDD to ensure the quality and maintainability of the system. Again, I’m trying to go all-in, basically to see how far is too far, and to learn and explore.| Posts on cekrem.github.io
Let’s make a blog engine, ey? Link to heading Don’t get me wrong - Hugo (the stuff that I’m currently using to drive this site) is great. It’s blazing fast, feature-rich, and battle-tested. But as a developer who’s been diving deep into Clean Architecture lately (as you might have noticed from my recentposts), I’ve been itching to apply these principles to a real project. And what better way to learn than by potentially over-engineering my own blog engine?| Posts on cekrem.github.io
Introduction Link to heading We’ve covered Dependency Inversion, Interface Segregation, Liskov Substitution, and Open-Closed. Now it’s time for the foundation of SOLID: the Single Responsibility Principle (SRP). Again, kudos to Uncle Bob for reminding me about the importance of good software architecture in his classic Clean Architecture! That book is my primary inspiration for this series. The Single Responsibility Principle states that a class should have only one reason to change.| Posts on cekrem.github.io
My First Encounter with a Kotlin UseCaseLink to heading One of my responsibilities as an Android Developer in Vipps (Mobilepay) was to do tech interviews. After a while, I also made the tech assignments and changed the recruitment process a bit. But in the earlier days, we used a standard “build X using Y”, where “Y” was modern Android tools (preferably Compose), and “X” was some non-descript hello world-ish app that did something I can’t for the life of me remember. During one ...| Posts on cekrem.github.io
Introduction Link to heading After exploring Dependency Inversion, Interface Segregation, and Liskov Substitution, let’s tackle the Open-Closed Principle (OCP) in the context of modern React applications. Again, kudos to Uncle Bob for reminding me about the importance of good software architecture in his classic Clean Architecture! That book is my primary inspiration for this series. The Open-Closed Principle states that software entities should be open for extension but closed for modifica...| Posts on cekrem.github.io
Introduction Link to heading After exploring Dependency Inversion and Interface Segregation, let’s tackle perhaps the most misunderstood principle of SOLID: The Liskov Substitution Principle (LSP). Again, kudos to Uncle Bob for reminding me about the importance of good software architecture in his classic Clean Architecture! That book is my primary inspiration for this series. Without clean architecture, we’ll all be building firmware (my paraphrased summary). The Liskov Substitution Prin...| Posts on cekrem.github.io
Following up on my previous post about books software engineers should read, I want to highlight one particular book that I believe could revolutionize how we approach work in software development: Cal Newport’s “Slow Productivity: The Lost Art of Accomplishment Without Burnout”. Why This Book? Link to heading In an industry obsessed with “moving fast and breaking things,” where sprint velocities and story points often overshadow actual value delivery, Newport’s concept of Slow Pr...| Posts on cekrem.github.io
Introduction Link to heading In our previous post, we explored the Dependency Inversion Principle and how it enables clean, modular architectures. Today, let’s dive into another crucial SOLID principle: Interface Segregation. Again, kudos to Uncle Bob for reminding me about the importance of good software architecture in his classic Clean Architecture! That book is my primary inspiration for this series. Without clean architecture, we’ll all be building firmware (my paraphrased summary).| Posts on cekrem.github.io
Introduction Link to heading Update: this has become a series, the next entry can be found here: Interface Segregation: Why Your Interfaces Should Be Small and Focused I’ve lately enjoyed revisiting the SOLID Design Principles. In the world of software architecture, few principles have stood the test of time like these. I find the “Dependency Inversion Principle” particularly interesting, as it’s one of the few that are either forgotten in modern applications, or drowned in so much ov...| Posts on cekrem.github.io
What follows is a non-ordered & non-exhaustive list of great programming books that I’d recommend every ambitious software engineer. The language specific ones are obviously not for everyone. Disclaimer: I have not read all of these from cover to cover. I’ve read most, but some are on my list of books to read next based on suggestions and/or reviews from people I trust. General Link to heading Deep Work: Rules for Focused Success in a Distracted World – Not a programming / software engi...| Posts on cekrem.github.io
My favorite consultancy Link to heading I’m thrilled to share that I’ll be joining my favorite consultancy this coming February! There’s not much more to add, except that it feels fantastic to have signed and secured this next chapter of my future. I had some intriguing opportunities along the way, but Ensō stands out as a rare gem—not just for the excellent terms and usual perks, but especially for the amazing people who make it an extraordinary company.| Posts on cekrem.github.io
The problem Link to heading TL;DR: I need a phone, for a couple of obvious reasons. What I don’t want is a smart phone killing my brain and soul, constantly bashing at my presence and peace of mind. Needless to say I’ve tried countless options and variations, but all my attempts have been less than ideal. My attempts usually fail in one of three ways:| Posts on cekrem.github.io
Sick kid, but not that sick? Link to heading The other day I was home with my oldest daughter. She had a slight cold and an Almost-Fever™, which is usually not enough to skip school by my standards, but this particular day was an outdoors day with a lot of straining physical activity. So, against my potential better judgment I let her stay home, but warned her that it wouldn’t be quite a spa – some chores and a little school work was to be expected. She gladly accepted my terms, well-ra...| Posts on cekrem.github.io
Turbo Tape - Bit Blaster (EP) Link to heading OK, so here goes: an entire EP without a single track of audio that I recorded myself. What’s more, I didn’t even connect my MIDI keyboard! You can stream it on Spotify, Apple Music, YouTube and probably everywhere else music is streamed. What invention describes the confusing mix of analog and digital means of conveying both data and audio than the Turbo Tape?| Posts on cekrem.github.io
Update: After some heavy lifting at the old gym, I actually left Vipps and started on a Sabbatical. See Goodbye Vipps! for details (LinkedIn post). I’m also open for new opportunities. Timeline: From backend to Android -> Dev plan 2021-2023 -> Nailing it and getting promoted! -> Back to the old gym! -> Sabbatical! -> My next adventure?Link to heading It’s official! I’m transitioning back from my pilgrimage as an Android developer, going back to my backend roots. Ah, the glorious smell o...| Posts on cekrem.github.io
Abandon ship, all y’all Link to heading In part 1, I made a small POC cli tool for doing multiple things in parallel. Like curling multiple endpoints and collecting the responses in a neat and tidy list instead of opening several terminal tabs/panes. The goal was partly to explore how rendering actually works in a more confined environment than the DOM (web), or more complicated yet: native mobile apps. The other goal, as usual, was to have fun while doing it. My adventures in part 2 have, ...| Posts on cekrem.github.io
Where do UIs belong? Link to heading Most of us consider ReactJS a tool for rendering UI components on the web (or the DOM, specifically), and if by “React” we mean “ReactDOM” then we’re right. But as we’ve seen with React Native, React is not confined to the DOM at all, and can render to any number of environments. After all, like it says on the box, React is a “JavaScript library for building user interfaces”. We’ve seen the same with Compose Multiplatform: what used to be...| Posts on cekrem.github.io
Update: Here’s the next development plan, kind of. The Day Has Come. I’m officially archiving my previous development plan and moving on to new adventures in Vipps Mobile Pay! It’s been a long time coming, and I’m happy to say that I’ve achieved most of the goals I set out to achieve. I’ve learned a lot, and I’m ready to proceed towards the next chapter. I’m not, however, ready to make a new plan just yet. So consider this post ceremonial more than anything.| Posts on cekrem.github.io
Update: This plan is now archived. See The End of an Era for details. What follows is my own personal development plan as a software engineer at VippsVipps MobilePay. Some terms and expressions are a bit internal, as they will no doubt be for you as well on your own plan (should you find yourself inspired to write one), but I’ll leave it as is. Enjoy! --- Context Link to heading I’ve been at Vipps MobilePay since 2018, mostly doing work that now belongs in the “Merchant Core” team. I ...| Posts on cekrem.github.io
What’s a Light Phone, and why are there two of them? Link to heading The original Light Phone was a seriously dumb device. No texting, only phone calls. The company behind it never meant for it to be your only device, but a device to bring when you were “going light” – detaching yourself from all the digital clutter of your everyday (social media, feeds, notifications ++). It was a big a hit as one might expect, I guess, but quite a few people found the experience delightfully refresh...| Posts on cekrem.github.io
The best tool for note-taking? Link to heading The one you have close at hand. ReMarkable this, vintage inherited bio-dynamic paper that – it’ll do you no good what-so-ever if it’s not readily available when you need it. I’ve spent way too much time trying to find the “ideal” solution for keeping track of notes and ideas through my workday. But all I really need is this:| Posts on cekrem.github.io
So you’ve been at your company for a couple of years. Your parents tell you to stick around for another five, but other people in tech - and your adventurous self - tell you it’s about time to learn something new. What if you could do both? The most common path to take in order to learn something new, advance your career, increase your salary or simply Change Things Up A Bit involves leaving your company for something else. This is especially true in tech. (Sadly, the salary part is espec...| Posts on cekrem.github.io
A VMSS is, put as plainly as possible, a cluster of VMs that are scaled on-demand or manually. Context Link to heading The Vipps App – until recently – took about 45 minutes to build on A$ure Azure. With a weekly release schedule, that might not sound like a huge dealbreaker, but since we’re using a “feature branch” approach to how we do git (ie no develop branch; master should always be deployable-ish), we don’t allow merging anything to master without a successful cloud build. W...| Posts on cekrem.github.io
TL;DR: I made an advent calendar in React, my wife loved it Link to heading I grew up with a lot of creative advent calendars. The one type I didn’t get was the standard chocolate one that’s most common these days. While I’ve not consistently been very good at paying this forward, I do make an effort some years to do something a bit different for my wife. Yes, my wife; the kids get standard ones :P This year’s plan was simple: create an online calendar with cozy favors, encouragements...| Posts on cekrem.github.io
The problem Link to heading I’ve been tinkering a bit with Elm lately. The super-enforced functional and minimal paradigm is very refreshing, and serves as a sort of detox after spending one too many hour stuck in Android’s not-so-lovely XML + mutating class world. Setting up a new bare minimum Elm app should be quite simple, but it turns out that there are a few more steps required than one would expect. My first instinct – being a React guy – was to try yarn create elm-app (or npx c...| Posts on cekrem.github.io
Why 'reflexive AI usage' sounds like a diagnosis I don't want next to my name| cekrem.github.io