Cameron Yick
data vis engineer @datadoghq. currently into visual exaptation | creative (en)coding | metalearning | swimming. he/him
(Automatic Visualization of the Frontend)
Based on the cover graphic from Edward Tufte's Visual Display of Quantitative Information
git blame / CODEOWNERS
...graphical representations that facilitate spatial understanding of things...
- Harley & Woodward, History of Cartography
"Not only is it easy to lie with maps, it's essential...
To avoid hiding critical information in a fog of detail, the map must offer a selective, incomplete view of reality"
- Mark Monmonier, "How to Lie With Maps"
the ideal
abstraction level
is
situation specific.
Marine Map of Scandinavia: 1539
How can we keep the plan and the implementation in sync?
Data API
Container
View
Imported by
// data-service.js
export const fetchItems = async () => fetch('/api/items');
// List.jsx
import { formatItems } from './data-service';
const formatItems = (items) = items.map(formatItem);
export const List = (props) => {
return (
<div>
{formatItems(props.items)}
</div>
)
}
// ListContainer.jsx
import { fetchItems } from './data-service';
export const ListContainer = (props) => {
// pseudocode for data fetching
const items = await fetchItems();
return <List items={items}/>
}
data-api: *-service.js
container: *Container.jsx
view: *.jsx
Data API
Container
View
Matching
Missing
Unexpected
Added /people API
// data-service.js
export const fetchItems = async () => fetch('/api/items');
export const formatItems = (items) => items.map(item => processItem(item));
// Someone unfamiliar with project structure proposes a new change
export const fetchPeople = async () => fetch('/api/people');
// List.jsx
import { formatItems, fetchItems, fetchPeople } from './data-service';
export const List = (props) => {
const items = await fetchItems();
const people = await fetchPeople();
return (
<div>
{formatItems(items)}
{people}
</div>
)
}
// ListContainer.jsx
export const ListContainer = (props) => {
// some other code for logging, routing etc
return <List />
}
Data API
Container
View
Matching
Missing
Unexpected
Refactored
New import
How can we keep the plan and implementation in sync?
*without extra manual steps
github.com/ivanreese/visual-programming-codex
We don't have this for JS
(and this won't help our existing applications)
(Directed Acyclic Graphs)
A B
B "uses" A
Continent (Eurasia)
Country
Subnational (State, Province, County)
City
Neighborhood
Specific
Broader
UK (country) projected onto Texas (US State)
Imports (module/file)
Call graphs (function)
Dataflow (variable)
Specific
Abstract
const node = "file"
`Which ${node} might be affected
by changes to other ${node}s?`
npx arkit
See Github for Client/Server example
const node = "function"
`Which ${node} might be affected
by changes to other ${node}s?`
*Not necessarily DAG (Recursion / Loops)
Record of actual run (single path though tree)
(Python Pyan: Flask Example)
Have data, seeking visualization
const node = "variable"
`Which ${node} might be affected
by changes to other ${node}s?`
- Reposition/Highlight upstream / downstream
- Inspect runtime values
- Count recomputations (hotspots)
Automatic visual documentation
const pedestrianStates = {
initial: 'walk',
states: {
walk: {
on: {
PED_TIMER: 'wait'
}
},
wait: {
on: {
PED_TIMER: 'stop'
}
},
stop: {}
}
};
const lightMachine = Machine({
id: 'light',
initial: 'green',
states: {
green: {
on: {
TIMER: 'yellow'
}
},
yellow: {
on: {
TIMER: 'red'
}
},
red: {
on: {
TIMER: 'green'
},
...pedestrianStates
}
}
});
// via xstate docs page
See @DavidKPiano's XState Talks
light
green
timer -> yellow
yellow
timer -> red
red
walk
ped_timer -> wait
wait
ped_timer -> stop
stop
timer -> green
- Generate XState Code from YAML-like markup
- Auto-generated clickable diagram
1. Hairball -> Visual Search Mantra
2. Wayfinding -> Adding Data
Future: Biofabric / Hive Plots / Hyperbolic Tree / other non-mainstream layouts
Source: EagerEyes / It's Always Sunny in Philadelphia
- not a real Yoda quote
Source: AxisMaps
Source: Mapbox / Nathaniel Slaughter on Medium
Ben "Hyperlink" Schneiderman (The Eyes Have It, 1996)
Examining JSNetworkX + nteract
- information systems from architecture (signage)
- Help people to orient themselves
- Enhance understanding + experience of complex spaces
Weather
Flight Coverage
Reselect, Python Call Craph, FlameGraphs all do this
1. Pick a search tool
(grep, Sourcegraph, etc)
2. Pick a map
3. Combine them
JSNetworkx/src/algorithms
- Attributed to Marshall McLuhan
Looking forward to seeing pictures of your maps 🗺
(code related or otherwise)
Thank you!
Twitter: @hydrosquall
Pronouns: he/him
Demos/Resources: github.com/hydrosquall/code-maps-frontend
Datadog: We're hiring! (React/Typescript/WebGL/Go/Etc)
This page intentionally left blank. Please do not write on it.
By Cameron Yick
Visualization isn't just about charts. Developers spend most of their time trying to understand existing code, which often lacks documentation about design-level concepts. Handcrafted diagrams are useful but get out of date, and traditional code search only helps if you know what words to look for. We don't navigate the real world by examining every sector of a geographic map, so why should we scan code line-by-line? This talk will showcase the past, present, and future of visual tools for automatically generating maps of code, using inspiration from older typed languages and HCI research. https://conf.reactjs.org/event.html?hydrosquall
data vis engineer @datadoghq. currently into visual exaptation | creative (en)coding | metalearning | swimming. he/him