Career Update: Back to Engineering!

Since the inception of my software engineering career, decades ago, I have enjoyed creating resilient software systems and building efficient engineering teams. I found that one of the most important aspects affecting the success of any project is how close engineering teams align with user and community needs. This is one of the reasons it’s crucial for engineering to understand users.

During the past year and a half I’ve been deeply focused on distributed systems and advocacy around Apache Cassandra at DataStax. I chose to work at the company for their commitment to building extremely scalable and performant products. Another reason was my respect for people who work at the company, many of whom are active contributors and committers to Apache Cassandra, Spark and other important open-source projects. DataStax maintains deep experience in the area of distributed databases and I am happy to have been able to contribute to improving products and educational materials around Apache Cassandra. Having gotten to work with many engineering teams within DataStax I am excited about our future efforts!

✨ I’m stoked to announce ✨ – this week I have officially joined the DataStax Apollo engineering team as a Principal Cloud Architect. It wasn’t an easy decision to move from developer advocacy back to engineering because of the great advocates team. I am absolutely thrilled to work together with the Cloud Platform, Services, and Operations teams and contribute to engineering practices across the company. I will always be advocating for the community and in my new position I will be able to contribute directly to solving challenging distributed systems problems with a brilliant team.

📘 More about my team – DataStax Apollo Astra!

📝 If you are interested in collaborating with my team or would be interested in joining, we are hiring engineers! Reach out to me all the regular avenues, @Adron on Twitter, LinkedIn, or message me.

Catalina 10.15.1 & OBS 24.0.2 Catastrofuck “Oops” (UPDATE: 24.0.5 Release Fixes)

December 14th, 2019 UPDATE! Scroll to the end of the post for details and link to the latest version.

catalinaOver the last few months I’ve started working a lot more with DAW’s (Digital Audio Workstation) Software. The main software I’ve been using and have taught myself includes: Logic Pro X, Superior Drummer 3, and EZMix 2. I’ve written and played music for more years than I’ll count, and have wanted to make Twitch streaming one of my outlets to produce, mix, write, and offer up music that I put together.

obs-studioSince I’ve spent the time training up on Logic Pro X, that ties me somewhat to MacOS. I could switch to something else and there would be some familiarities. But whatever the case that would mean I’d need to retrain myself on those non-familiar nuances of the software. The other software I use is offered as either MacOS or Windows and considering I’ve seen how Windows behaves with many of these things, bloats up with other things, and overall gives me a general UX distaste I didn’t really want to move or shift to that OS.

That leaves me running MacOS to insure the software works and move forward. Honestly, it’s a slick package when they’re all rolled together. Don’t think I haven’t just abandoned Windows and Linux for other things, I haven’t. Linux is still basically my daily driver for almost every single things I do besides produce music. Coding is Linux, document and documentation writing is on Linux, building websites is on Linux, gaming ironically is on Linux, Docker runs better on Linux, Kubernetes basically runs on Linux, Go is just kind of easier on Linux, and even .NET, C#, F#, Python, and so much more is all over there running on Linux with less resistance. The Dell XPS 15 running Ubuntu is a solid platform for all of these things. Albeit I’m not sure what could happen because much of the IDE/platform software is easier and more feature reach and integrated on MacOS. So all that said, here I am, running MacOS to ensure I can produce and write music without resistance the other platforms cause.

The Current Catalina Problem

All that said, the recent upgrade to Catalina has left me with a black eye square in the face! OBS simply is broken, for the most part, if one launches it or uses it in the traditional way one would use it. I’ve found myself continually launching it from the terminal, which appears to alter the way it starts and then it respectively demands access to the devices that it needs. To do that it’s just a single command;

/Applications/OBS.app/Contents/MacOS/OBS

i.e. I just run the app, from the executable. This, as I was writing seems to fix many of the permissions issues and allow OBS to run without hindrance. However it is one of many apps that cause issues.

That’s it for this post, just an update and a few notes + links about where I am with this effort. Eventually, music composition, production, and bouncing (recording and export to MP3/WAV/etc) will be my weekend Twitch schedule. For now however it’s an ongoing battle to get all the pieces working appropriately with MacOS Catalina. It is new, so I imagine most of these issues will be worked on the coming weeks. Stay tuned!


UPDATE DETAILS:

New version of OBS released with tons of Catalina (and Linux) fixes! Release notes on all the updates, fixes, tweaks, and errata.

  • Fixed macOS Catalina issues
  • Fixed macOS Python scripting support
  • Fixed a bug where audio bitrate would not be properly set to the specified value in simple output mode
  • Fixed a bug where videos on loop could sometimes get frozen when switching scenes
  • Fixed a bug with Linux Display Capture where the crop value would shift the cursor’s captured position incorrectly
  • Fixed an issue where if the video drivers crashed on Windows for whatever reason, OBS would not recover from that properly and also crash (yes you heard that correctly)
  • Fixed an issue where when connecting to your Twitch account fails because of Twitch’s two-factor authentication requirement, you would not be able to change to another Twitch account until authentication was fixed and the account was reconnected
  • Fixed an issue where when connecting your Twitch account for the first time, the panels would not open up in dark mode
  • Fixed an issue where preview projector stopped working when toggling studio mode
  • Fixed an issue where multiple 0x0 windows would appear on Linux Window Capture
  • Fixed an issue where certain windows would not be listed with Linux Window Capture
  • Fixed a few rare crashes
  • You can now use Twitch dashboard panel URLs as custom browser docks
  • Added some additional graphics and audio diagnostic logging

DataStax Enterprise Kubernetes Operator Release

Recently KubeCon 2019 was held in San Diego. I was intending to go but things came up and I had to alter my plans. Even without attending I still was able to accrue a lot of the details from people attending and just kind of watching the Twittersphere. Twitter is, contrary to a lot of conversations, very useful sometimes. At DataStax where I work we had our own release at KubeCon for our DataStax Enterprise – AKA ‘DSE’ – Kubernetes – AKA ‘K8s’ Operator.

With KubeCon wrapped up I got to catch up with Christopher Bradford about this release of the DSE K8s Operator on the Distributed Data Show – AKA DDS. Here’s the podcast of the DDS DSE K8s episode talking points:

  • 00:30 – 01:12 The not secret name of the DataStax Enterprise Operator for Kubernetes, or as I call it the DSE K8s Operator.
  • 01:13 – 02:28 Discussing KubeCon, which reached 12k attendees this year!
  • 02:29 – 04:19 What is the DataStax mission in creating a K8s Operator? How to squelch the complexity of Kubernetes!
  • 04:20 – 06:06 Delving into the idea behind custom resources, architectural setup around “Cassandra Racks and Datacenters” and how that maps to Kubernetes and the Operator managing these within a Kubernetes Cluster.
  • 06:07 – 07:59 Where do the container images live, who maintains them, and how can you get them for use with Kubernetes?
  • 08:00 – 11:59 What about support, business impacts, and what are the plans for the human operators around this? How can a company get support for this product?
  • 12:00 – 15:28 What about he other Kubernetes Operators for Apache Cassandra? Well, we discuss some of the options (see links below under the references) and the differences between those operators and the DSE Operator.
  • 15:29 – 23:14 It’s important to discuss the current state of stateful workloads. Elaborating on how we can have pets and not just cattle for specific systems like this in Kubernetes now!
  • 23:15 – 25:13 Last minute thoughts on KubeCon & Kubernetes.
  • 25:14 – [end] Take it for a test spin in beta! Mentions for more materials, references, etc, which I’ve posted below.
Here’s the podcast, “**First Look at the DSE Kubernetes Operator with Christopher Bradford Episode 128 Distributed Data Show**”

https://soundcloud.com/datastaxdevelopers/first-look-at-the-dse-kubernetes-operator-with-chris-bradford-ep-128-the-distributed-data-show

References for K8s Operators for DSE & Apache Cassandra:

Beyond CRUD n’ Cruft Data-Modeling

I dig through a lot of internet results and blog entries that show CRUD data modeling all the time. A lot of these blog entries and documentation are pretty solid. Unfortunately, rarely do we end up with data that is accurately or precisely modeled the way it ought to be or the way we would ideally use it. In this post I’m going to take some sample elements of data and model it out for various uses. Then reconstitute that data into different structures for various uses within microservices, loading, reading, both in normalized form and denormalized form.

The Domain: Railroad Systems & Services

The domain I chose for this particular example is the entire global spectrum of rail services. Imagine if you would a system that can track all the trains in the world, or even just the trains in a particular area of the world, like the United States. In the United States the trains can be broken down into logical structures of data for various things like freight trains and passenger trains. Trains operated under a particular operator like Amtrak, Union Pacific, or Norfolk Southern, and their respective consists that the train is made up of. Let’s get into some particular word definitions to fully detail this domain.

  • Train – A train is an engine, or motorized unit, that generally pulls other cargo or passenger units.
  • Engine – An engine is a specialized unit that is used to pull or push a train.
  • Consist – A consist is the description, or list, of units that make up a train. Often referred to as the train consist.
  • IMG_3575-X4.jpgPassenger Car – A vehicle unit within a consist used to carry passengers, in which passengers are one or more humans being carried between origin and destination.
  • Freight Car – A vehicle unit within a consist to carry freight of some type. This could be coal, wood, iron, general goods, or other items.
  • Schedule – This is a list of time points that a train will depart and/or arrive from through the course of a trip.
  • Trip – A journey from a designated origin to a designated destination.
  • Time Point – This is an entry item in a schedule which provides some detail around the departure or arrival, or both, of a train traveling along a schedule that is on a trip. A time point is also a specific detailed geographic location within a a trip.
  • Destination – A point along a trip, in which a train arrives at and may depart from, or the final arrival point in a trip that the train arrives at but marks the trip complete.
  • Origin – A geographic and time based point that marks the beginning of a trip.
  • Load – The content, either persons or cargo, that are carried on a particular train or on a particular unit within a train consist.
  • Class I Railroad – The metrics in which a Class I Railroad is defined has changed numerous times over the years, but the quick summary is Class I railroads today are the largest rail service providers in the United States, meeting service, revenue, and other various measurements. There are also Class II and Class III railroads, again, meeting various metrics that over the years have changed.

Trivia: Did you know that Bill Gates is the largest shareholder of Canadian National Railway Company? He owns a massive 13% in the railroad operator as of 2019.

Now let’s get this modeled out into some usable schema. It’s important to note that whenever you receive data that you expect to actually use or display, it’s always in some type of format, schema, or other structured form. The idea that data is schemaless is a red herring and/or strawman argument when we’re trying to make something of the data. Building to a schemaless design just means you’re going to be dealing with voluminous garbage. There’s a reason that many systems, and in Comp Sci 101, they teach GIGO, or “Garbage In Garbage Out“!

In this scenario we’re going to keep the data cleaned up, but in the respective formats that give us the best availability and access to the data.

Model 1 – Data Received

banner4The following is how I managed to receive this data. Some collected from Wikipedia, some from specific systems, and some of it is generalized or made to just represent real systems. All of it is indeed representative of real railroads running train operations throughout the United States. Later, when data can be made available, we can add other nations and rail systems. For this post I’m going to focus solely on the United States.

The following are what are designated as “Class I” Railroads within the United States National Rail System.

Just for fun I’m adding the following systems out here on the West Coast. When time allows, maybe I can add the east coast and Chicago systems. Which would give us a LOT more to work with! But for now this is enough.

  • Sounder – Seattle Commuter Rail owned by Sound Transit and operated by BNSF.
  • Caltrain – San Francisco to San Jose Commuter Rail.
  • Metrolink – Los Angeles Commuter Rail.
  • Coaster – San Diego Commuter Rail operated by Bombardier Transportation.

Trivia: Did you know that Warren Buffet is the largest shareholder of the Burlington Northern Santa Fe (BNSF)? Well, technically he’s not just the largest shareholder but his firm Berkshire Hathaway (NYSE: BRK-B) bought BNSF in 2010 for $26.5 billion, the biggest acquisition Buffett has made.

Looking at this data I put together (via some Twitch streams here finding the dbschema tool, here learning about more maps, rail systems, and further schema design, and I’ll write up the others in a future blog post) a first shot at a data model around this. To do this I found this tool at https://dbdiagram.io to build out a schema by writing out the schema itself, here’s what I ended up with for now.

diagram

The dbdiagram Interface with Schema Configuration

With that put together, the other cool feature this tool has is the option to generate the SQL for PostgreSQL, mySQL, or SQL Server. That’ll give me a perfect start for taking one of those and tweaking it for CQL. The end product looked like this for the first schema.

CREATE TABLE IF NOT EXISTS "Consist" (
  "id" uuid ,
  "trainId" uuid,
  "unitId" uuid,
  "details" text,
  PRIMARY KEY ("trainId", "unitId")
);

CREATE TABLE IF NOT EXISTS "Unit" (
  "id" uuid ,
  "typeId" uuid,
  "name" text,
  "started" date,
  "age" int,
  "mileage" int,
  "load" map<text,text>,
  "ladenWeight" int,
  "unitWeight" int,
  PRIMARY KEY ( id, "typeId", name, started )
);

CREATE TABLE IF NOT EXISTS "UnitType" (
  "id" uuid ,
  "name" text,
  "description" text,
  "unitLoadType" map<text,text>,
  PRIMARY KEY ( id, name )
);

CREATE TABLE IF NOT EXISTS "Operator" (
  "id" uuid ,
  "trainId" uuid,
  "railroadId" uuid,
  "details" text,
  PRIMARY KEY ( id, "trainId", "railroadId" )
);

CREATE TABLE IF NOT EXISTS "Railroad" (
  "id" uuid ,
  "name" text,
  "history" text,
  "description" text,
  "hqCity" text,
  "hqAddress" text,
  "homepage" text,
  "abbreviation" text,
  "serviceArea" text,
  "mapLink" text,
  PRIMARY KEY ( id, name, "hqCity", "serviceArea" )
);

CREATE TABLE IF NOT EXISTS "Schedule" (
  "id" uuid ,
  "timePointId" uuid,
  "name" text,
  primary key ( id, "timePointId", name )
);

CREATE TABLE IF NOT EXISTS "TimePoints" (
  "id" uuid ,
  "name" text,
  "type" text,
  "desription" text,
  "arrival" timestamp,
  "departure" timestamp,
  primary key ( id, name, type, arrival, departure )
);

CREATE TABLE IF NOT EXISTS "TrainSchedules" (
  "trainId" uuid,
  "scheduleId" uuid,
  primary key ( "trainId", "scheduleId" )
);

CREATE TABLE IF NOT EXISTS "dtTrainConsist" (
  "trainName" varchar,
  "operatorName" text,
  "trainStarted" date,
  "trainEnded" date,
  "trainDescription" text,
  "trainNotes" text,
  "unitName" text,
  "unitStarted" date,
  "unitAge" int,
  "unitMileage" int,
  "unitTypeName" text,
  "unitLadenWeight" int,
  "unitWeight" int,
  "unitLoad" map,
  primary key ( "trainName" )
);

CREATE TABLE IF NOT EXISTS "dtRailroadTrains" (
  "trainName" varchar,
  "operatorName" text,
  "trainStarted" date,
  "trainEnded" date,
  "trainDescription" text,
  "trainNotes" text,
  primary key ( "trainName" )
);

Alright now I’ve got some tables to work with. Some of these primary keys and other elements may need to change, I’ll need additional tables, but this again, is a rough draft of the schema design so far! With schema migrations written out and stored in a repo, and additional data for core tables available too it’ll be really quick and relatively painless to build out and tear down the database whenever I need it. I’ve also added below the following INSERT statements to get the initial load of data, as detailed in the above post, into the database. Once I get more of the data into these tables it’ll also dictate where changes need to occur, what additions should be made, and other table schema alterations.

Model 1 – Inserting Data

First I need the railroads, which I’ve listed above, that I’m going to endeavor to collect data on. Let’s get all the big ones, plus the commuter lines I mentioned above added. Here’s the scripts for that.

INSERT INTO railroads."Railroad" (id, name, "hqCity", "serviceArea", description, history, "mapLink", "hqaddress", homepage, abbreviation, active)
VALUES (d2f92bf0-1d0e-461b-8758-8448703f6bd4,'Amtrak','Washington DC','US,CA','Intercity Passenger Rail for the United States and parts of Canada.', '', 'https://en.wikipedia.org/wiki/Amtrak#/media/File:Amtrak_network_map_2016.png', '400 North Capitol Street, NW, Washington DC', 'https://www.amtrak.com/', 'AMTK', true) IF NOT EXISTS;

INSERT INTO railroads."Railroad" (id, name, "hqCity", "serviceArea", description, history, "mapLink", "hqaddress", homepage, abbreviation, active)
VALUES (782ea70a-1db3-4973-9b89-b70ecdb07cce,'Alaskan Railroad','Anchorage','US','', '', 'https://en.wikipedia.org/wiki/Alaska_Railroad#/media/File:Alaska_Railroad_Map.PNG', 'P. O. Box 107500, Anchorage, Alaska 99510-7500', 'https://www.alaskarailroad.com/', 'ARR', true) IF NOT EXISTS;

INSERT INTO railroads."Railroad" (id, name, "hqCity", "serviceArea", description, history, "mapLink", "hqaddress", homepage, abbreviation, active)
VALUES (77f86288-60a1-469d-8dee-862ed8c9cd92, 'Burlington Northern Santa Fe', 'Fort Worth', 'US', '', '', 'https://en.wikipedia.org/wiki/BNSF_Railway#/media/File:BNSF_Railway_system_map.svg', '2650 Lou Menk Drive in TX, Fort Worth, 76131','https://www.bnsf.com/','BNSF', true) IF NOT EXISTS;

INSERT INTO railroads."Railroad" (id, name, "hqCity", "serviceArea", description, history, "mapLink", "hqaddress", homepage, abbreviation, active)
VALUES (be882dfb-6bc9-4d9e-bba0-0f65b3a9e6e0, 'Norfolk Southern', 'Norfolk', 'US', '', '', 'https://en.wikipedia.org/wiki/Norfolk_Southern_Railway#/media/File:Norfolk_Southern_Railway_system_map.svg', 'Norfolk, VA','http://www.nscorp.com/','NS', true) IF NOT EXISTS;

INSERT INTO railroads."Railroad" (id, name, "hqCity", "serviceArea", description, history, "mapLink", "hqaddress", homepage, abbreviation, active)
VALUES (f0914110-e4ff-499a-b4f1-27b4cb7b21ef, 'Union Pacific', 'Omaha', 'US', '', '', 'https://en.wikipedia.org/wiki/Union_Pacific_Railroad#/media/File:Union_Pacific_Railroad_system_map.svg', '1400 Douglas Street, Omaha, Nebraska 68179','https://www.up.com/','UP', true) IF NOT EXISTS;

INSERT INTO railroads."Railroad" (id, name, "hqCity", "serviceArea", description, history, "mapLink", "hqaddress", homepage, abbreviation, active)
VALUES (35819552-c1bc-44c9-ba41-c07ac920d046, 'CSX', 'Jacksonville', 'US', '', '', 'https://en.wikipedia.org/wiki/File:CSX_Transportation_system_map.svg', '500 Water Street, 15th Floor Jacksonville, FL 32202','https://www.csx.com/','CSX', true) IF NOT EXISTS;

INSERT INTO railroads."Railroad" (id, name, "hqCity", "serviceArea", description, history, "mapLink", "hqaddress", homepage, abbreviation, active)
VALUES (892b6ecc-272c-4b71-b575-356fec9b9377, 'Kansas City Southern', 'Kansas City', 'US,MX', '', '', 'https://en.wikipedia.org/wiki/Kansas_City_Southern_(company)#/media/File:Kansas_City_Southern_Railway_system_map.svg', '427 W 12th St, Kansas City, MO 64105', 'https://www.kcsouthern.com/', 'KCS', true) IF NOT EXISTS;

INSERT INTO railroads."Railroad" (id, name, "hqCity", "serviceArea", description, history, "mapLink", "hqaddress", homepage, abbreviation, active)
VALUES (0fcc2e09-a3c1-4a50-9ce2-adce93e3eaba, 'Canadian National', 'Montreal', 'CA,US', '', '', 'https://upload.wikimedia.org/wikipedia/commons/7/78/Canadian_National_System_Map.PNG', '935 de La Gauchetière Street West, Montreal, Quebec, H3B 2M9','https://www.cn.ca/','CN', true) IF NOT EXISTS;

INSERT INTO railroads."Railroad" (id, name, "hqCity", "serviceArea", description, history, "mapLink", "hqaddress", homepage, abbreviation, active)
VALUES (35836bb3-d7a3-49c6-9b08-2a1baa369fe9, 'Canadian Pacific', 'Calgary', 'CA,US', '', '', 'https://en.wikipedia.org/wiki/Canadian_Pacific_Railway#/media/File:Canadian_Pacific_System_Railmap.PNG', '7550 Ogden Dale Road S.E.. Calgary, Alberta T2C 4X9 Canada','https://www.cpr.ca/','CP', true) IF NOT EXISTS;

INSERT INTO railroads."Railroad" (id, name, "hqCity", "serviceArea", description, history, "mapLink", "hqaddress", homepage, abbreviation, active)
VALUES (c924c7a4-13cb-415e-9dcd-db38b0b6548c, 'Sounder', 'Seattle', 'Seattle Metro', '', '', 'https://s3.amazonaws.com/nycsubway.org/images/maps/soundermap.gif', '401 S. Jackson St. Seattle, WA 98104','https://www.soundtransit.org/','', true) IF NOT EXISTS;

INSERT INTO railroads."Railroad" (id, name, "hqCity", "serviceArea", description, history, "mapLink", "hqaddress", homepage, abbreviation, active)
VALUES (4a60a6a6-e0bf-4e23-8624-cafdee006994, 'Caltrain', 'San Carlos', 'San Francisco Metro', 'Commuter rail service from San Francisco to Gilroy.', '', 'http://www.caltrain.com/Assets/maps/Caltrain+Zone+Map.png', '1250 San Carlos Ave, San Carlos, CA 94070','http://www.caltrain.com/','', true) IF NOT EXISTS;

INSERT INTO railroads."Railroad" (id, name, "hqCity", "serviceArea", description, history, "mapLink", "hqaddress", homepage, abbreviation, active)
VALUES (e586e8ff-9865-4df3-b336-71be8e285609, 'Metrolink', 'Los Angeles', 'Los Angeles Metro', '', '', 'https://en.wikipedia.org/wiki/List_of_Metrolink_(California)_stations#/media/File:Metrolink_California_map_to_scale.png', '800 N. Alameda St., Los Angeles, CA 90012','https://www.metrolinktrains.com/','', true) IF NOT EXISTS;

INSERT INTO railroads."Railroad" (id, name, "hqCity", "serviceArea", description, history, "mapLink", "hqaddress", homepage, abbreviation, active)
VALUES (dd8ee187-21d7-4572-b7d8-7df65ca040db, 'Coaster', 'Oceanside', 'San Diego Metro', 'San Diego Metro commuter rail.', '', 'https://en.wikipedia.org/wiki/Coaster_(commuter_rail)#/media/File:San_Diego_commuter_rail_map.png', '205 South Tremont Street, Oceanside, CA','https://gonctd.com/','NCTD', true) IF NOT EXISTS;

To view the data once it is entered, I just ran a quick SELECT * FROM railroads."Railroad". At this point I’ve got baseline list of railroads in the United States. Also for the baseline I’ve decided to add some well known passenger trains that have a routine consist, travel a known route, and can provide good examples for what a consist would be made up of. To put together a name train and its respective consist I need to populate several other tables with the pertinent information related ot the units within the consist and the types of units. For the initial set of named trains I’m going to enter, I’ve added the following unit types and units for building the initial train consists.

INSERT INTO railroads."UnitType" (id, name, description, "unitLoadType")
VALUES (db960405-dfa9-4010-b01a-2a0bbbfef27f,'Superliner Coach','62 seats upper level & 12 seats lower level.',{'passenger':'74'})  IF NOT EXISTS;

INSERT INTO railroads."UnitType" (id, name, description, "unitLoadType")
VALUES (cc38cc12-93dd-4975-a190-666001636411,'Superliner Coach','Amtrak California coach with 76 seats upper level & 20 seats lower level.',{'passenger':'96'})  IF NOT EXISTS;

INSERT INTO railroads."UnitType" (id, name, description, "unitLoadType")
VALUES (45ba7e8d-f954-45ba-a1f1-184eef21eebb,'Superliner Coach/Snack Bar','62 seats upper level & snack bar lower level.',{'passenger':'62'})  IF NOT EXISTS;

INSERT INTO railroads."UnitType" (id, name, description, "unitLoadType")
VALUES (77e57722-4186-4a74-9d6b-72e99a669944,'Superliner Coach/Baggage','78 seats upper level & baggage lower level.',{'passenger':'78'})  IF NOT EXISTS;

INSERT INTO railroads."UnitType" (id, name, description, "unitLoadType")
VALUES (aa1f0c6a-5bc4-4bff-8463-e5fbe4c4a753,'Superliner Dining','18 4-top Tables in the upper level with kitchen on the lower level.',{'passenger':'0'})  IF NOT EXISTS;

INSERT INTO railroads."UnitType" (id, name, description, "unitLoadType")
VALUES (94247de0-7f8f-41a0-b41d-9a330edd2c05,'Superliner Sightseer Lounge','8 4-top tables, 29 seats, and bar upper level, with 2 4-top tables, 2 large general seating tables, and snack bar lower level.',{'passenger':'0'})  IF NOT EXISTS;

INSERT INTO railroads."UnitType" (id, name, description, "unitLoadType")
VALUES (e82339ae-fabf-4467-8490-2302a728557a,'Superliner Sleeper','The standard Superliner sleeping car contains 14 roomettes, five bedrooms, a family bedroom, and an accessible bedroom.',{'passenger':'44'}) IF NOT EXISTS;

INSERT INTO railroads."UnitType" (id, name, description, "unitLoadType")
VALUES (69cc0e8b-b0a1-4899-aed4-e30cbf9e3098,'Superliner Deluxe Sleeper','The deluxe sleeping car contains ten bedrooms, four roomettes, a family bedroom, and an accessible bedroom.',{'passenger':'34'})  IF NOT EXISTS;

INSERT INTO railroads."UnitType" (id, name, description, "unitLoadType")
VALUES (e012517c-81be-4f48-9372-8c70912ac7ca,'Superliner Transition Sleeper','The transition is setup for crew and some overflow customer rooms with 17 roomettes.',{'passenger':'0'})  IF NOT EXISTS;

INSERT INTO railroads."UnitType" (id, name, description, "unitLoadType")
VALUES (7b1f0e4c-ca39-4f88-9424-412fca1e4299,'Pacific Parlour Car','8 plush lounge chairs, 2 inward seating areas (~6 people), 6 4-top tables, and bar kitchen upper level, 20 seat theater lower level.',{'passenger':'0'})  IF NOT EXISTS;

INSERT INTO railroads."UnitType" (id, name, description, "unitLoadType")
VALUES (3bd8c05d-7e23-4bba-b7b6-2e7ee29591b3,'Baggage','Baggage car for passenger trains.',{'passenger':'0'})  IF NOT EXISTS;

Now I’ve got the basic unit cars for the consist of most of Amtrak’s western fleet of trains. One more thing however, I need an engine for the model to work accurately. For this sample specifically I’m going to add the mainstay of the Amtrak fleet, the P42DC GENESIS.

INSERT INTO railroads."UnitType" (id, name, description, "unitLoadType")
VALUES (1995b4f2-5c93-4466-a54c-1d2838a587c2, 'P42DC GENESIS', 'The common power unit used by Amtrak. The GE P42DC is a ', {'power':'280.25 kN'});
Alright, that’s enough for today. You may note, if you’re big into 3NF or other normalization, that the data tables above are in various forms of normalization and denormalization. I’ll discuss the specific reasons and or some of the refactorings coming up more in subsequent blog entries as I get more of the work finished collecting this repository of data. To join me for live coding, data collection and more join me on [Twitch (Follow &&   Subscribe!)](https://twitch.tv/adronhall/) where I’ll be live coding the next steps of this progress. Also, subscribe to the blog here, the subscription button is over the left or right or somewhere depending on the device you’re viewing the blog entry with, and of course I’m always toiling about on Twitter @Adron.

WTF is “Developer Focused”?

I always hear a lot about companies being developer focused. Maybe it’s a bit of cynicism but I never expect much from this goal. Few companies have been effectively developer focused, they just dream of it. I asked myself recently, and would love others’ feedback. What exactly does it even mean to be developer focused?

What I Think of “Developer Focused”

When I think of developer focused organizations, the first organizations I think which actually have some type of grasp and effectively work toward this are open source software projects. Not particularly foundations or companies related to the projects, but the projects and the people involved with the core project themselves. These come to mind for several specific reasons.

  • Open Source Projects are easily identified as being developer focused since it is usually a group of developers building a project for others, usually developers, to use to build software for others, usually not developers, to use.
  • Open Source Projects have a self-determination among the group of developers writing the source code for it to be in a readable, usable state for other developers. This definitely fits into something I’d think of as developer focused.
  • When these projects get big enough they’re usually documented, written about on blogs and in articles from tech media, and talked about in many forums. By association of this process, this again first into my idea of what developer focused is.
  • At a certain time the developers and developer users of said projects often become advocates – sometimes staunch advocates – for their respective projects. This combined with the availability of source code truly makes a project developer focused.

The idea years ago that developers are the king makers of the industry has held true, and in large part this I’m confident is in correlation and partial causation of why open source software has become a prominent defacto approach to building solutions, for individuals and organizations.

With that said it makes logical sense that developers have gained this power, and that open source has become this defacto way to approach building solutions. However there are exceptions, let’s expand on this a bit and then refocus on this particular core association and get to a focal definition of what developer focused really means.

Expanding on the Idea of “Developer Focused”

From what I’ve ascertained so far developer focused I largely associate with effective open source projects. But this isn’t the only type of organization that can create solutions, projects, and related efforts that I think of as developer focused.

Let’s take Microsoft as an example. Love em’ or hate em’ as an entitiy, over the years they’ve focused heavily on various types of developers. For a time they almost killed off Apple entirely (if you don’t recall, Apple exists today because Microsoft saved them from going bankrupt!) by bing more dev focused and getting more apps built by devs for Windows. At least, that’s one aspect of the whole situation.

Microsoft has had, and continues today to focus on documentation and products that center around developers building applications; in yesteryear more around Windows OS and today mostly around building web applications like every other entitiy on the planet! Their focus includes things like IDE’s, helper libraries, entire frameworks, SDK’s, tons of documentation, and teams working continuously to refine and determine what would help developers the most in creating tomorrows applications and maintaining and improving todays applications.

Other companies, to various degrees have done this too. For a small company size example, check out HashiCorp. The company started at its origin from various open source projects and has expanded to make solutions for developers and systems operators easier to use. These include things like Terraform, Consul, Packer, and a number of others.

Developer Focused Definition

Thinking back on all these things, here’s what I’ve put together to define the ideal characteristics of a developer focused organization.

A developer focused organization has a priority to focus content, tooling, and related materials around the work developers to build, maintain, and operate software solutions. Key features of a developer focused organization.

  1. Marketing, developer relations, engineering, documentation, education, sales, and other arms of the company all focus on making communications easy with the developers of enterprises, small business, consumer, or related markets that the company wants to work with.
  2. Engineering (Part 1), or engineering groups have a focal place and priority within the organization to help marketing shape messaging, developer relations to provide effective and accurate content, documentation to be maintained and updated with accurate details, education to have effective means of knowledge transfer, sales to speak intelligently about products and services, and other needs as necessary.
  3. Sales isn’t, or shouldn’t be, focused on the proverbial “golf course” sales routine. The polo shirt wearing, cisgendered white male of privilege that got made fun of by jocks in the 80’s era is dying faster than a Wermacht SS Officer in the crosshairs of a GI Platoon Leader strapped with a Tommy Gun. Sales also needs to, which I’ve made ironic now, flip the approach to things. Get rid of the war metaphors (yeah, sorry, not sorry this line is after all meant for sales!) and speak specifically to product like you actually care about it and care about what developers are attempting to get built. Know it, understand it, hell, even whack at those keys and write up a demo or two yourself! This is developer focused sales.
  4. Marketing, stop having campaigns and study, understand, and gain knowledge about the places developers meet, code, and discuss solutions they need. Marketing needs to, when developer focused because an ardent consumer of all messaging of the organization and in itself a learning organization. Message and talk to developers in the places they organize online, in real life, and otherwise. Because developers yourself to some degree, understand the products, know what it is you’re actually messaging developers about. Refocus and come hang out with developers. If anything, communicate with, work, and coordinate specifically with developer relations as the lead and with senior or principal developer advocates for the go to market marketing messaging and such. Absolutely do not just work on marketing efforts in isolation! Communicate with the organization and with the community frequently!
  5. Engineering (Part 2) has a complex and often exhaustive, advanced, and intense communication with the rest of the company in a developer focused organization. After all, they’re building all the things that everybody else is working toward making developer focused for others to use! Yes, that means engineering needs a way to effectively communicate, and in many ways needs it’s own internal communications to manage the flow of status, product, services, and related information to all of the other departments. At the same time all regular development, maintenance, and operational needs of engineering have to continue onward without interuption.

I’m currently, and continuing to define what should be in this list. I’d greatly appreciate your input; opinions, hot takes, or whatever you’ve got I’d like to know! So leave a comment, tweet at me @Adron, chat at me via Twitch @adronhall message me on LinkedIn, or whatever way you’d like I’m open for input!