Skip to main content
Ben Nadel
On User Experience (UX) Design, JavaScript, ColdFusion, Node.js, Life, and Love.

Recent Blog Posts by Ben Nadel

Experimenting With Try / Catch / Retry Semantics In Lucee CFML 5.3.7.47

The other day, when I was looking something up in the Lucee CFML documentation, I came across a page that outlined the CFRetry tag . This tag will jump the control flow back up to the CFTry ingress, re-running the volatile execution pathway. I'm not sure I've seen this tag before. And, I don't... read more »


Unifying Type Casting Exceptions For Cleaner Log Aggregation In Lucee CFML 5.3.7.47

At InVision , we use Loggly as our centralized log aggregation service. And, when I go to consume said logs, I am generally breaking them down by "Error Message". Most of the time, this is great. However, when a script kiddie starts barfing malicious data into my pages, it creates a ... read more »


Task Switching, Sensory Specific Satiety, And Staying Productive At Work

As a software engineer, one thing that I've never connected with is the idea that engineers only have "N" number of hours per day in which they can be productive. I believe this concept stems from a lack of strategy , not a lack of capacity . I am not going to argue that every hour of e... read more »


Working Code Podcast - Episode 017: Premature Optimization

This week, the crew talks about "premature optimization". As I explained it to my wife, this is when you "solve problems that you don't have yet" . But, what kind of problems are we talking about? Missing features? Missing methodologies? Missing performance characteristics? It ... read more »


Rethinking Error Type Schemas And Naming Conventions In My ColdFusion Application

Over the last few years, I've spent a lot of time thinking about error chaining , the difference between throwing errors and reporting errors , and a general set of DOs and DON'Ts for managing errors in an application . But, I've never put much thought into an error type schema or a naming con... read more »


A Peek Into The Interstitial Cost Of Microservices

As I've discussed recently, my team at InVision has been investing time in merging microservices back into our ColdFusion monolith . And, this week marks yet another successful subsumption of a Go microservice into our CFML juggernaut. What makes this example so interesting to me is that the t... read more »


Things I Regret: Returning Modified Data In API Response Payloads

When you work on the same web application for the better part of a decade, your architectural choices have plenty of time to learn you a lesson, showing you what works and what definitely does not work . And, one software architectural choice that has bitten me in the butt time and time again is t... read more »


Working Code Podcast - Episode 016: Interviews

This week, the crew sits down to talk about interviewing, both from the side of the interviewer and from the side of interviewee. What are we looking for? What are the red flags? What kinds of questions should we be asking? Are we putting too much faith in the sanctity of the interview process? And... read more »


The Safe Navigation Operator Checks Both Left And Right Operands In ColdFusion

Historically, I've always thought of the safe navigation operator - ?. - as checking the left operand in an expression before continuing to evaluate the right operand. However, by sheer accident, I stumbled upon the fact that the safe navigation operator appears to check both the left and ri... read more »


Consuming Sparse, Unpredictable "omitempty" Golang JSON Payloads Using Null Coalescing In Lucee CFML 5.3.7.48

At InVision , I'm working on yet another "remonolithification" project , this time merging a Go service into my ColdFusion monolith . As part of this subsumption, I have to write CFML code that consumes the JSON (JavaScript Object Notation) payload being returned from a different G... read more »


Working Code Podcast - Episode 015: Potluck

This week, we're trying something new: each host has brought with them a topic for the crew to discuss. Topics range from considerations about data-context; what does and does not make for a good manager; code that we're proud to have written; and, what it looks like when a team develops a strong... read more »


The ColdFusion Monolith Allows My Team To Move Fast And Deploy Hella Often

A few months ago, I wrote about how my team is actively merging microservices back into the monolith . Then, yesterday, I shared my opinionated guide to managing Pull Requests (PRs) for my team of 4 engineers at InVision . In that guide, I talked about how my team prioritizes code reviews, ... read more »


An Opinionated Guide To Handling Pull Requests (PRs) On My Team

On last week's Working Code podcast episode , I presented my strongly held beliefs about how Pull Requests (PRs) should be managed within a team setting. This is based on a decade of trial-and-error and an evolving understanding of git and GitHub that works well for me and my small team at ... read more »


Porting Lucee CFML's SystemOutput() Function Over To Adobe ColdFusion

In my previous post on dynamically extending a distributed lock in Redis , Paolo Olocco asked about some Lucee CFML / Adobe ColdFusion compatibility issues; one of which was how to implement the SystemOutput() function . At InVision , writing to the standard out and error streams is a very imp... read more »


Casting Between Dates And Numeric Dates In Lucee CFML 5.3.7.48

One of the curious features of ColdFusion is the fact that you can represent Date/Time values as numbers. These numbers reference the fractional days since the "ColdFusion Epoch", which is 12/30/1899 00:00:00 for "reasons" . I don't use these "numeric dates" very of... read more »


My Docker For Mac File IO Is 68-Times Slower Than It Is In Production

After pouring weeks of personal time in my ColdFusion custom tag DSL for HTML emails , I was a bit gutted when I went to apply the methodology in my local InVision code only to find out that it was running very slowly inside of my Docker for Mac container . It turns out, when using the <... read more »


Working Code Podcast - Episode 014: Zen And The Art Of Pull Requests

I have "feelings" about many aspects of web application development. And, after working with git and GitHub for the last 10-years, I've formed a lot of strong opinions - oftentimes strongly held - about how Pull Requests (PRs) should be created and managed within a team context.... read more »


Considering Two-Step ColdFusion Custom Tags That Generate CFML Code In Lucee CFML 5.3.7.48

After realizing that Lucee performs a file-check on every invocation of a <cfimport> tag - which has terrible performance in a containerized context - I started to think about ways to improve the performance of my ColdFusion custom tag DSL for HTML emails . I kept racking my brain, a... read more »


GetBaseTagList() Behavior With Different ColdFusion Custom Tag Invocations And Engines

After realizing that the CFImport tag has serious performance implications in Lucee CFML , I've been racking my brain trying to come up with optimizations that I might apply to my ColdFusion custom tag DSL for HTML emails . One of the options I was considering is changing the way the custom tag... read more »


Extending A Distributed Lock TTL Using CFThread, Redis, And Lucee CFML 5.3.7.47

The other day, after posting about the idea of dynamically extending a distributed lock timeout in Lucee CFML , Jan Sedivy - our lead engineer on the Freehand whiteboarding product at InVision - mentioned that he does something similar in Golang; only, instead of having the synchronized task... read more »


Dynamically Extending A Long-Lived Distributed Locks With Redis In Lucee CFML 5.3.7.47

At InVision , we use Redis to implement our distributed locks - that is, locks that need to be honored across a number of horizontally-scaled ColdFusion pods. In the vast majority of cases, these locks are short-lived and could likely be removed if we had better practices around idempotent operat... read more »


Every Customer-Facing Call Should Have An Engineer On It

My team at InVision is decisively customer-focused. I've even advocated that my team be rolled into the "Support Organization" such that we could become the engineering arm of the Customer-Facing Team (CFT). And while this move will likely never take place, I think it helps illustrate t... read more »


Working Code Podcast - Episode 013: Do What You Love And You'll Never Work A Day In Your Life

A friend of mine once said, "If you hate your job, you'll spend 5-7ths of your life waiting for the weekend." This is a dark way to think about existence. And, to address the flip-side of that coin, Mingo Hagen suggested that we talk about the phrase, "Do what you love and you'l... read more »


Using ColdFusion Custom Tags To Create An HTML Email DSL In Lucee CFML 5.3.7.47, Part XIII

As I've been continuing to flesh-out my ColdFusion custom tag DSL (Domain Specific Language) for HTML emails , I've come to realize that dealing with custom web fonts and font-weights is a pretty big challenge. Specifically because we can't be sure that our custom web font has loaded; and, a n... read more »


Case Study: Removing Massive IN (ID-List) Clauses For Performance In MySQL 5.7.32 And Lucee CFML 5.3.7.47

Last week, I shared some emergency ColdFusion code that I had written and deployed that would allow me to view the processlist and kill slow queries in MySQL in one of InVision 's read-replicas on Amazon RDS. After we upgraded to MySQL 5.7.32, a few of our oldest SQL queries started to perfo... read more »


Using ColdFusion Custom Tags To Create An HTML Email DSL In Lucee CFML 5.3.7.47, Part XII

Last week was InVision's "Sync Week" - our annual all-company meetup and hackathon. And, for my hackathon topic, I decided to try and apply my ColdFusion custom tag DSL (Domain Specific Language) for HTML emails to our application's transactional emails. It's still in the proof-of-con... read more »


Killing Slow MySQL Queries In An Emergency In Lucee CFML 5.3.7.47

At InVision , we recently upgraded our MySQL database servers to use MySQL 5.7.x. And, while I'm excited for access to new features like the native JSON column type and the sys performance schema , the upgrade did have some bumps. In particular, we had a subset of SQL queries that started r... read more »


Working Code Podcast - Episode 012: Idiomatic Code

Many programming languages have a sense of idiomatic code : the "blessed way" to solve a particular set of problems with a language's native constructs. These patterns exist to help people work more effectively together; and, to help new developers adapt to the language. But, unfortunate... read more »


Converting My Loggly Search Bookmarklets Into An Unpacked Chrome Extension

Four years ago, I created a Loggly Bookmarklet that would augment the Loggly Search page formatting to look and feel more like Kibana (which, in my opinion, has more accessible contrast and whitespace usage). Then, two years ago, I added a link between the Loggly JSON modal and my JSON explorer ... read more »


Custom CFParam Tag That Exposes Error Information In Lucee CFML 5.3.7.48

Over on the Lucee CFML developer forum, there was a discussion about accessing cfparam error information in the event that a type-casting error occurs. Currently, you would have to do some fancy string-parsing to get this data out of the given error object. Since I've been heads-down in ColdFu... read more »