After building quite a few subwoofers and 2-way speakers over the years, I was looking for something different, and line arrays fit the bill nicely. They use a large number of small-diameter drivers –sometimes as many as hundreds– and have some intriguing characteristics such as little loss of volume as you get further away, low distortion, and very slim enclosures…| Lack of Imagination
Loops are so common in programming that we often don’t give them a second thought, but a buggy loop has potentially infinite destructive power as it mindlessly repeats its task however many times it’s asked. Back in the good or bad old days, depending on your perspective, the for loop with its manual index management was often the only game in town, with the occasional while loop thrown in for good measure. It was our responsibility to make sure those loops actually terminated by using ex...| Lack of Imagination
SQL is great! It can handle complex queries involving multiple tables, aggregations, subqueries, and joins. It can perform CRUD (Create, Read, Update, Delete) operations. It enforces data integrity through constraints like primary and foreign keys. It supports transactions, allowing multiple operations to be executed as a single unit, which can be rolled back if one of the operations fails. Despite all its strengths, which are too many to list here, SQL can be awkward to integrate with host l...| Lack of Imagination
Think back to the last time you looked at an unfamiliar block of code. Did you immediately understand what it was doing? If not, you’re not alone – many software developers, including myself, find it challenging to grasp unfamiliar code quickly. Let’s take a look at a simple JavaScript function that creates a user account: asyncfunctioncreateUser(user) { if (!validateUserInput(user)) { thrownew Error('u105'); } construles= [/[a-z]{1,}/, /[A-Z]{1,}/, /[0-9]{1,}/, /\W{1,}/]; if (user.pass...| Lack of Imagination
Many years ago, I took part in the development of a taxi-hailing mobile app that is still widely used today. I don’t know what kind of code they’re running now, but in those early days, the driver assignment code –if I remember it correctly– was similar in spirit to the grossly simplified example shown below: asyncfunctionassignDriver(rider, availableDrivers) { constdriverDistances=awaitcalculateDistances(rider.location, availableDrivers); letassignedDriver=null; for (letdriverofavail...| Lack of Imagination
When writing code, you can call any function as long as it’s public, and similarly, you can access any object’s public properties or methods. Usually, access to code is all or none – a piece of code can be either public or private. Access to private code is typically controlled by the upper layer that encapsulates it. Although some languages support semi-private (also known as protected) object members, that’s a merely variation on the public/private theme. Lately, I’ve been thinkin...| Lack of Imagination
Richard Feynman, the Nobel Prize-winning physicist, developed an interest in biology while he was a graduate student at Princeton. He started attending a course in cell physiology, which required him to report on papers assigned to him. One such paper was about measuring the voltages generated by the nerves in cats: I began to read the paper. It kept talking about extensors and flexors, the gastrocnemius muscle, and so on. This and that muscle were named, but I hadn’t the foggiest idea of w...| Lack of Imagination
I will never forget the time I discovered how web pages were made. The year was 1995. I was using Windows 3.1 like most everyone, and it didn’t even support the TCP/IP network stack out of the box. I had to install a program called Trumpet Winsock and a hot new web browser called Netscape to connect to the Internet. Netscape Navigator 1.2 on Windows 3.1 - Source: Wikipedia In Netscape, there was an option called “Source…” under the View menu, and when I clicked it, I was half expectin...| Lack of Imagination
I was looking to buy speaker stands for my KEF LS50 Metas and the DIY KEF LS50 Clone I use as my center channel speaker. KEF’s matching extruded aluminum S2 stands were a natural choice. Unfortunately, they were quite expensive, and I’m not really a fan of single column stands anyway, so I decided to build a few dual column stands myself. I picked 8 mm MDF for the sides of the columns, 12 mm MDF for the top plate, and 18 mm MDF for the bottom plate. The columns will be hollow, so they can...| Lack of Imagination
It’s often said that reading code is harder than writing it, but is it really? If that were the case for books, everyone would be writing their own rather than reading the books others wrote. But, a page of code isn’t equivalent to a page of text. Code, by nature, is denser. To effectively explain what a page of code does may easily take several pages, and in some cases a lot more. Is it possible to make code easier to read than to write? After all, code is read more often than it is writ...| Lack of Imagination
What happens when a function call fails? Can you retry without causing any unintended side effects? If the answer is no, then your function is probably not robust enough. Here is a scenario that is very likely happening to someone somewhere right at this moment. Let’s call this person Midori. Midori has been eyeing a pair of headphones, fancy noise cancelling ones, no less, and as soon as there’s a sale on them, she adds the phones to her shopping cart, and with a touch of excitement, cli...| Lack of Imagination
“Only the paranoid survive.” – Andy Grove No software developer in their right mind would trust user inputs in an application. All user inputs need to be validated and sanitized, otherwise nasty security vulnerabilities like SQL injection and Cross-Site Scripting (XSS) attacks might happen. Once user inputs pass validation and start to go through internal layers of code, many developers assume that there isn’t much need to validate inputs anymore, but validation isn’t just about sec...| Lack of Imagination
B2B (Business-to-Business) software is different from B2C (Business-to-Consumer) software for several reasons, but the most important one is this: In B2B, each customer isn’t an individual but a company with its own unique needs and workflows. If your software isn’t compatible with the way a company operates and there are no convenient workarounds, you risk losing their business, which brings me to the first important aspect of B2B software… Customizations In the B2B software world, you...| Lack of Imagination
There are a lot of things to consider before starting to write code: Which software libraries to choose? Use SQL or NoSQL? What would the database schema look like? Would we need a caching system to handle heavy traffic? How should the code be structured? And so on… These questions are certainly important, but we live in an era of fast-changing and often ill defined user requirements. The conventional software development model of plan > code > test can more often than not fail to produce s...| Lack of Imagination
All Software have Bugs It’s inevitable. You fix some, New ones appear. You fix some more, Old ones come back from the dead Unless your tests catch them first. Do you even have time for tests When the feature backlog is a mile long, And time to market is everything. There is this satisfying feeling though When you have the scalpel in your hand, Removing features left and right, Cutting corners no one would notice, Or so you hope. But it must be done, You can always fix things later. This is ...| Lack of Imagination
I don’t like to exercise. I mostly think of it as a distraction, but what bothers me the most is the amount of time spent for exercise could have been dedicated to other, you know, more fun activities. We all need to exercise regularly to stay in shape and be healthy. I don’t think anyone would disagree with that, but if exercise takes too much time, I know I wouldn’t do it. So, I needed a compromise. I needed to find an exercise that would take minimal time, and yet still be as effecti...| Lack of Imagination
I still remember a quote from a computer magazine I read when I was 12. In an article comparing the programming languages of the time, a C developer described the Pascal programming language as “having a mother hen hovering over you, watching your every move, making sure you don’t screw up.” I didn’t fully understand it at the time, but he was most likely referring to the strong type checking in Pascal, which could lead to compiler and runtime errors. If you mixed and matched types in...| Lack of Imagination
I write because I want to share what I know with others. Yet the software developer in me makes writing hard for me. See, in coding the internal structure needs to be consistent. The code we write is like a house of cards. If we make even one tiny mistake, the whole thing may come falling down. So, when I write, I try to be consistent, which is not a bad thing in itself of course, but the desire for consistency makes writing a lot more difficult for me than it should be. Haruki Murakami once ...| Lack of Imagination
Imagination is more important than knowledge. For knowledge is limited to all we now know and understand, while imagination embraces the entire world, and all there ever will be to know and understand." - Albert Einstein| Lack of Imagination
You’ve probably seen programmers calmly writing code at 200 keystrokes per minute to solve hideously complex problems under strict deadlines, and the programs they wrote run perfectly on the first try, often only a few seconds before something blows up real good…| Lack of Imagination
I’ve been building subwoofers for years now, and I’ve always used car audio drivers. However, I recently started building speakers using pro-audio drivers, specifically mid-woofers and horn loaded compression drivers. I love how dynamic and clean-sounding these drivers are, so it was only natural that I decided to give pro-audio subwoofers a try…| Lack of Imagination
While David Lynch offered very little in terms of what his movies meant, he was generous in sharing his views on creativity, work, and life in general. As a tribute to Lynch, I’d like to share my perspective on his life lessons from a software developer’s viewpoint…| Lack of Imagination
A popular trope in science fiction movies set in space is running diagnostics whenever something goes wrong with a ship’s systems. The chief engineer might announce something like, “We’ve run a level 2 diagnostic on the thermal regulators…| Lack of Imagination
I previously built Valeria, a compact bookshelf speaker using pro-audio drivers. The dynamics offered by this small speaker are impressive, if I may say so myself. Lately, I’ve been thinking of building speakers with better bass response and improved horizontal and especially vertical directivity. This necessitated using an 8" mid-bass driver, a compression driver that rolls off below 1 kHz, and a horn that can control directivity better than the B&C ME10 I used in Valeria…| Lack of Imagination
I’ve been using a pair of KEF LS50 Metas as my front speakers and my DIY KEF LS50 clone as the center channel speaker in my home theater for a while now. I’ve been generally happy with the smooth sound they produce, but there’s one thing lacking: dynamics. Lately, I’ve been thinking about building high-sensitivity speakers using pro-audio drivers. Horn-loaded compression drivers, which are used to reproduce high frequencies, can get really loud with little distortion…| Lack of Imagination
In a relational database, foreign keys are normally used to associate records stored in different tables, but wouldn’t it be nice to define relationships dynamically without having to add extra columns or tables? And while we’re at it, how about having sparse relationships by associating a record directly with any other record like “post X was last edited by user #123” or “post X was flagged for review by user #456” (who happens to be a moderator)?| Lack of Imagination
The great majority of the software architectures currently in use are variations of the layered architecture, and what really sets them apart is the implementation details. Some might find this statement controversial, but in my experience, most software applications rely on code organized in layers to manage complexity. Some of the layers may utilize message queues or microservices, but that doesn’t necessarily make the architecture event or microservices based…| Lack of Imagination
Over the past two decades, I’ve worked as a software developer, tech lead, and CTO at various startups, including my own. I’ve accumulated a number of principles I use to make major technical decisions. Most of the principles outlined here were learned the hard way. You might not fully agree with all of the principles, but I hope at least some of them could help those who struggle with tough technical decisions…| Lack of Imagination
Software development would be a lot easier without so many bugs. In a typical software application, there’s a never-ending stream of bugs as far as the eye can see. Some of the bugs make users’ lives miserable, some of them are annoying but can be dealt with workarounds, and the rest are mostly minor inconveniences…| Lack of Imagination
When you work with software developers, especially those with less experience, it’s virtually guaranteed to hear one of them utter a version of the above expression when someone presents them with a situation they think is impossible (or more likely, improbable) to happen in the program they’ve written…| Lack of Imagination
Over the years I’ve seen all sorts of SQL mistakes made by developers on my teams, and I’ve made quite a few of them myself. I’d like to share what I’ve learned with you, starting with security first…| Lack of Imagination
Since you can buy two to three pairs of KEF Q150 for the price of one pair of LS50 Meta depending on whether there’s a sale or not, I decided to build an LS50 clone using a Q150 driver to see if they would sound similar after equalization. The clone wouldn’t have the beautiful curved front baffle and better crossover of LS50 Meta, but it would otherwise be very similar in construction….| Lack of Imagination
When Design Patterns first got published, the year was 1994, a rather primitive time when functional programming languages that support first class functions were rarely used outside academia. These days, though, we have mainstream languages such as JavaScript and Python that can be used to trivially implement many of the design patterns described in the book with only a few lines of code…| Lack of Imagination
There are many ways to write automated tests for testing code, and you may have heard about test doubles for making testing easier. Some of the code we write is hard to test, so we replace those parts with fake test doubles that are easier to test…| Lack of Imagination
If you are a cash-strapped startup, you can usually get away with a team of just one or two developers and hope for the best. There’s absolutely nothing wrong with that. But if you have the funds to add new members to your team, don’t just go with more developers. Developers aren’t generally very good at designing products people want to use – they are good at implementing well-specced features…| Lack of Imagination
I use pro audio power amps in my home theater. They provide tons of power for little money. There is one major downside though. Most models feature noisy fans, and for a good reason – pro audio power amps are often run at their limits, and many manufacturers prefer to err on the side of caution. For home use though, you can usually get away with replacing the built-in fans with quieter ones…| Lack of Imagination
A few months ago, I bought an entry-level CNC router from a local supplier, knowing full well that I would probably need to modify it extensively. The price of the machine was right, and in case I decide to build a better one on my own, this machine would be a good starting point to learn how all the parts are connected together…| Lack of Imagination
For the casual, not so casual, and advanced users who would like to integrate subwoofers to their music or home theater systems…| Lack of Imagination
First a little context: At Faradai we had been using PostgreSQL on the ext4 file system for a number of years until it recently became evident that the constantly growing database size (over 5 TB at the time) would start to cause issues in general performance, cloud costs, and the ability to have reliable backups. We reviewed a number of alternative file systems, and chose ZFS mainly for its following three features…| Lack of Imagination
Vendor lock-in: An unfortunate condition that forces a person or company to continue using a disliked product or service just because they invested in it so much. Vendor lock-in used to affect mostly large companies using mission critical legacy applications, but as more and more companies move to the cloud, cloud providers started to rediscover the joys of vendor lock-in by offering “value-added” services that simplify the lives of software developers who have better things in life than ...| Lack of Imagination
Recently, I had a conversation with a junior developer on my team. Let’s call him Alan. We were talking about a new notification feature that was going to be used to send reminder e-mails to potentially thousands of people if they had forgotten to enter certain data in the last month or so. Alan was confident that the code he’d written was correct. “I’ve tested it well.”, he said…| Lack of Imagination
Linux comes with all the basic tools necessary to deploy an application to development and production environments, and to roll back to any past version if something goes wrong. It takes just a few commands to set everything up…| Lack of Imagination
In the beginning, there was only HTML. The first official HTML specification focused on semantic markup. There were minimal styling tags and attributes. It was up to the web browser how to render the markup in an HTML document. The whole specification was refreshingly simple. You could easily read it in one sitting…| Lack of Imagination
I started programming in GW-BASIC on an IBM PC clone running MS-DOS. Back then, many so-called home and business computers came bundled with a BASIC interpreter, mostly made by or licensed from Microsoft. They all looked similar. You were greeted by a screen with a READY or OK prompt and a blinking cursor waiting for your input. The “screen editor” and interpreter were all in one in the true sense of the word – they weren’t bolted together like the separate text editors and interprete...| Lack of Imagination