2,236 karma · joined March 7, 2015
https://www.reuters.com/legal/government/texas-becomes-first...
The bottom line is that any restriction or redefinition of civil rights is fraught with negative unintended consequences. It should be an option chosen with extreme care.
In applications with complex storage needs and/or performance-sensitive IO needs, I prefer to think about databases as an additional tier that provides complex storage services (as is precisely the case with most modern databases). As an example, I once worked on message routing and transformation server. From the perspective of the application logic, messages simply needed to be durably persisted and retrieved. At the level of the storage layer, I wanted message versioning, provenance, copy-on-write semantics to minimize on-disk size, and indexes to support at least two different retrieval patterns. All of the items at the storage layer were implemented in stored procedures. In other words, the database supplied a custom "storage API" to the business logic tier for persisting and retrieving messages that implemented those routines in a database-specific way that did not concern developers at the application layer.
The main arguments against this approach are:
* It will tie you to a specific database. This is true, but almost irrelevant since anything other than the most trivial usage of a database will inevitably make use of a feature or syntax specific to the database that would require modification were one to migrate to another database. Further, the mere idea of database independence is kinda' silly. No one talks about how writing your application layer in one particular programming language will limit the ability to migrate to another programming language. We should make technology choices around programming languages, databases, etc. with the intention of matching their strengths to the problem at hand fully understanding that tradeoffs are being made and that rework will be necessary if those choices are ever revisited.
* SQL used for writing stored procedures is not as good (for some definition of "good") as other programming languages used in the application layer. SQL is certainly different than most imperative or functional programming languages, but it's expressive and well-suited for its purpose. If you really need to make use of the capabilities of a database, it would behoove you to develop some proficiency in SQL.
* Putting logic in the database breaks modern CI/CD processes. IMO, this is the most compelling argument against it. That said, there is tooling that exists for putting stored procedure and other database logic in version control, automatically deploying it to a database, and running tests on it. These tools are not as commonly used, but they do exist. I've also used tooling that introspected the database objects such as stored procedures, etc., and automatically generated type-safe application code to interact with those database objects. That provided compile-time guarantees that application and database code were in sync at least with respect to number and types of arguments, etc. Whether it makes sense to go to the effort of integrating this tooling into your development process is a judgement call, but it can be done and I've seen it work well for application with demanding database needs.
* If you have pre-5.6.4 date/time columns in your table and perform any kind of ALTER TABLE statement on that table (even one that doesn't involve the date/time columns), it will TAKE A TABLE LOCK AND REWRITE YOUR ENTIRE TABLE to upgrade to the new date/time types. In other words, your carefully-crafted online DDL statement will become fully offline and blocking for the entirety of the operation. To add insult to injury, the full table upgrade was UNAVOIDABLE until 5.6.24 when an option (still defaulted to off!) was added to decline the automatic upgrade of date/time columns. If you couldn't upgrade to 5.6.24, you had two choices with any table with pre-5.6.4 types: make no DDL changes of any kind to it or accept downtime while the full table rewrite was performed. To be as fair as possible, this is documented in the MySQL docs, but it is mind-blowing to me that any database team would release this behavior into production. In other words, in what world is the upgrade of date/time types to add a bit more fractional precision so important that all online DDL operations on that table will be silently, automatically, and unavoidably converted to offline operations in order to perform the upgrade? To me, this is indicative of the same mindset that released MySQL for so many years with the unsafe and silent downgrading of data as the default mode of operation.
* Dropping a table takes a global lock that prevents the execution of ANY QUERY until the underlying files for the table are removed from the filesystem. Under many circumstances, this would go unnoticed, but I experienced a 7-minute production outage when I dropped a 700GB table that was no longer used. Apparently, this delay is due to the time it takes the underlying Linux filesystems to delete the large table file. This was an RDS instance, so I had no visibility into the filesystem used and it was probably exacerbated by the EBS backing for the RDS instance, but still, what database takes out a GLOBAL LOCK TO DROP A TABLE? After the incident, I googled for and found this description of the problem (https://www.percona.com/blog/2009/06/16/slow-drop-table/) which isn't well-documented. It's almost as if you have to anticipate every possible way in which MySQL could screw you and then google for it if you want to avoid production downtime.
There are others, too, but to this day, those two still raise my blood pressure when I think about them. In addition to MySQL, I've pushed SQL Server and PostgreSQL pretty hard in production environments and never encountered gotchas like that. Unlike MySQL, those teams appear to understand the priorities of people who run production databases and they make it very clear when there are big and potentially disrupting changes and they don't make those changes obligatory, automatic, and silent as MySQL did. IMO, MySQL has its place for very specific workloads, but if you don't have deep enough knowledge of DB engines and your workload to know that yours is one of those specific workloads, you should default to PostgreSQL.
Refrigerators are a completely different animal as are dishwashers, etc. Despite my great experiences with LG washers, I'd avoid LG refrigerators. I've had good experience with multiple Bosch and Miele dishwashers, but mediocre experiences on all the new fridges I've bought in the last 10 years.
During the same timeframe, many other companies have seen the same risk of AWS taking their open source products and providing competing managed offerings and have chosen various methods of protecting themselves from AWS competition. Many of them (including MongoDB, MariaDB, Confluent, CockroachDB, Sentry.io, Apollo, Graylog, Couchbase) have adopted licenses such as the SSPL, BSL, and even the Elastic license that prevent or strongly discourage AWS from using their products in a managed offering. Others such as Grafana Labs have partnered with AWS (under undisclosed terms) for a managed offering. It's an ongoing tension between companies that want to offer an open source product with a managed offering that monetizes it.
Early in my engineering career, I had the privilege of being personal friends with the older CEO of my company who was very much a business/corporate type but valued engineering as well though he was not an engineer himself. He was able to help me see through several product cycles that sales and marketing was, in many (or even most) cases, more pivotal to the success of a product than engineering. That's not to say that engineering does not matter -- it does, especially when it comes to scale and technical debt that affects release velocity, but the end customer in 99.9% of cases does not care about the engineering behind a product, only whether it solves their problem. The business and corporate meetings (when done properly-- there can be complete BS business/corporate stuff but that's a matter of incompetence) should focus efforts on delivering what customers need. Seeing that first-hand gave me a much greater appreciation for other disciplines within successful companies as well as some humility around the magnitude and importance of my contributions as an engineer. It takes all kinds and the talented business types who can proverbially sell ice to Eskimos are force multipliers akin to the mythical 10x engineer and worth their weight in gold.
It's risky, but not necessarily dodgy. Many employers do not even permit early exercise and I wish more did as I could have substantially reduced my tax burden in some situations. Taking loans for early exercise is risky, but ultimately, we're adults who are responsible for our own decisions. Certainly it would be bad if Bolt misled employees into thinking it was a risk-less proposition, but I've not heard anyone claiming that.
>>Bolt positions the "below $200,000" sum as a win. I don't see it that way. That's below the lower bound of the accredited investor income test. The people taking out these loans by legal definition couldn't afford the risk. Yet Bolt doubled down and gave them leverage?<<
If the aggregate loan amount to laid-off employees was $200k, that says nothing about whether they qualified as accredited investors. Further, the accredited investor designation is an arbitrary one. It's perfectly possible to not be an accredited investor and still be able to afford the risk of early option exercise.