Ryan Peters A dev blog

Big, Big Changes

It’s December already? Wow, how time flies, and wow, how few updates I’ve made about TinyDB over the past month. There have been a lot of changes, mostly internal-facing, but I do have quite a few things going on behind-the-scenes as well that I’m working on. Here’s the most substantial changes you can expect as we go into this new year:

1. The App Formerly Known As TinyDB

Oh, well, this one is kind of embarassing. When I came up with the name for this app, and when I bought the domain name for said app, I swear, I did my research, but somehow a project with the name TinyDB already exists. I know, I know, it’s easy to say “you should have googled it” and I could have sworn I did, but I must have not noticed it through some horrible mistake. I have absolutely no association with this project, so I will be retiring the name of “TinyDB” for my own similar project.

What is the new name? Well…

That’s a surprise. I’ve already bought the domain name, and I’m trying to work on a visual style to suit it, but the domain name I bought will redirect to the new one for some time to be sure that anyone finding it through my ScalaCon presentation or any of my earlier tweets will wind up at the right place.

Oh, and speaking of…

2. The TinyDB website is temporarily down

EDIT: This has been fixed as of 2023-12-23. I think. Please let me know if it still doesn’t work for you. You might need to use the www subdomain.

Original section below:


I don’t know if you’ve noticed but if you try to go to http://tinydb.app/ right now, it just straight-up won’t load. I think it’s DNS-related as I was trying to get something set up with web hosting a while back, but it seems to have totally borked the main site.

Fortunately, if you are one of the lucky few with private closed beta access, that link should still work for now. So I’ve got that going I guess.

I will have a new homepage up once I am ready to show off the latest version of the app, with its new name.

Though, it wouldn’t be particularly accurate to call this just an “app” anymore, because…

3. Going Modular

As I’ve been working on this app I keep coming up with so many new ideas and it’s hard to stay focused on the core feature set. In light of this I have been taking a few steps back and reevaluating what exactly I want this project to be, and I’ve come up with a resolution: this should be a platform, a framework, a collection of tools and libraries and solution-building utilities, rather than just “an app”.

In practice, this means that there will still be an app, but the way features will, and can be, developed, will have to change. I am currently working on porting a lot of the existing featureset into a kind of “plug-in” system. I want it to be possible for you to write your own features for your own running instance of it. That means you should be able to use different components, author your own UIs and forms, add entire buttons and custom code and who knows what else, without needing to rebuild the app from scratch. The basic idea is that you should not only own your own data, but the way that you perceive it, the way you develop for it and use it, should also be totally portable. You should be able to load community-developed features into the app on your own terms, modifying the app to work how you see fit.

I’d like to start with a Scala-based integration and work towards enabling a full JavaScript API that you can write for that exposes runtime hooks as well as common building blocks for writing your own integrations.

Another use-case would be to reuse components of the app in completely different contexts. How cool would it be if, say, a browser add-on for scraping text from a webpage could output a fully-configured database file compatible with the app? Or, what if you wanted to write an integration for importing things from a specific JSON-based HTTP API into database tables, making custom transformations and modifications along the way? All of this should be as easy as possible without needing to go fully custom.

Be on the lookout for news about this in the future as it is a direction I am very excited about enabling.

4. Sneak Preview of Visual Updates

Not too much to show here, but I spent some time recently cleaning up the incredibly ugly UI for the app and have come up with this:

New DB Look

Some of the changes:

  • There is a “Table Toolbar” below the top bar that only appears when you’ve created at least one table. You can select a table or chart, and buttons relevant to that table appear on the bar.
  • The top bar has been shrunk somewhat as a result and is a much more concise UI.
  • The table buttons actually kind-of look tabular now.
  • The sizing and shape of buttons has been adjusted
  • Tables now appear in a little “floating” box

That last change is part of a bit of experimentation I’m doing into possible alternate table views. For example, viewing more than one table at once in their own sections. This would be very useful for me so you know I’ll eventually work on it, but for now, it just looks pretty nice to have some shadow in there.

Anyway, that’s all for now, and stay tuned! An update containing these visual changes and more will be pushed to the closed beta page soon for those of you with access. Afterward, in 2024, we’ll finally start to see some of the fruits of my labor and I hope you all will be very surprised and excited!

TinyDB Closed Beta Announcement & Guide

Happy Halloween, everybody! I have been a little behind on TinyDB, but never fear because I have completed an early preview build with some key improvements.

TinyDB, as described previously, is an in-browser database application I’ve been working on in between trying to stay on top of the latest video games. I had promised my early supporters that I would start early closed beta access some time in October, and to help reach that deadline I took a few days off to blitz to the finish line and reach an appropriate milestone.

If you are subscribed to my newsletter for TinyDB, you should have received an invite-only private link for trying TinyDB out as part of this closed beta. At this link, you will be able to use a feature-limited version of the app that is similar to what was demoed at Scala Days Seattle 2023, with some changes and improvements.

How To Use TinyDB (Closed Beta)

To use this version of TinyDB, there are two main “bars” at the top of your screen. If you are on a mobile device, the first bar will collapse into a hamburger menu and is accessible with a button at the top-right of your screen.

To get started, enter a name for a database in the text field and press the “+” button to create a new table. In addition, you may create a table as the result of a query, or through importing a CSV. When importing a CSV, the first line will be treated as column header names.

If you encounter any difficulties, confusion, etc. please do not hesitate to email me directly. If you are part of the closed beta, you can respond to my invite email or if you know me personally I will more than happily be receptive to feedback.

The nav bar has the following items:

  • Import DB button, to load your saved DB JSON file
  • New Table Name text box, for quick access to adding a table
  • +, Query, and CSV buttons for adding a new table either as a new blank table, from a query, or from a CSV import
  • Enums, to edit your set of custom enumerations
  • A table select drop-down menu
  • Export buttons

To quickly create a table, type a name into the text box and press +. You can also import from a CSV or by querying your existing tables by pressing the buttons marked for query or CSV.

Switch between multiple tables by using the “selected table” drop-down menu. When selecting a table, a secondary bar will appear under it with a way to easily rename the current table, turn it into a chart, or delete it.

To get started with a blank table, add new rows and columns with the “New Row” button at the bottom and the “+” button at the top-right of the edit area. The blue buttons at the top of each column allow you to edit the name and type of the column. The white buttons below will allow you to edit the values of that cel as text. Clicking a “basic” type column cel will pop up a text box, whereas an “enum” type cel will show a drop-down menu of valid values.

To use enum columns, click the “Enum” button at the top of the navbar. You can create a named enumeration here and add/delete values. Then, you can edit a column for a table to set it as an enum, choose your newly created enum, and limit yourself to a known-good set of values.

In the future there will be a way to extract an enum from an existing column, so be on the lookout for that!

Query Syntax

When constructing a query, certain operations are supported out of the box for this beta version, with more to come. Queries are constructed by selecting certain parameters similar to a SQL query:

  • FROM - The source table for this query
  • JOIN - Another table that you would like to combine with the first table (optional)
  • AGGREGATE - Zero or more “aggregate expressions” that can be used to group your results along certain axes
  • SELECT - The columns you would like to keep from the resulting table
  • WHERE - An expression to filter rows from the query

When you select a table with FROM and JOIN, you have the option to specify an alias. This can help when referring to the tables by name later, which can be error-prone if your names are not short.

The set of columns you are allowed to refer to is listed below dynamically as you select tables for FROM and JOIN. For example, a table MyTable with a column Col1 will allow you to refer to MyTable.Col1, or if you specify the alias A for MyTable, that becomes A.Col1

Aggregation operations available are as follows:

  • COUNT <col> - Count the number of times a column is not null
  • COUNT * - Count the number of rows
  • SUM - Sum the numerical values in this column
  • MIN - Find the minimum value in this column
  • MAX - Find the maximum value in this column
  • MEAN - Find the average (mean) value in this column
  • MEDIAN - Find the average (middle-most) value in this column
  • MODE - Find the average (most common) value in this column

Aggregation syntax uses parenteses, so a valid aggregation expression might look like this:

MIN(A.Col1)

SELECT and WHERE statements work a little differently and have special syntax. Unlike aggregations above, you will want to refer to multiple columns in SELECT or WHERE statements so you will use the $ character to prefix column names. For example, the column Col1 on a table aliased A can be referred to as $A.Col1 or $"A.Col1", where quotes are used to help escape column names that use spaces or dollar signs.

A valid SELECT statement might be as follows:

$NumberCol - 4

The result of the expression will be all of the values of the column NumberCol, minus four.

The following operators are available for expressions:

  • + - The ADDITION operator
  • - - The SUBTRACTION operator
  • * - The MULTIPLICATION operator
  • / - The DIVISION operator
  • # - The STRING LENGTH operator
  • ! - The NOT operator
  • && - The AND boolean operator
  • || - The OR boolean operator
  • > - The GREATER THAN numerical operator
  • >= - The GREATER THAN OR EQUAL TO numerical operator
  • < - The LESS THAN numerical operator
  • <= - The LESS THAN OR EQUAL TO numerical operator
  • ? - The COALESCE operator (if the left-side value is null, replace it with the right-side value)

All of these expressions are usable in SELECT and WHERE statements alike. So for example, you might want to select a column multiplied by four:

$NumCol * 4

Set an alias for it as NewNumCol to differentiate it from the original. And then you might want to filter by which ones are greater than 36:

$NewNumCol > 36

Loading, Saving, and Exporting

You can save your entire database to a JSON document with the Database JSON button under the Export section of the navbar. You can later re-import it using the Import DB button on the left side near the application name. Note that this method does not save charts at this time. It will only save tables, including tables created from queries and CSV imports.

You may also export a table as a CSV by clicking the Table CSV button when on a valid table tab.

Keyboard Shortcuts and Navigation

When editing a table, you can click the “+” button in the top-right of the editor section to add a new column, and as you are typing you may press “enter” or “tab” to move down and to the right, respectively. The “shift” modifier key will go the opposite direction, much like you are editing cels in a spreadsheet program.

TinyDB September 2023 Update

As we are nearing the end of Summer 2023, some of you might have been hoping for some news about TinyDB, a ScalaJS-based relational database in your web browser with spreadsheet-like usability. There is not too much to talk about today, but to give you an idea of what to expect I am hoping to clarify some scheduling updates as time has marched on.

Where is TinyDB?

Worry not; TinyDB is still coming, and you will all be able to use it later this year. Originally I had expected TinyDB to be available in a limited beta format by this time, but there have been some delays due to various factors. Nothing complicated with the code, actually, but it would be more accurate to say that I simply have not had the time to work on the project as much as I would like. The past several months at my day job have been quite hectic and things show little sign of slowing down, so at the end of each work day doing even more coding staring at my computer screen is often the last thing I want to do. So for most of the past few months I have been taking some mental health time, spending some quality time with my four beautiful pets (two of which are Australian Shepherd dogs, known for their impossibly high energy levels and demanding personalities). Besides this, I’m sure you can sympathize with how the latest and greatest video games have been coming out on a near weekly basis this summer and also eating up what little free time I have on the weekends as well. Baldur’s Gate 3 and Starfield will eventually come for us all.

So, recognizing this, I am going to start ensuring that I at least have something to show for the project moving forward up to twice a month. Starting in October you will see an update on everything I have been able to accomplish during the month of September, and there might be a second update as well later in the month as more developments and plans are made.

TinyDB Roadmap

So you might be wondering, what should you expect from these updates? What features have yet to be developed, and what milestones are there right now? I have put together this loose outline of the features I will be working on, and approximate levels of priority for when I hope to get done with them.

  • File Format Specification - September 2023
  • Early Mobile UI Support - September/October 2023
  • Early Beta Access - October 2023
  • Additional chart types - 2023
  • Grid Layout Mode - 2023
  • Cloud Storage Support - Late 2023 / Early 2024
  • Public Beta Access - Early / Mid 2024
  • Triggers - 2024
  • More Functions & Custom Hooks - 2024
  • Funding & Sustainability Plans - 2024?

As you can see, most of these features I’ll try to implement some time this year, and the early Beta access will actually start before almost all of these features and more will be implemented. This early version will be mostly equivalent to the version developed for ScalaDays Seattle 2023, to start, with some minor enhancements to make sure it works at a basic, feature-complete level for normal database tasks. You will have tables, some basic functions and queries, JOINs, very basic chart support, basic mobile UI, and the ability to save your database to a standard file format. In fact, the file format right now is basically a dump of the memory contents, which is not optimal for file size or future feature support. Getting that file format standardized is currently my highest priority and the main blocker for getting a version of this app available for people to use.

What about that donation?

Oh, yes, of course. I have not forgotten about my pledge to donate on behalf of any and all early supporters who have subscribed to the TinyDB email list with a special secret code. A few of you were a little colorful with your choice of code and not everyone inputted the code exactly the same, but rounding out the list and fudging the numbers a bit to account for those inexact codes, it looks like we have a total of fifteen pledges, meaning I have donated $150 to The Trevor Project.

TinyDB Trevor Project Donation

Thanks to your interest in my project this money can go towards helping prevent LGBT+ suicide, in a time when so much uncertainty, bigotry and hatred out there for people who want to peacefully be themselves. I and the TinyDB project are happy to put our money where our mouth is and be a proud supporter of LGBT+ lives whenever possible.

How can I hear more?

Go to TinyDB.app today and enter your email address into the form to get early beta access within the next month (or two, if there’s another delay). You will also get email notifications every time there is a feature or development update. You are free to unsubscribe at any time.

Thank you everyone for your understanding and support. I look forward to getting TinyDB into your hands very soon!

Introducing TinyDB

TinyDB is an application I have been developing in various forms for a long time now, that I am finally able to start showing off and announcing plans for public availability. This month at Scala Days Seattle 2023 I was pleased to be able to demo the application and present about how the development using Scala.js was going along. Due to the focus of the talk being primarily about the tech used, and how useful it has been to me, I would like to take some time to actually kick-start the marketing hype cycle for this small project and let it be further known.

What is TinyDB?

TinyDB is a browser-based database application that is as easy to use as a spreadsheet. You do not need to worry about preconfiguring data schemas or types to get started, so you can use it as a basic, text-based data entry program without any configuration. With TinyDB, I hope to allow you to opt into the level of control that you need over your data, while doing so in a way that is portable and easy-to-use from any device, whether it’s your desktop computer, laptop, tablet, phone, or any other device with a modern web browser.

Some (super unfinished) images

To give you a quick idea of what this thing will be capable of at a glance, I’ve taken some development screenshots. Unfortunately I have not put a lot of effort into the CSS, so it’s a bit ugly right now but I will produce more videos and blog entries as this gets developed.

Table Display

Table display Each table is a grid of buttons that, when clicked, lets you edit its contents much like a spreadsheet cell. You can edit column information by clicking the column, including the type of column, custom formatting, allowed data values, title, and so on.

Custom Enumerations

Custom enumeration form You can set columns to use custom enumerations of values, which let you ensure that invalid values are impossible. This example shows configuring an enumeration type for video game platforms, i.e. PlayStation and PC.

Queries

Query window This is a very-in-progress dialog window for constructing a query. You are able to select a host table in the FROM section, JOIN it to another table, aggregate, group by columns (UI not implemented yet), select values based on a custom expression language, and filter your queries just like you would using SQL.

Charts

Pie chart This is an example chart showing the ability to turn any table you generate into a visualization. You are able to select which columns represent which axes or data inputs. For this example, I have a pie chart showing the number of copies I own of three video games.

What can TinyDB do?

TinyDB can do all of the typical tasks you would associate with either a spreadsheet or a database. For those familiar with relational SQL databases, this includes:

  • Queries with a basic expression language
  • Aggregations & grouping
  • Table joins

This will also support a number of features designed to make it easy to control your data, including:

  • Custom formatting options for columns
  • Enumeration support (fixed sets of “valid values” you select in a drop-down box, i.e. “days of the week”)
  • CSV data import
  • Custom column rules

Visually, TinyDB resembles a spreadsheet, so you should be able to do things that a spreadsheet will let you do. While it is not as freeform as, say, Excel, TinyDB will support reactive programming much the same way as a spreadsheet, by enabling you to compute the values of both columns and entire tables through reactive queries. This will allow you to have tables where, say, column “D” is the sum of the values in columns “A” + “B” + “C”. It will also allow you to aggregate and produce results from tables that frequently change. For example, lets say you have a table with all of your monthly expenses in it. You can have a “reactive query” that represents an aggregation of that table, and every time you add a new expense it will sum it up into the total for you to see.

TinyDB will also support various kinds of charts with customization options for the kind of chart, how you source its data, and how it should be displayed.

In a future release I plan on supporting more features that I am presently laying the groundwork for, including:

  • Trigger functions (actions to execute whenever a row is inserted into a table)
  • JavaScript-based “hooks” for your own custom logic
  • More types of charts
  • Grid-like interface for seeing multiple tables, queries, and charts at once
  • Toggleable “foreign keys” to help with relational data entry
  • Custom data entry interface support
  • …And more!!!

Example use case & a brief history

Starting back around 2017, I wished to create something to help manage my multimedia backlog – games, movies, books, TV shows, you name it – while also approaching the complexity of something like IMDB, TMDB, or TheTVDB.

This proved to be quite an investment, and not something I was able to commit myself to for a long time without burnout.

I decided to try using an Excel spreadsheet instead, which, for the most part, worked fairly well. I was able to organize my media in as many tables as I wanted, with the columns and data types that made sense to me, and creating something that I could edit from my desktop as well as my phone or tablet. Unfortunately, I ran into a serious snag, and that was that I expected to be able to join tables together in my browser. Neither Excel nor Google Sheets really support that feature for the web-based spreadsheets they offer, or the features they did offer were otherwise inadequate for my needs. I wanted to be able to define multiple tables that I could cross-reference and combine with each other in interesting ways to categorize and calculate statistics about my backlogs, and this simply was not possible with Excel.

Lets say that I would like to keep track of how many games I own, per-year, per-gaming platform. The trouble with storing this data in tabular form is that to do it manually, it requires a lot of cross-referencing that your computer should be able to do for you. So, lets conjure up some normalized data to illustrate my point:

Title Year
Final Fantasy XII 2006
Super Mario 64 1996

This table, lets call it table “A”, has two games and their original release year. You could say that this table is the “original release year for a game”. Now, lets say we also have this table:

Title Platform
Final Fantasy XII PS2
Final Fantasy XII PS4
Final Fantasy XII Xbox One
Final Fantasy XII Switch
Final Fantasy XII PC
Super Mario 64 N64
Super Mario 64 Wii (Virtual Console)
Super Mario 64 Wii U (Virtual Console)
Super Mario 64 Switch

This table, table “B”, contains the platforms that a game is released for. The reason these are two separate tables is because the data in each table scales differently per-type. Every game only has one “initial release year”, but not every game has the same number of platforms.

I would like to query this data and find out, for each game, how many releases of it I own, and the initial year it came out. In SQL, you would write a query something like this:

SELECT A.Title AS Title, A.Year AS Year, SUM(*) AS Count
FROM A
LEFT JOIN B ON A.Title == B.Title
GROUP BY A.Title, A.Year

And it would produce the following results:

Title Year Count
Final Fantasy XII 2006 5
Super Mario 64 1996 4

Trying to do this kind of aggregation and combining from multiple tables is simply not possible without leveraging relational data. Otherwise, you could get inconsistencies, or require complex application logic in order to ensure the data looks the way you expect. When dealing with manual data entry, with reasonably small data sets (as in, not on the order of zillions of rows, something that can fit in memory of a single machine) then relational data techniques are extremely powerful, and they allow you to turn what is otherwise a painful, error-prone process into something that your database can do for you.

When I was using spreadsheets, I kept running into this limitation all the time when using my phone to edit my tables with data on my media collection and backlog. My phone is powerful; it is 2023 after all. I should be able to, with a data set as reasonably-sized as mine, do queries with JOINs and aggregations and other sorts of expressions without needing to use a full-fledged database hosted on a server somewhere.

That is the promise of TinyDB.

When can I use TinyDB?

I am planning for beta access to start by some time in August 2023. Right now, the app is undergoing some major facelifts and does not support certain core features yet that are essential to the experience, so I am working on finishing those up getting this polished as soon as possible.

If you would like to get notified for the instant this is available, and possibly even get early beta access, you can go to tinydb.app right now and fill out the email subscription form.

What if I also want to subtract $10 from your wallet?

Luckily for you, I am running a promotion in honor of it currently being June, aka “Pride Month”. If you go to the above-mentioned email subscription form, you will see a field named “secret code” that is marked optional. If you specify “transrights” or some close-enough variation in the text box when you sign up, I will donate $10 to The Trevor Project in your honor as a way of saying thanks, and to help support trans kids. I have set a soft limit of $500 since I’m not made of money, so hurry up and add your name to the list by the end of June (or however long I want to honor the promotion for) and get it all sorted out.

Does TinyDB cost anything?

I would like all of the basic features I described of TinyDB here today to be free for all users, forever. I do not ever plan on limiting access or shoving intrusive ads into the experience. I would like to be able to offer certain features that go beyond simple database tasks in a browser, however, that might need a cost attached in order to do them sustainably. Depending on how popular this gets, I might also look into crowdfunding options for prioritizing support requests and enabling early access to features, for example. We will see.

Will it be free/open-source software?

Parts of it, yes, probably, maybe. Right now it is fully closed-source but I do intend to give parts of this an applicable license that permits free use and integrating with other software. I am still doing research into which license is best for my needs at this time.

Please share, get the word out, and I hope to start showing off new features and functionality as I develop them over the coming weeks!

Women Belong In Tech

Women belong in tech.

It’s such an obvious statement. Of course women belong in tech. Who would dare to disagree? And yet, here I am, at around ~7:30am on a Friday, writing about this. I should not be here. My first meeting of the day is not for another 2.5 hours and most of my coworkers are in a different time zone so I should have been able to get a little extra sleep in, but I am unexpectedly awake, and utterly furious.

I have not written a proper blog post in over three years. Originally, when I started this blog, I told myself, “I will write a new post every month this year” over and over, but nothing would ever come out. So after all this time if I’m actually writing about something, you know it’s actually important enough to get me off my ass.

So, women. Why are we talking about women? Because women have to regularly deal with such mountains of absolute disrespect that I’ve never had to face. Because women have to be better than men to even stand a chance in this industry, whether that’s being paid appropriate wages, being taken seriously at work, not being sexually harassed or objectified, or not having obscene double-standards applied to them every which way they go, because they are women. As if being a woman should have anything to do with one’s technical ability. Ada Lovelace, a woman, is commonly considered the world’s first programmer, and yet by and large this largely male-dominated industry fails to honor that legacy daily, by subjecting women to the most heinous and utterly indefensible situations that no person should ever have to deal with.

Women have not been silent about this. For the better part of a century now, you can find countless examples of women recounting their horrible experiences with bosses, coworkers, other men in their industry, and of course, the educational system. It’s not a surprise that only twenty percent of computer science graduates are women, despite women making up the majority of college graduates in general, when you consider just how unfairly treated women are in this space. From my own anecdotal experience, the vast majority of my classes at Purdue University Northwest were pretty evenly split between demographics, except for my computer science courses. Not only were the vast majority of my classmates male, but they exhibited common toxic rhetoric and behavior of the day as much as you could reasonably expect. I’ll even admit, I was occasionally there alongside them, saying things such as, “maybe men are just more predisposed towards these kinds of careers than women,” or even using my education and career choices as a way to feel smugly superior to others (i.e. liberal arts majors).

This was wrong then. I was wrong then. I was also only in my late teens and early twenties. Now, nearing my thirties, I have nothing but disdain for that kind of person and those popular talking points of the day. Still, these injustices persist, even amongst people I would otherwise respect or admire in this industry. You do not have to look far to find the average “tech-bro” figure, you know the kind. Maybe they developed some library or program many years ago that people still use to this day, or maybe they wrote a book or two that people recommend without a second thought. Maybe they founded or currently lead some company, or sit in a prestigious position, regularly giving talks and being an icon in their small corner of the industry. So you follow them online, hoping for more nuggets of wisdom, only to find that they exhibit some unusually regressive politics. On occasion, you might hear them say something small that sits wrong with you, or see some kind of decision they make in a position of authority that upsets you. But you tell yourself, “this person is well respected. People love this person. Surely, I should be giving them the benefit of the doubt, and not cause a scene. I should know my place and leave the experts to it.”

In the midst of this, you might see some people decide they’ve had enough. Maybe they are women, or people of color. Maybe they are white men who are upset on behalf of these marginalized groups. You don’t fully understand it. You have not been in their position, with their life experiences, and you could not possibly imagine the sheer scale of what years of microaggressions and other toxic behaviors will do to your ability to unquestionably tolerate others. All you ever see is maybe “some questionable opinions” at worst. And when these people start cutting ties, or they dare to hold these people accountable, you wonder why people are trying to “cancel” this figure. Surely, we should all just get along, and these rabble-rousers are the true source of the problem, yes? It’s all those people who choose to be upset in the first place who are the problem. Not I, a man who has never lived these lives. A man who has been happily coasting through most of my career, never worrying too much about whether I was being taken seriously, except during perhaps those early months or years when you’re still new. “See,” you say, “it happens to everybody. Women do not have a monopoly on feeling unappreciated in tech.” And so on, and so on, as you begin to rationalize for yourself why it’s totally okay how you are not nearly as angry as these other people.

So, “of course women belong in tech”, you might say. “But…”

This line of thinking, this toxic line of thinking, is exactly the problem and what needs to be addressed if we are ever going to hope for a more equal workplace for women.

We Need To Talk About John

At the risk of making this article sound like it’s exclusively about a single person and a single recent event, I’ve already been tweeting publicly about this so it’s no use pretending that anything else was the inspiration for today’s blog post.

John De Goes is a notable figure in the greater “Scala programming language community”, which is to say he has been around for quite some time, contributing to various projects of much renown, as well as being the co-founder of his own company doing Scala consultancy and development: Ziverge. They help coordinate, among other things, the development of the increasingly notable “ZIO” ecosystem of software libraries, as well as provide their own consultancy services and run conferences.

And as fortune would have it, John has been so kind as to give us all a brilliant demonstration of the sort of issues I’ve outlined above.

I am not going to bore you with paragraph after paragraph about what exactly the entire deal with this person is. Every single minor or major quabble over the years, every disagreement or questionable decision or rivalry. Even if you do not use the Scala programming language, however, you probably know “a John” in your own communities. Nearly every community of sufficient size has at least one notable figure who seems unusually divisive from a distance. Maybe you don’t pay too much attention to fine details. Maybe you just want to grill, for God’s sake. You don’t have time for community drama, and I respect that. There are more important things in life, after all, than wasting every precious moment by obsessing over specific actors in specific communities and their actions. It is not a healthy way to live.

Reader, I tell you: nearly every single thing I have ever learned about people along these lines has been against my will, and likely you might feel the same way about other people who you would much rather forget about. Not that I have been tied down and force-fed any of this, mind. I have had every opportunity to just “log off” and forget about the more problematic occurrences related to this sort of community drama, regardless of who is responsible or otherwise at the center of it. I am burdened with the gift of this knowledge, the understanding of the actions and words of specific people at specific places and times, and life would be so much easier if I could simply forget. If I could solely focus on doing my job, spending time with my family, and worrying about nothing else for the rest of my life.

Sometimes, however, against my desire to be free from this hell, I am brought back in, kicking and screaming, to observe once more the latest controversy related to some person or other, whether that is John or somebody else. Today’s specific situation, is the subject of what I believe are outright sexist comments made against a woman in tech, and the kinds of people who see nothing wrong with that.

The (Relevant) Timeline

To make this as easy to digest as possible I’ll save you from needing an entire college course worth of Scala community history and drama, and we will approach this situation on its own merits. (Though, I am happy to discuss other details privately, or on future occasions, as the need arises.)

In Scala, like many programming languages, there are several companies and organizations that collaborate on community-focused projects such as tooling or core libraries. Scala has a bit of an academic background, including the language’s creator Martin Odersky, who currently heads programming research at EPFL (in English: “Swiss Federal Institute of Technology Lausanne”). At EPFL, they have a non-profit center for coordination of the Scala language named the Scala Center. Here, various tools and programs are developed and organized by some extremely well-respected and talented contributors.

I do not have a personal relationship with anybody working at the Scala Center, for the record. Maybe I follow some of them on Twitter, and maybe a couple of them follow me back as mutuals, but we never directly communicate. I’ve only ever observed them from a distance, and perhaps people at my current place-of-business do work with them more frequently (for example, planning conferences and the like). Regardless, I should not have to be familiar with them personally, or professionally, to see the problem with the events I am about to describe.

Similarly, I am not personally or professionally familiar (to the best of my knowledge) with anyone at SoftwareMill, a Scala and Java focused consultancy that provides contractual services for clients such as software development, dev-ops, and so on. SoftwareMill is hosting a conference later this month in Europe called “Scalar Conference”, a place for Scala-focused industry professionals and academics alike to gather, present talks, and socialize.

John De Goes was set to present at Scalar Conf, and in the lead up to the conference he posted a series of tweets critical of Scala Center’s direction and resource allocation. Of note is the fact that Ziverge, his company, sought to sponsor the Scala Center, but they refused this sponsorship for their own private reasons.

Here is where the sexism finally hits: John shares a clip, originally missing context, of the current executive director of the Scala Center having a brief outburst of profanity during a talk. John says the following:

The Scala Center’s internal org chart raises many questions: the Executive Director of the Scala Center has no background in either business or engineering (essential for this job!), and their communication skills have substantial room for improvement.

The audio of the clip is transcribed as follows:

So, whoever it is, I challenge that person to grow some fucking balls and come speak to me. So thank you very much for those who understood, and those little pussies, you are just fucked up.

Following this, Scalar Conf announced that John’s talk will no longer appear, as they felt his recent public activity crossed a line of personal attack that should not be crossed.

Breaking it down

Right. So. Apparently it has to be explained to people exactly what is wrong with what John is doing here, as there are several people both in the replies and quote-tweets to Scalar Conf as well as on John’s twitter timeline who are arguing about this.

Lets break it down, piece by piece, by gradually adding context as necessary.

On Meritocracy

First, we have John questioning this woman’s credentials. As I made clear in the introductory segment, women repeatedly face issues of toxicity in the workplace every day, especially in programming and general tech which is a male-dominated field. Regardless of whether someone is a woman or anything else, I find questioning someone’s credentials to be particularly tactless in most cases. There are situations where I feel it is totally appropriate to question someone’s ability to do their job, but usually you should do not do that sort of thing by looking at their educational or business background, except perhaps if you are hiring. This person is, presumably, well-respected and trusted by her peers, or at least I have zero reason to assume otherwise. She achieved her current position, which is admirable, and absent evidence to the contrary she is likely doing a perfectly fine job at the stated goals of her position, at the very least. Barring, of course, any of the more specific criticisms of the Scala Center that people can leverage against them, which are not themselves personal attacks, but did lead into them.

Reaching back a bit into the sort of toxic dialogue I was exposed to back in college, I distinctly remember there being an increase in hatred towards “diversity hires” or the very idea of it. If a person in any position was not a white straight male, and anybody had any criticisms of their work whatsoever, people would jump to the horrible conclusion of saying this person was only hired “because they are a woman”, or “because they are black” and so on. In tech especially, it is generally assumed, as it is a male dominated field, that the average man knows what they’re doing. Men respect each other and by default they see each other as equals. If a white man in tech is not exactly excelling at his job, he is not ever called a “diversity hire”. He is the “default”. He is the “status quo”. He does not need to be questioned nearly as hard. Hell, the average man would likely have sympathy for someone having difficulties at their job, rather than assuming straight away they are incompetent. A woman, however, has much more to prove. People are inherently skeptical of their abilities and understanding of what’s necessary for the job. Even among women and people of color, these habits are so pervasive that we might not even recognize when we are exercising them, or letting them subconsciously bias us towards certain conclusions.

Is John literally saying she is a diversity hire? Not with words, no. But the sentiment is clear. She is a woman, who is in a position without the “right credentials”, so she is inherently suspect. Ask any woman in tech if they have ever been grilled about their know-how, their credentials, their ability to perform basic tasks any person should be capable of. Even with the “right degrees” or the “right background”, women still do not get taken seriously, and that is even besides the point that the background does not matter one bit. If John were more honest, he would recognize that there are numerous talented and skilled professionals in nearly every field who are either self-taught or pivoted from another career or educational background. He frequently mentors and instructs people lacking those qualifications as well, so on many levels, he should know better.

To judge a person for their background at all in situations as low-stakes as this, is to question whether or not they belong here. It denies the herculean efforts that people of all kinds, particularly women, have to make in order to be even considered for the same sort of roles and positions that the average man is. Recall I said earlier that women have to be even better than the average man in order to be taken seriously. Now consider that, if you are a woman and you are doing everything you possibly can to succeed in this industry, that you will still be questioned as an outsider, as someone who needs to “prove themselves” no matter what.

We have a stylistic preference for men as a society, not based on any good reasoning, but based on institutionalized sexism. A relevant quote:

We live in a sham meritocracy, where we pretend to pick the best person for each job, while simply picking those we prefer: and when the jobs pay well, they are still overwhelming male. Our preferences are based on style rather than substance, so we pick individuals for leadership on the basis of their confidence rather than competence, charisma rather than humility, and narcissism rather than integrity. For every Angela Merkel, there are many Silvio Berlusconis, Jair Bolsonaros, and Donald Trumps. Not just in politics, but also in business, the typical leader is not known for their humility or competence, but arrogance and incompetence.

Is it ever wrong to criticize someone who happens to be a woman? Absolutely not. I probably do it every other day on social media if I had to guess, or would if I couldn’t stop myself by finding better uses of my time. That is not what is at issue here, however. A woman exists in a position where she is trying to make a difference, and that criticism crossed a very clear line that questioned whether or not she belongs in this boys club, by dogwhistling the sort of diversity hire rhetoric you frequently find in hateful right-wing circles. Regardless of whether or not that was the intent, it certainly comes across that way to people who have been paying attention to these sorts of issues for the better part of the past decade.

On Profanity and “Professionalism”

If you follow me on Twitter you might now I fucking swear quite a fucking bit. I’m not afraid of it. I feel it is occasionally quite relevant to certain discussions at hand, and it is a succinct way to express excitement and anger all the same. Even still, there is a time and place for everything, so while you might not swear in church or while conducting an important meeting, that switch might flip in less “professional” settings.

So what exactly is “professionalism” and why does it matter here? John is accusing this woman of being unfit for her job, partially due to this outburst, as it comes across as “unprofessional”. Again, without going too deep into the weeds here, John in particular has a particular affinity for this idea of “professionalism”, even naming one particularly poorly-thought-out “code” after the concept. The general idea behind a lot of John’s public-facing statements and interactions has been to reinforce this idea of being a “professional”, as in, someone who does not give in to “politics” and infighting, slinging insults between parties. He positions himself as trying to best exemplify these ideals, though it would be all too easy to call him a hypocrite on that front (more on that later).

Respectfully to anyone who might be so inclined to be offended by this particular profanity outburst that we are discussing: your feelings here do not matter, and they are besides the point. Trying to tone-police women for a singular outburst of profanity, regardless of context, comes across as if you are judging people (women) for the “crime” of being human and having emotions. You are not her boss. You are not her friend. You do not need to comment. Situations like these are dealt with by the appropriate parties, at the time they occur, and don’t need your input.

It goes without saying that you are not supposed to say those kind of things in a professional setting without good reason. So you might be asking, what is the reason? The continued objectification of women by men who should know better.

The clip that was linked originally did not have context posted, but it was shared before being taken offline for privacy. When faced with the sort of harassment that these situations usually result in, I cannot blame anyone for locking down their accounts to ride out the storm, or removing/making private videos or content that is relevant so it does not receive dozens of hateful comments.

The outburst was in response to a female presenter being told, during this talk, “You are pretty!” by someone anonymous. Here is one attendee of the talk in question who raised concerns that very day, correctly pointing out that, “…[this] may be part of the reason why women don’t feel as welcome in IT as men do…”

(UPDATE: The above paragraph was edited to clarify that another woman, not the now-director of the Scala Center, was the recipient of objectifying remarks. For the record I was not present at the event in question so I have had to slowly piece together information from anecdotes and first-hand witness accounts.)

Now, I know what some of you are thinking: “That comment does not seem so bad”, or, “It is bad but it is not nearly as bad as the outburst that came after”, perhaps. I know why you feel this way. Maybe you are a man who has not had to deal with men cat-calling you, or trying to get their grimy hands all over you and your body by any means necessary. Contrary to what you might have been told as a small child, it is not, actually, always the best idea to say these kind of things to a woman. Women deal with objectification on a daily basis in ways both large and small. Imagine being a grown adult woman, having dealt with creepy relatives, “nice guy” friends who only wanted you for sex but don’t respect when you want to be left alone, sexualizing comments from even the youngest of ages, all continuing into and throughout most of the rest of your life. It can feel like you are treated less like a real, human being with your own thoughts and emotions, and more as an object, something designed to titilate those with no sense of self-control rather than being properly respected.

I am a married man. I love my wife, and I could not imagine my life without her. I can call her beautiful or pretty. I have a consensual relationship with her, and we talk about any of our issues that come up if we ever cross any boundaries. You are not married to random women you see on the street, or in conferences. You are not even in a general relationship with them. And even then, every person has their own boundaries, and their own understanding of what is acceptable behavior towards them. By default, why would you ever assume those comments are okay to make to someone who has not agreed to hear them?

That covers the objectification angle, but for some reason you might be hung up on the choice of colorful language. The thing about language like this is, absent any sort of divine punishment for speaking it, none of it actually matters. People give words meaning and power based on their context, not whether they are inherently good or not. It’s why you can watch movies with actors that curse like a sailor, objectify women, or even speak racial slurs if the story calls for it. It’s such an easy target to focus on the words without focusing on why they were spoken.

It is so tempting to look at this situation in a bottle and think that this woman, who to you might as well have been willed into existence just for this talk if you do not know them or have not grown up with them, is acting “irresponsibly” out of nowhere, that there is no possible context that would make this okay. By refusing to even pretend to understand the source of the frustration, that sometimes a single straw can break a camel’s back after so many years of this, it shows a distinct lack of empathy and understanding.

Also, it was nearly four years ago

Don’t think this has been mentioned by John or almost anybody else, but for the record, this talk occurred on or around October 7, 2019.

John’s comments, by comparison, were made on March 9th, 2023, and today is March 10, 2023, about three and a half years apart.

When we’re talking about the competency of someone to do their job, or to be an effective leader, linking to a single (justified, in my opinion) outburst of profanity from nearly four years ago (which was some time before she got the job) just makes it seem like you are digging for dirt. You are looking for evidence to use in your righteous quest to criticize someone, and not actually holding this against them in any meaningfully honest capacity. Did that outburst affect you? Have you not been able to sleep soundly for four years? Really? (UPDATE: I was able to confirm this was, indeed, before she got the job, and has maintained it without incident for the past 3+ years.)

Lets be reasonable. Who among us has not, at any point in time, ever gotten “unreasonably angry” about some situation? Maybe you cursed at someone. Maybe it was your boss, or your friend, or your family. Being angry is not an unforgivable sin. By contrast, I would argue that refusing to understand why someone would be angry or refusing to apologize if your own anger was unjustified, is actually a problem worth caring about.

Or, perhaps, this is such a small, singular incident, that even if it were a bad look (which it is not) it was so long ago and comes with so many caveats that I would be willing to overlook it on the principle that each person’s character is a rolling average of their continuous actions. If you do something bad once, and never approvingly acknowledge it ever again, for certain kinds of actions that seems like a fair sort of thing to waive. Now, does that mean I have to make nice with everyone who was personally mean to me several years ago? Absolutely not. That is my personal, private decision. Not only was this not directed at John, so he has no right to feel personally offended, but it is also so small in scale and scope that any reasonable person should be able to forgive and look the other way as if it never happened.

Do you want to know what happened the last time I had an outburst in a professional setting? I was in California for an internship. I was thrilled to have the opportunity, being from the midwest, as I could use this to bolster my resume and get a head start on my career. Unfortunately for me, the pay was lousy, and literally the only place I could afford to stay (while dipping into my savings) was an Airbnb with a dozen or so other beds. I slept in a closet all summer, I had to deal with living around over a dozen other people (each of which had their own issues and conflicts), I commuted to work in the hot San Jose sun, and after a while it started getting to me. I became angry. Not just at myself for taking this obviously bad deal of a job, but at the business for ever thinking it was acceptable to offer in the first place.

I had a meeting with the boss of this company, where I laid out my concerns, and how it had affected my mental health, hoping to find some kind of understanding. They threw the entire thing back in my face, at which point I said, and I quote, they were paying me a “fucking starvation wage”. This greatly upset my boss. I’ll never forget how he responded to me, not by defusing the situation but by telling me, “first of all, do not swear at me”. He followed this up with, I kid you not, a book recommendation. I forget what it was called, (something maybe involving the phrase “Yes, sir!”) but looking into it, I felt so offended I was without words. The premise was basically a way to condition you to be uncritically accepting of whatever your boss is giving you. Don’t stand up for yourself, it seemed to say. You are being given an opportunity and you should be thankful! Never mind the fact that $15/hr in the San Francisco Bay Area of all places is literally too poor to afford the most basic accommodations. Never mind the fact that the other intern there was also in a similar living situation as me, so they could have done their due diligence upfront instead of waiting for someone to complain.

When I think of people being overly critical of profanity, acting like it is the most unspeakable sin a person can commit, I think of that old boss. I think of how me swearing at him that one time, on the verge of tears after several days of nervous breakdowns, was more offensive than their terrible business proposition. I think of being told to shut up and take what I was given, because I suppose I “should be thankful I even have a job at all”, and should not complain about the conditions I was forced to live in if I wanted to keep the job.

And when I think of women who complain about their working conditions, or react with hostility towards even the smallest-seeming aggressions, I think of how I felt back then. I took that job because I felt it would help me in my career. How many times have you ever done something you felt uncomfortable with because it would help you in some way? Now imagine that is basically your entire life. You need to deal with your sexist boss, or your sexist coworkers, or your sexist family because it’s for the greater good. You’re not allowed to be upset. You’re not allowed to speak out, to scream, to curse. Because that is not what a “proper lady” would do. Not what an “educated woman” should do. You should know your place. You should only ever be fully professional, and you should expect to take these aggressions on the chin for your entire life, because if you speak up in any capacity, you’ll be judged for it. For causing division. For raising a fuss. For not having an “appropriate tone”.

Think of that the next time you want to so publicly judge someone for something. Think about whether or not you are capable of putting yourself in their shoes and finding common ground. Don’t make this about yourself and about how you, personally, would “not have reacted that way” or some “holier than thou” nonsense. Don’t do it, especially if you’re basically telling a woman to know her place.

Cancel Culture Hypocrisy

I mentioned I’d touch on this, so briefly, John and people like him are frequent critics of “cancel culture”, this idea that society could come to “cancel” you at any moment, for any infraction no matter how small, demanding you lose your job and whatever prestige you may have left, all because of a couple simple mistakes. A small thing that may have happened once or twice, that does not constitute the entirety of your character, and should not be held over your head for eternity no matter how long ago it was.

Sound familiar?

I do not believe that this exists in the capacity these people describe, for a wide variety of reasons, but lets use John as the perfect example of why this concept is nothing but a hot, steaming load.

John has been “cancelled” by his own mentioning or endorsing of opinions expressing this on social media, I want to say, roughly 4-6 times over the past six-ish years, at least, including this one. Each incident usually involved some conference deciding he should no longer be allowed to speak, or him not being welcome within certain private groups in the community, or some person no longer wanting to associate with code or projects related to him or his company. These are private decisions, made by private individuals and the organizations that they make up, and all stem from freedom of association.

Not every country has “freedom of speech” per se, but in most places you absolutely have the right to choose who you associate with. If I decide I no longer like a family member, I am totally free to cut them out of my life. If someone says something horribly offensive that crosses a line, and I run an event that they are invited to, it is within my rights to bar them from that event, for the safety and comfort of the event attendees.

So what is the result of John being “cancelled”? He can no longer attend a few events. He is no longer welcome in some organizations. Some people have independently concluded that they do not want to associate with him. Others do. He is still welcome in other events. He is still welcome in other organizations. He even runs his own. His company, by my understanding, has contracts with some big names. He has several employees who would presumably stand by him even if the moon fell.

That does not sound like being “cancelled” to me.

What does it mean if you can be “cancelled” and still be financially and even socially successful? Still run your own business, still run your own conferences that I assume have reasonable attendance, get enthusiastic employees and customers alike. It’s not like the internet banded together to, say, “take the wife and kids”, metaphorically speaking. Scala is far from a large community, but it is an active one. Everyone kind of knows each other, except the people who don’t need to. I’ve worked with dozens upon dozens of people who either do not care about any of this, or actively support the man. So, what exactly was taken from him that he feels he deserves?

The implication here is that if you are “cancelled” and actually upset about it, it’s solely a frustration about people choosing to disagree with your words and actions. That’s it. If a conference doesn’t want you there, they have made their case. They do not want to associate with you. Are you denying their right to say so? Well, of course not, because John has his own conferences, he has his own company, clients, and so on. If people don’t like you, you have exactly two options:

  • Attempt to convince them otherwise, either by apologizing and demonstrating changes
  • Accept the situation, and continue on with your life

That is not to say he has no right to criticize people who would otherwise criticize him. This happens in all directions, all the time, in every community. It’s a fundamental human right. But he is not being “cancelled” for it. He’s just upset that select groups of people have drawn a line that he is on the other side of.

Oh, yeah, remember when I said this:

Sound familiar?

What exactly is John doing, if not trying to “cancel” someone by his own definition? He is publicly trying to hold someone accountable for actions that occurred in the distant past, actions that many would agree are “not really a big deal” at worst, and he is implicitly stating, through criticizing her position, that she does not deserve (and therefore, should lose) her job.

“Cancel culture” for me, but not for thee, I suppose.

If John were being honest, he would recognize this and admit as much: that he is trying to “cancel” someone. John would have you believe that this is different, and not the same thing at all, however, because this time, it’s justified. This time, it’s not directed at him, but at someone else. Someone who allegedly does not like him. They deserve it, you see, for ever doing this one thing “wrong” in the first place. It’s totally normal to bring up these small things years later for no good reason other than dragging someone’s name through the mud.

Now see, here’s where John and I agree: it is, actually, totally okay and normal to bring up the bad things people have done, whenever it is relevant or couth to do so, especially if it is part of making a larger point that actually has a meaningful impact on people, such as establishing a long-term pattern of awful behavior, or questioning why people would associate with someone for what constitutes some good reason. I am heavily critical of Elon Musk for example, and I will be until the day I die. I will absolutely bring up things he has said and done within the past several years, not simply because he has failed to grow and improve, but more to the point: he continues to get worse with each passing day, saying and doing such insane and terrible things that it makes me wonder why anyone ever liked him to begin with.

On the contrary, the woman in question is not exactly guilty of any sort of crime, legally or morally. Even if you argue “maybe they shouldn’t have cursed that one time”, you have to admit that it was not only so long ago, but it was a singular event. There is no evidence to suggest that she regularly exhibits seriously problematic and unprofessional behaviors. My closest understanding of the situation is simply that this is the best thing John could find in an attempt to discredit the Scala Center, which is pathetic.

Closing & Resolutions

I would like to say something as easy and simple as, “I think John should apologize to this woman, and the Scala Center for attacking one of their own”. I would like to, but it seems futile at this stage. People such as John, not specifically but an entire group of people, these men who feel justified in wedging division between people along sexual boundaries and then recoiling in horror at the suggestion that they might have done or said something wrong, are an entire societal problem. I do not expect an apology, because as I alluded to earlier, John and people like him have long patterns of behavior. Many people, myself and others included, independently come to conclusions about people such as him, based on the way they interact with others. Based on the actions and words they say at appropriate times. I have seen nothing, not one single ray of hope from that crowd, in so many years.

It is so easy to pretend this is as simple as a respectable difference of opinion or whatever. Or even go on a rant about how some form of justice is being done by being “unafraid of the truth” or however these sorts of people want to phrase it.

I am just so tired. I am tired, I am angry, and it does not come from a place of hatred for any one person. It comes from a lifetime of frustration. Frustration for not being able to truly ever understand what it is that other people deal with. Frustration from ever being wrong about any of this at any point earlier in my life. Frustration from the continued acceptance and tolerance of this sort of behavior in technical communities.

And John, if you’re reading this, please grow and change as a person.

Be good to each other out there, folks, but never let your guard down. Keep standing up for what is right, and be willing to speak your truth, unless of course your “truth” involves smearing the reputation of a woman for your own ends.