Semicolon&Sons produces programming screencasts depicting actual workflows in real-life codebases (instead of toy examples), using timeless technologies (instead of the latest fad frameworks), looking at tradeoffs (instead of silver bullets).
A key factor in reducing my coding time for Oxbridge Notes down to a few hours per month was adding comprehensive integration tests. Today I demonstrate how these tests work using the test-browser's NO HEADLESS mode, which lets you actually see the browser executing your tests. Next I show how to write such tests using tools like factories (touching on how I test tracking code). Following that, I show how to set up a continuous integration server (using docker containers), and how to run your CI tests locally to verify they work before pushing them to the cloud. Lastly, I finish with a discussion about what we should test, given limited testing budget.
In this third episode about data integrity, I talk about how to save your data such that computers have an easier time working with it (e.g. for filters), how to ensure that data stays valid by your own rules as you add increasing numbers of validations over the years, about avoiding the mistake of duplicating data across tables and needing to sync these records, about using database transactions to ensure that state changes to multiple rows either all occur or all fail as a unit (preventing invalid intermediate states from cropping up), and lastly about using cascades to ensure the deletion of associated records that should not exist when their 'parent' records are deleted.
Here I continue on from the last episode (null constraints, etc.) in exploring ways to use an SQL database to ensure data integrity. I'll show ways to avoid shooting yourself in the foot by setting non-existant relationships or by deleting rows that are referenced elsewhere in the database and are therefore necessary. I'll show how to lean on foreign keys to build resource allocation features with practically no backend code. Next I'll demonstrate the perils of relying on uniqueness validations at the Ruby/PHP/Python backend level. Finally I'll show to avoid bloat in pivot tables for many-to-many relationships.
Data is more important than code, therefore the most important job you, as a programmer, have is to design a system that allows for a simple, constrained, and predictable set of data. In this episode, I'll discuss how null constraints can reduce the number of types your program has to deal with, thereby simplifying your code. Then I discuss how
check constraints can force data to take a limited (and more useful) range of values. Lastly I'll explain why it's better to carry all this out at the database level rather than at the Ruby/Python/Php/JS level.
I demonstrate six ways of doing autocomplete in Vim: based on strings in the current buffer, functions in the codebase (using Universal Ctags), file names in your project, full lines in the buffer, dictionary words, and - last-but-not-least - any class/constant/function in your codebase using the Language Server Protocol (LSP).
This video continues where Part I left off. Here I talk about managing the limited Google crawl budget (by instructing it to ignore boring pages), preserving accrued SEO juice when users edit their own content on your website (or when you fix typos), getting into the Google Images game, dealing with shadowed content when two users create pages with the same name, and automated tools to audit your on-page SEO.
This episode goes through some of the strategies I used to get north of 200k monthly organic page views to my website. I'll cover picking keywords through Google Keyword Planner (and why it's important to build your code naming conventions around these), structured data (which increase CTRs on Google), and scalable mass-content creation - what I believe to be the best strategy for SEO both when I began in 2010 and ten years later when I released this screencast in 2020.
This episode showcases a grab-bag of features that developers accustomed to IDEs will appreciate in vim, such as how to execute the current file from within the editor, how to run tests related to the current function, how to integrate with git source control to stage and commit files, how to write and use code snippets, how to do syntax-aware commenting and uncommenting, and how to avail of automatic project-wide method name refactors using the LSP.
The ease of running
Our screencasts are aimed at intermediate and advanced programmers and focus on:
Mailing list members receive exclusive content as well as episode alerts. Never spam.