(draft; work in progress)
See also:
- Compilers
- Program analysis:
- Dynamic analysis - instrumentation, translation, sanitizers
(draft; work in progress)
See also:
Peter Naur's classic 1985 essay "Programming as Theory Building" argues that a program is not its source code. A program is a shared mental construct (he uses the word theory) that lives in the minds of the people who work on it. If you lose the people, you lose the program. The code is merely a written representation of the program, and it's lossy, so you can't reconstruct
type Reverse<A> = | |
`${A}` extends `${infer AH}${infer AT}` | |
? `${Reverse<AT>}${AH}` : A | |
type Digs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | |
type DigsNext<I = Digs, R = {}> = | |
I extends [infer Head, infer Next, ...infer Tail] |
type Reverse<A> = | |
`${A}` extends `${infer AH}${infer AT}` | |
? `${Reverse<AT>}${AH}` : A | |
type Digs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | |
type DigsNext<I = Digs, R = {}> = | |
I extends [infer Head, infer Next, ...infer Tail] | |
? DigsNext<[Next, ...Tail], R & Record<Head, Next>> | |
: { [K in keyof R]: R[K] } |
2019 update: this essay has been updated on my personal site, together with a followup on how to get started
2020 update: I'm now writing a book with updated versions of all these essays and 35 other chapters!!!!
If there's a golden rule, it's this one, so I put it first. All the other rules are more or less elaborations of this rule #1.
You already know that you will never be done learning. But most people "learn in private", and lurk. They consume content without creating any themselves. Again, that's fine, but we're here to talk about being in the top quintile. What you do here is to have a habit of creating learning exhaust. Write blogs and tutorials and cheatsheets. Speak at meetups and conferences. Ask and answer things on Stackoverflow or Reddit. (Avoid the walled gardens like Slack and Discourse, they're not public). Make Youtube videos
Currently considering https://github.com/webdriverio/webdrivercss
Core Goals:
const { concat, mapKeys, merge, uniq } = require('lodash'); | |
/** | |
* Tweaked from original by Mike Engel | |
* https://github.com/jantimon/html-webpack-plugin/issues/782#issuecomment-331229728 | |
* | |
* Use this with multiple Webpack configurations that generate different builds | |
* for modern and legacy browsers. But use the same instance of the plugin in both configurations. | |
* | |
* It keeps track of assets seen in each build configuration, and appends script tags for |
/** | |
* This is a simple script for detecting conflicting | |
* version ranges across packages inside a mono repository. | |
*/ | |
import fs from "fs"; | |
import glob from "glob"; // yarn add -W -E -E -D glob@7.1.6 | |
import { promisify } from "util"; | |
const globP = promisify(glob); |
const fsp = require("fs").promises; | |
const path = require("path"); | |
const { execSync } = require("child_process"); | |
const chalk = require("chalk"); | |
const Confirm = require("prompt-confirm"); | |
const jsonfile = require("jsonfile"); | |
const semver = require("semver"); | |
const packagesDir = path.resolve(__dirname, "../packages"); |
import { promises } from "fs"; | |
import crypto from "crypto"; | |
import path from "path"; | |
import { print, parse } from "graphql"; | |
const plugin = { | |
name: "relay", | |
setup: build => { | |
build.onLoad({ filter: /\.tsx$/, namespace: "" }, async args => { | |
let contents = await promises.readFile(args.path, "utf8"); |