SlideShare a Scribd company logo
1 of 22
Download to read offline
Oral tradition in software engineering:
Passing the craft across generations
CTO
bryan@joyent.com
Bryan Cantrill
@bcantrill
Oral tradition
• Long before humans developed systems of writing, we were
leaving legacies of information via oral tradition
• Oral tradition has been used to:
• Preserve and explain cultural values
• Convey skills and wisdom
• Entertain as well as enlighten
• Oral tradition continues to play an important role in post-
literate societies — including in software engineering
Oral tradition in software engineering
• In the beginning, software was subservient to hardware
• Software rarely enjoyed the levels of design documentation
found in computer design
• Like true oral tradition, it relied primarily upon oral
retransmission — and much of this is lost today
• Fred Brooks’ Mythical Man Month captures the tribal wisdom
of this antediluvian era of software
Oral literature
• When oral tradition is distilled into clear narrative and reliably
repeated, it becomes oral literature
• For us in software engineering, the early Internet allowed a
way to reliably share stories via USENET
• USENET is filled with incredible and interesting narrative, but
most survives only in archive
• But one story from USENET does survive — and it has
become the epic of software engineering…
Our epic, as penned by Ed Nather
A recent article devoted to the macho side of programming
made the bald and unvarnished statement:
Real Programmers write in FORTRAN.
Maybe they do now,
in this decadent era of
Lite beer, hand calculators, and “user-friendly” software
but back in the Good Old Days,
when the term “software” sounded funny
and Real Computers were made out of drums and vacuum tubes,
Real Programmers wrote in machine code.
Not FORTRAN. Not RATFOR. Not, even, assembly language.
Machine Code.
Raw, unadorned, inscrutable hexadecimal numbers.
Directly.
…and our epic hero, Mel Kaye
Lest a whole new generation of programmers
grow up in ignorance of this glorious past,
I feel duty-bound to describe,
as best I can through the generation gap,
how a Real Programmer wrote code.
I'll call him Mel,
because that was his name.
Our Odyssey
• The Story of Mel was recorded in the early 1980s, but dates
from the earliest days of software in the 1960s
• Another set of stories recorded in the late 1970s at Data
General has become software engineering lore…
• Tracy Kidder’s Soul of a New Machine has wisdom that has
long survived the team and company it describes
• If Mel is our Illiad, Soul is our Odyssey
The 1980s and 1990s
• In the deeply proprietary era of the 1980s and 1990s, oral
tradition was locked on proprietary islands — tribes privately
passed on their own traditions and practices
• Collections of oral tradition like sgi.badattitude were the stuff
of legend — but they too have been lost
• The canonical folklore from this era may be John Browne’s
beautiful The Bug Count Also Rises, the winner of an internal
Microsoft Hemingway parody contest (!)
Dawn of a new era: November 7, 2005
Oral tradition post-YouTube
• With the rise of Internet video, story — orally delivered and
aurally received — could travel unencumbered
• Stories could be suddenly retold simply by sharing a link —
with all of the force and authority of the original
• Oral tradition can spread so quickly, we explain it in terms of a
pandemic: stories that become viral
• We in software were particularly lucky in that Google Tech
Talks managed to capture much oral history and tradition
before participants recognized what it meant to be recorded
For me personally, a watershed
For me personally, a watershed (ahem!)
DTrace Review
Oral tradition post-YouTube
• Post-YouTube, our oral tradition is suffering from overload —
we have an embarrassment of riches!
• The true oral tradition has shifted from the content to the
meta-content, e.g. this evergreen topic on HN:
Oral tradition closer to home
• Every source base is awash in narrative: of origin, of struggle,
of conflict, of rewrite, of success and of failure
• These narratives ultimately convey not only the history but
also the values of a source base
• In the proprietary era, these were purely oral tradition —
something to regale new hires with over lunch
• Every source base is loaded with these; several that are
relevant to mine… (UNIX Unix 6th Edition 7th Edition SunOS
System III SVR4 Solaris OpenSolaris illumos/SmartOS!)
I: The untimely death of Joe Ossanna
• In 1973, Joe Ossanna at Bell Labs wrote troff in PDP-11
assembler for the Graphic Systems CAT typesetter
• In 1975, Ossanna ported it to C — with the intent of a later
clean rewrite to make the macro language less alien
• In 1977, Ossanna died suddenly, of either a heart attack, a
car accident or (most graphically) being struck by a car
• The code he left behind — which remains in our source base
— is inscrutable; Brian Kernighan failed to rewrite it!
• Code survives us
II: “You are not expected to understand this”
• Perhaps the most (in)famous comment in Sixth Edition:





/*

* If the new process paused because it was

* swapped out, set the stack level to the last call

* to savu(u_ssav). This means that the return

* which is executed immediately after the call to aretu

* actually returns from the last routine which did

* the savu.

*

* You are not expected to understand this.

*/

if(rp->p_flag&SSWAP) {

rp->p_flag =& ~SSWAP;

aretu(u.u_ssav);

}
• That which we can’t explain, we don’t understand!
III: Logical XOR
• I have always been enraged disappointed by C’s lack of
logical XOR, having had a hard time holding my tongue, e.g.:





/*

* Logical XOR, where are you?

*/

ASSERT((vstate->dtvs_nglobals == 0) ^ (vstate->dtvs_globals != NULL));
• I became involved in a heated argument with Roger Faulkner,
who insisted that Dennis didn’t add logical XOR because “it
can’t short-circuit” — which is obviously stupid
• Important difference between Roger and me: Roger had
worked at Bell Labs with Dennis…
III: “Isn’t that much worse to write” (!)
From dmr@plan9.bell-labs.com Sun Aug 6 23:33:54 2000

To: roger.Faulkner@eng.sun.com

Subject: Re: history question



Hi Roger,



back from some vacation; here's a belated response.

^^ was omitted because it is of little use, particularly

because the "shortcut evaluation" guaranteed for || and &&

doesn't help--both sides have to be evaluated no

matter what. When you do need the effect,

(A!=0) ^ (B!=0) isn't that much worse to write.



Dennis
IV: “You think this is cheesy?”
• A favorite comment in the operating system is one that Jeff
Bonwick and I wrote together in a moment of crisis
• We had (finally!) figured a narrow path by which we could
solve a devastating problem that seemed insurmountable
• The details are highly technical, but documented thoroughly
in code comments — the context around it in an abstruse
chapter I wrote in Beautiful Code…
IV: “You think this is cheesy?”
/*
* The turnstile hash table is partitioned into two halves: the lower half
* is used for upimutextab[] locks, the upper half for everything else.
* The reason for the distinction is that SOBJ_USER_PI locks present a
* unique problem: the upimutextab[] lock passed to turnstile_block()
* cannot be dropped until the calling thread has blocked on its
* SOBJ_USER_PI lock and willed its priority down the blocking chain.
* At that point, the caller's t_lockp will be one of the turnstile locks.
* If mutex_exit() discovers that the upimutextab[] lock has waiters, it
* must wake them, which forces a lock ordering on us: the turnstile lock
* for the upimutextab[] lock will be acquired in mutex_vector_exit(),
* which will eventually call into turnstile_pi_waive(), which will then
* acquire the caller's thread lock, which in this case is the turnstile
* lock for the SOBJ_USER_PI lock. In general, when two turnstile locks
* must be held at the same time, the lock order must be the address order.
* Therefore, to prevent deadlock in turnstile_pi_waive(), we must ensure
* that upimutextab[] locks *always* hash to lower addresses than any
* other locks. You think this is cheesy? Let's see you do better.
*/
Code comments as oral tradition?
• The best comments seem to have an aspect of oral tradition
to them: they not only serve to explain what is going on, but
provide a narrative as to why
• Comments live with the code but do not otherwise affect its
correctness — allowing for broad scope and artistic license
• Relevant, correct software systems will survive long past their
creators; comments are the art within the timeless machine
• Comments are how we speak to future generations!
Oral tradition in software engineering
• Software engineering has changed radically in the last
decade: it’s now open, transparent and distributed
• This has forced a revolution in oral tradition, which has
increasingly become recorded, yielding oral literature
• Oral literature allows us to expose and preserve the narrative
behind the artifact — to explain the why of the thing
• Software engineering teams should be encouraged to record
their oral tradition: it attracts technologists who share values!
• Our oral tradition is part of our legacy to future generations!

More Related Content

What's hot

Debugging (Docker) containers in production
Debugging (Docker) containers in productionDebugging (Docker) containers in production
Debugging (Docker) containers in productionbcantrill
 
The Internet-of-things: Architecting for the deluge of data
The Internet-of-things: Architecting for the deluge of dataThe Internet-of-things: Architecting for the deluge of data
The Internet-of-things: Architecting for the deluge of databcantrill
 
Joyent circa 2006 (Scale with Rails)
Joyent circa 2006 (Scale with Rails)Joyent circa 2006 (Scale with Rails)
Joyent circa 2006 (Scale with Rails)bcantrill
 
The Container Revolution: Reflections after the first decade
The Container Revolution: Reflections after the first decadeThe Container Revolution: Reflections after the first decade
The Container Revolution: Reflections after the first decadebcantrill
 
node.js and Containers: Dispatches from the Frontier
node.js and Containers: Dispatches from the Frontiernode.js and Containers: Dispatches from the Frontier
node.js and Containers: Dispatches from the Frontierbcantrill
 
Principles of Technology Leadership
Principles of Technology LeadershipPrinciples of Technology Leadership
Principles of Technology Leadershipbcantrill
 
No Moore Left to Give: Enterprise Computing After Moore's Law
No Moore Left to Give: Enterprise Computing After Moore's LawNo Moore Left to Give: Enterprise Computing After Moore's Law
No Moore Left to Give: Enterprise Computing After Moore's Lawbcantrill
 
Platform values, Rust, and the implications for system software
Platform values, Rust, and the implications for system softwarePlatform values, Rust, and the implications for system software
Platform values, Rust, and the implications for system softwarebcantrill
 
Visualizing Systems with Statemaps
Visualizing Systems with StatemapsVisualizing Systems with Statemaps
Visualizing Systems with Statemapsbcantrill
 
Open stack private cloud panel
Open stack private cloud panelOpen stack private cloud panel
Open stack private cloud panellaurabeckcahoon
 
The Reactive Principles: Design Principles For Cloud Native Applications
The Reactive Principles: Design Principles For Cloud Native ApplicationsThe Reactive Principles: Design Principles For Cloud Native Applications
The Reactive Principles: Design Principles For Cloud Native ApplicationsJonas Bonér
 
Accidental Architecture 0.9
Accidental Architecture 0.9Accidental Architecture 0.9
Accidental Architecture 0.9Mark Cathcart
 
Your Goat Anti-Fragiled My Snowflake! Demystifying DevOps Jargon (30 minute v...
Your Goat Anti-Fragiled My Snowflake! Demystifying DevOps Jargon (30 minute v...Your Goat Anti-Fragiled My Snowflake! Demystifying DevOps Jargon (30 minute v...
Your Goat Anti-Fragiled My Snowflake! Demystifying DevOps Jargon (30 minute v...Clinton Wolfe
 

What's hot (15)

Debugging (Docker) containers in production
Debugging (Docker) containers in productionDebugging (Docker) containers in production
Debugging (Docker) containers in production
 
The Internet-of-things: Architecting for the deluge of data
The Internet-of-things: Architecting for the deluge of dataThe Internet-of-things: Architecting for the deluge of data
The Internet-of-things: Architecting for the deluge of data
 
Joyent circa 2006 (Scale with Rails)
Joyent circa 2006 (Scale with Rails)Joyent circa 2006 (Scale with Rails)
Joyent circa 2006 (Scale with Rails)
 
The Container Revolution: Reflections after the first decade
The Container Revolution: Reflections after the first decadeThe Container Revolution: Reflections after the first decade
The Container Revolution: Reflections after the first decade
 
node.js and Containers: Dispatches from the Frontier
node.js and Containers: Dispatches from the Frontiernode.js and Containers: Dispatches from the Frontier
node.js and Containers: Dispatches from the Frontier
 
Principles of Technology Leadership
Principles of Technology LeadershipPrinciples of Technology Leadership
Principles of Technology Leadership
 
No Moore Left to Give: Enterprise Computing After Moore's Law
No Moore Left to Give: Enterprise Computing After Moore's LawNo Moore Left to Give: Enterprise Computing After Moore's Law
No Moore Left to Give: Enterprise Computing After Moore's Law
 
Platform values, Rust, and the implications for system software
Platform values, Rust, and the implications for system softwarePlatform values, Rust, and the implications for system software
Platform values, Rust, and the implications for system software
 
Xen Directions Intro Slides
Xen Directions Intro SlidesXen Directions Intro Slides
Xen Directions Intro Slides
 
Visualizing Systems with Statemaps
Visualizing Systems with StatemapsVisualizing Systems with Statemaps
Visualizing Systems with Statemaps
 
Open stack private cloud panel
Open stack private cloud panelOpen stack private cloud panel
Open stack private cloud panel
 
The Reactive Principles: Design Principles For Cloud Native Applications
The Reactive Principles: Design Principles For Cloud Native ApplicationsThe Reactive Principles: Design Principles For Cloud Native Applications
The Reactive Principles: Design Principles For Cloud Native Applications
 
Accidental Architecture 0.9
Accidental Architecture 0.9Accidental Architecture 0.9
Accidental Architecture 0.9
 
Your Goat Anti-Fragiled My Snowflake! Demystifying DevOps Jargon (30 minute v...
Your Goat Anti-Fragiled My Snowflake! Demystifying DevOps Jargon (30 minute v...Your Goat Anti-Fragiled My Snowflake! Demystifying DevOps Jargon (30 minute v...
Your Goat Anti-Fragiled My Snowflake! Demystifying DevOps Jargon (30 minute v...
 
Dmk shmoo2007
Dmk shmoo2007Dmk shmoo2007
Dmk shmoo2007
 

Viewers also liked

Papers We Love: Jails and Zones
Papers We Love: Jails and ZonesPapers We Love: Jails and Zones
Papers We Love: Jails and Zonesbcantrill
 
Leadership Without Management: Scaling Organizations by Scaling Engineers
Leadership Without Management: Scaling Organizations by Scaling EngineersLeadership Without Management: Scaling Organizations by Scaling Engineers
Leadership Without Management: Scaling Organizations by Scaling Engineersbcantrill
 
The Peril and Promise of Early Adoption: Arriving 10 Years Early to Containers
The Peril and Promise of Early Adoption: Arriving 10 Years Early to ContainersThe Peril and Promise of Early Adoption: Arriving 10 Years Early to Containers
The Peril and Promise of Early Adoption: Arriving 10 Years Early to Containersbcantrill
 
The DIY Punk Rock DevOps Playbook
The DIY Punk Rock DevOps PlaybookThe DIY Punk Rock DevOps Playbook
The DIY Punk Rock DevOps Playbookbcantrill
 
Run containers on bare metal already!
Run containers on bare metal already!Run containers on bare metal already!
Run containers on bare metal already!bcantrill
 
A crime against common sense
A crime against common senseA crime against common sense
A crime against common sensebcantrill
 
Leaping the chasm from proprietary to open: A survivor's guide
Leaping the chasm from proprietary to open: A survivor's guideLeaping the chasm from proprietary to open: A survivor's guide
Leaping the chasm from proprietary to open: A survivor's guidebcantrill
 
Software Architectures, Week 2 - Decomposition techniques
Software Architectures, Week 2 - Decomposition techniquesSoftware Architectures, Week 2 - Decomposition techniques
Software Architectures, Week 2 - Decomposition techniquesAngelos Kapsimanis
 
Application resiliency using netflix hystrix
Application resiliency using netflix hystrixApplication resiliency using netflix hystrix
Application resiliency using netflix hystrixSenthilkumar Gopal
 
Concepts of React
Concepts of ReactConcepts of React
Concepts of Reactinovex GmbH
 
Docker's Killer Feature: The Remote API
Docker's Killer Feature: The Remote APIDocker's Killer Feature: The Remote API
Docker's Killer Feature: The Remote APIbcantrill
 
Hands-on Hystrix - Best Practices und Stolperfallen
Hands-on Hystrix - Best Practices und StolperfallenHands-on Hystrix - Best Practices und Stolperfallen
Hands-on Hystrix - Best Practices und Stolperfalleninovex GmbH
 

Viewers also liked (13)

Papers We Love: Jails and Zones
Papers We Love: Jails and ZonesPapers We Love: Jails and Zones
Papers We Love: Jails and Zones
 
Leadership Without Management: Scaling Organizations by Scaling Engineers
Leadership Without Management: Scaling Organizations by Scaling EngineersLeadership Without Management: Scaling Organizations by Scaling Engineers
Leadership Without Management: Scaling Organizations by Scaling Engineers
 
The Peril and Promise of Early Adoption: Arriving 10 Years Early to Containers
The Peril and Promise of Early Adoption: Arriving 10 Years Early to ContainersThe Peril and Promise of Early Adoption: Arriving 10 Years Early to Containers
The Peril and Promise of Early Adoption: Arriving 10 Years Early to Containers
 
The DIY Punk Rock DevOps Playbook
The DIY Punk Rock DevOps PlaybookThe DIY Punk Rock DevOps Playbook
The DIY Punk Rock DevOps Playbook
 
Run containers on bare metal already!
Run containers on bare metal already!Run containers on bare metal already!
Run containers on bare metal already!
 
A crime against common sense
A crime against common senseA crime against common sense
A crime against common sense
 
Leaping the chasm from proprietary to open: A survivor's guide
Leaping the chasm from proprietary to open: A survivor's guideLeaping the chasm from proprietary to open: A survivor's guide
Leaping the chasm from proprietary to open: A survivor's guide
 
Software Architectures, Week 2 - Decomposition techniques
Software Architectures, Week 2 - Decomposition techniquesSoftware Architectures, Week 2 - Decomposition techniques
Software Architectures, Week 2 - Decomposition techniques
 
Application resiliency using netflix hystrix
Application resiliency using netflix hystrixApplication resiliency using netflix hystrix
Application resiliency using netflix hystrix
 
Concepts of React
Concepts of ReactConcepts of React
Concepts of React
 
Docker's Killer Feature: The Remote API
Docker's Killer Feature: The Remote APIDocker's Killer Feature: The Remote API
Docker's Killer Feature: The Remote API
 
Hands-on Hystrix - Best Practices und Stolperfallen
Hands-on Hystrix - Best Practices und StolperfallenHands-on Hystrix - Best Practices und Stolperfallen
Hands-on Hystrix - Best Practices und Stolperfallen
 
Testing Microservices
Testing MicroservicesTesting Microservices
Testing Microservices
 

Similar to Oral tradition in software engineering: Passing the craft across generations

Scylla Summit 2022: Predicting the Past
Scylla Summit 2022: Predicting the PastScylla Summit 2022: Predicting the Past
Scylla Summit 2022: Predicting the PastScyllaDB
 
Chapter_3_Cyberlanguage.pptx
Chapter_3_Cyberlanguage.pptxChapter_3_Cyberlanguage.pptx
Chapter_3_Cyberlanguage.pptxssuser80511a
 
Predicting the Present
Predicting the PresentPredicting the Present
Predicting the Presentbcantrill
 
Kernel Development: Drawing Lessons from "Mistakes" (Japan Linux Symposium 2009)
Kernel Development: Drawing Lessons from "Mistakes" (Japan Linux Symposium 2009)Kernel Development: Drawing Lessons from "Mistakes" (Japan Linux Symposium 2009)
Kernel Development: Drawing Lessons from "Mistakes" (Japan Linux Symposium 2009)Toshiharu Harada, Ph.D
 
Watch Your Language! - What my Mother Taught Me about Being an Engineer.
Watch Your Language! - What my Mother Taught Me about Being an Engineer.Watch Your Language! - What my Mother Taught Me about Being an Engineer.
Watch Your Language! - What my Mother Taught Me about Being an Engineer.Neal Richardson Sr
 
2007 amazon as hub of world brain final-6.51
2007 amazon as hub of world brain final-6.512007 amazon as hub of world brain final-6.51
2007 amazon as hub of world brain final-6.51Robert David Steele Vivas
 
2016 bioinformatics i_python_part_1_wim_vancriekinge
2016 bioinformatics i_python_part_1_wim_vancriekinge2016 bioinformatics i_python_part_1_wim_vancriekinge
2016 bioinformatics i_python_part_1_wim_vancriekingeProf. Wim Van Criekinge
 
The Language of ICT (or How ICT has changed language.)
The Language of ICT (or How ICT has changed language.)The Language of ICT (or How ICT has changed language.)
The Language of ICT (or How ICT has changed language.)Michael Coghlan
 
Immigration to Confluence: A Journey Through Foreign Customs
Immigration to Confluence: A Journey Through Foreign CustomsImmigration to Confluence: A Journey Through Foreign Customs
Immigration to Confluence: A Journey Through Foreign CustomsAtlassian
 
Kernel Development: Drawing Lessons From "Mistakes" (Japan Linux Symposium 2009)
Kernel Development: Drawing Lessons From "Mistakes" (Japan Linux Symposium 2009)Kernel Development: Drawing Lessons From "Mistakes" (Japan Linux Symposium 2009)
Kernel Development: Drawing Lessons From "Mistakes" (Japan Linux Symposium 2009)guest40cf23
 
Atlassian Summit 2012 - Immigration to Confluence: A Journey Through Foreign ...
Atlassian Summit 2012 - Immigration to Confluence: A Journey Through Foreign ...Atlassian Summit 2012 - Immigration to Confluence: A Journey Through Foreign ...
Atlassian Summit 2012 - Immigration to Confluence: A Journey Through Foreign ...Atlassian
 
The Coming Firmware Revolution
The Coming Firmware RevolutionThe Coming Firmware Revolution
The Coming Firmware Revolutionbcantrill
 
Unix++: Plan 9 from Bell Labs
Unix++: Plan 9 from Bell LabsUnix++: Plan 9 from Bell Labs
Unix++: Plan 9 from Bell LabsAnant Narayanan
 
3-in-1 talk on Serverless Chatbots, Alexa skills & Voice UI best practices (t...
3-in-1 talk on Serverless Chatbots, Alexa skills & Voice UI best practices (t...3-in-1 talk on Serverless Chatbots, Alexa skills & Voice UI best practices (t...
3-in-1 talk on Serverless Chatbots, Alexa skills & Voice UI best practices (t...Daniel Zivkovic
 
Building a Neural Machine Translation System From Scratch
Building a Neural Machine Translation System From ScratchBuilding a Neural Machine Translation System From Scratch
Building a Neural Machine Translation System From ScratchNatasha Latysheva
 

Similar to Oral tradition in software engineering: Passing the craft across generations (20)

Scylla Summit 2022: Predicting the Past
Scylla Summit 2022: Predicting the PastScylla Summit 2022: Predicting the Past
Scylla Summit 2022: Predicting the Past
 
Chapter_3_Cyberlanguage.pptx
Chapter_3_Cyberlanguage.pptxChapter_3_Cyberlanguage.pptx
Chapter_3_Cyberlanguage.pptx
 
Predicting the Present
Predicting the PresentPredicting the Present
Predicting the Present
 
Evolution of Programming Languages.pdf
Evolution of Programming Languages.pdfEvolution of Programming Languages.pdf
Evolution of Programming Languages.pdf
 
Evolution of Programming Languages.pdf
Evolution of Programming Languages.pdfEvolution of Programming Languages.pdf
Evolution of Programming Languages.pdf
 
Kernel Development: Drawing Lessons from "Mistakes" (Japan Linux Symposium 2009)
Kernel Development: Drawing Lessons from "Mistakes" (Japan Linux Symposium 2009)Kernel Development: Drawing Lessons from "Mistakes" (Japan Linux Symposium 2009)
Kernel Development: Drawing Lessons from "Mistakes" (Japan Linux Symposium 2009)
 
Watch Your Language! - What my Mother Taught Me about Being an Engineer.
Watch Your Language! - What my Mother Taught Me about Being an Engineer.Watch Your Language! - What my Mother Taught Me about Being an Engineer.
Watch Your Language! - What my Mother Taught Me about Being an Engineer.
 
2007 amazon as hub of world brain final-6.51
2007 amazon as hub of world brain final-6.512007 amazon as hub of world brain final-6.51
2007 amazon as hub of world brain final-6.51
 
2016 bioinformatics i_python_part_1_wim_vancriekinge
2016 bioinformatics i_python_part_1_wim_vancriekinge2016 bioinformatics i_python_part_1_wim_vancriekinge
2016 bioinformatics i_python_part_1_wim_vancriekinge
 
51. keyboards
51. keyboards51. keyboards
51. keyboards
 
The Language of ICT (or How ICT has changed language.)
The Language of ICT (or How ICT has changed language.)The Language of ICT (or How ICT has changed language.)
The Language of ICT (or How ICT has changed language.)
 
Immigration to Confluence: A Journey Through Foreign Customs
Immigration to Confluence: A Journey Through Foreign CustomsImmigration to Confluence: A Journey Through Foreign Customs
Immigration to Confluence: A Journey Through Foreign Customs
 
P1 2017 python
P1 2017 pythonP1 2017 python
P1 2017 python
 
Kernel Development: Drawing Lessons From "Mistakes" (Japan Linux Symposium 2009)
Kernel Development: Drawing Lessons From "Mistakes" (Japan Linux Symposium 2009)Kernel Development: Drawing Lessons From "Mistakes" (Japan Linux Symposium 2009)
Kernel Development: Drawing Lessons From "Mistakes" (Japan Linux Symposium 2009)
 
Atlassian Summit 2012 - Immigration to Confluence: A Journey Through Foreign ...
Atlassian Summit 2012 - Immigration to Confluence: A Journey Through Foreign ...Atlassian Summit 2012 - Immigration to Confluence: A Journey Through Foreign ...
Atlassian Summit 2012 - Immigration to Confluence: A Journey Through Foreign ...
 
The Coming Firmware Revolution
The Coming Firmware RevolutionThe Coming Firmware Revolution
The Coming Firmware Revolution
 
Unix++: Plan 9 from Bell Labs
Unix++: Plan 9 from Bell LabsUnix++: Plan 9 from Bell Labs
Unix++: Plan 9 from Bell Labs
 
3-in-1 talk on Serverless Chatbots, Alexa skills & Voice UI best practices (t...
3-in-1 talk on Serverless Chatbots, Alexa skills & Voice UI best practices (t...3-in-1 talk on Serverless Chatbots, Alexa skills & Voice UI best practices (t...
3-in-1 talk on Serverless Chatbots, Alexa skills & Voice UI best practices (t...
 
Building a Neural Machine Translation System From Scratch
Building a Neural Machine Translation System From ScratchBuilding a Neural Machine Translation System From Scratch
Building a Neural Machine Translation System From Scratch
 
Speech Recognition System
Speech Recognition SystemSpeech Recognition System
Speech Recognition System
 

More from bcantrill

Sharpening the Axe: The Primacy of Toolmaking
Sharpening the Axe: The Primacy of ToolmakingSharpening the Axe: The Primacy of Toolmaking
Sharpening the Axe: The Primacy of Toolmakingbcantrill
 
Coming of Age: Developing young technologists without robbing them of their y...
Coming of Age: Developing young technologists without robbing them of their y...Coming of Age: Developing young technologists without robbing them of their y...
Coming of Age: Developing young technologists without robbing them of their y...bcantrill
 
I have come to bury the BIOS, not to open it: The need for holistic systems
I have come to bury the BIOS, not to open it: The need for holistic systemsI have come to bury the BIOS, not to open it: The need for holistic systems
I have come to bury the BIOS, not to open it: The need for holistic systemsbcantrill
 
Towards Holistic Systems
Towards Holistic SystemsTowards Holistic Systems
Towards Holistic Systemsbcantrill
 
Hardware/software Co-design: The Coming Golden Age
Hardware/software Co-design: The Coming Golden AgeHardware/software Co-design: The Coming Golden Age
Hardware/software Co-design: The Coming Golden Agebcantrill
 
Tockilator: Deducing Tock execution flows from Ibex Verilator traces
Tockilator: Deducing Tock execution flows from Ibex Verilator tracesTockilator: Deducing Tock execution flows from Ibex Verilator traces
Tockilator: Deducing Tock execution flows from Ibex Verilator tracesbcantrill
 
Andreessen's Corollary: Ethical Dilemmas in Software Engineering
Andreessen's Corollary: Ethical Dilemmas in Software EngineeringAndreessen's Corollary: Ethical Dilemmas in Software Engineering
Andreessen's Corollary: Ethical Dilemmas in Software Engineeringbcantrill
 
Is it time to rewrite the operating system in Rust?
Is it time to rewrite the operating system in Rust?Is it time to rewrite the operating system in Rust?
Is it time to rewrite the operating system in Rust?bcantrill
 
dtrace.conf(16): DTrace state of the union
dtrace.conf(16): DTrace state of the uniondtrace.conf(16): DTrace state of the union
dtrace.conf(16): DTrace state of the unionbcantrill
 
The Hurricane's Butterfly: Debugging pathologically performing systems
The Hurricane's Butterfly: Debugging pathologically performing systemsThe Hurricane's Butterfly: Debugging pathologically performing systems
The Hurricane's Butterfly: Debugging pathologically performing systemsbcantrill
 
Papers We Love: ARC after dark
Papers We Love: ARC after darkPapers We Love: ARC after dark
Papers We Love: ARC after darkbcantrill
 

More from bcantrill (11)

Sharpening the Axe: The Primacy of Toolmaking
Sharpening the Axe: The Primacy of ToolmakingSharpening the Axe: The Primacy of Toolmaking
Sharpening the Axe: The Primacy of Toolmaking
 
Coming of Age: Developing young technologists without robbing them of their y...
Coming of Age: Developing young technologists without robbing them of their y...Coming of Age: Developing young technologists without robbing them of their y...
Coming of Age: Developing young technologists without robbing them of their y...
 
I have come to bury the BIOS, not to open it: The need for holistic systems
I have come to bury the BIOS, not to open it: The need for holistic systemsI have come to bury the BIOS, not to open it: The need for holistic systems
I have come to bury the BIOS, not to open it: The need for holistic systems
 
Towards Holistic Systems
Towards Holistic SystemsTowards Holistic Systems
Towards Holistic Systems
 
Hardware/software Co-design: The Coming Golden Age
Hardware/software Co-design: The Coming Golden AgeHardware/software Co-design: The Coming Golden Age
Hardware/software Co-design: The Coming Golden Age
 
Tockilator: Deducing Tock execution flows from Ibex Verilator traces
Tockilator: Deducing Tock execution flows from Ibex Verilator tracesTockilator: Deducing Tock execution flows from Ibex Verilator traces
Tockilator: Deducing Tock execution flows from Ibex Verilator traces
 
Andreessen's Corollary: Ethical Dilemmas in Software Engineering
Andreessen's Corollary: Ethical Dilemmas in Software EngineeringAndreessen's Corollary: Ethical Dilemmas in Software Engineering
Andreessen's Corollary: Ethical Dilemmas in Software Engineering
 
Is it time to rewrite the operating system in Rust?
Is it time to rewrite the operating system in Rust?Is it time to rewrite the operating system in Rust?
Is it time to rewrite the operating system in Rust?
 
dtrace.conf(16): DTrace state of the union
dtrace.conf(16): DTrace state of the uniondtrace.conf(16): DTrace state of the union
dtrace.conf(16): DTrace state of the union
 
The Hurricane's Butterfly: Debugging pathologically performing systems
The Hurricane's Butterfly: Debugging pathologically performing systemsThe Hurricane's Butterfly: Debugging pathologically performing systems
The Hurricane's Butterfly: Debugging pathologically performing systems
 
Papers We Love: ARC after dark
Papers We Love: ARC after darkPapers We Love: ARC after dark
Papers We Love: ARC after dark
 

Recently uploaded

Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 

Recently uploaded (20)

Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 

Oral tradition in software engineering: Passing the craft across generations

  • 1. Oral tradition in software engineering: Passing the craft across generations CTO bryan@joyent.com Bryan Cantrill @bcantrill
  • 2. Oral tradition • Long before humans developed systems of writing, we were leaving legacies of information via oral tradition • Oral tradition has been used to: • Preserve and explain cultural values • Convey skills and wisdom • Entertain as well as enlighten • Oral tradition continues to play an important role in post- literate societies — including in software engineering
  • 3. Oral tradition in software engineering • In the beginning, software was subservient to hardware • Software rarely enjoyed the levels of design documentation found in computer design • Like true oral tradition, it relied primarily upon oral retransmission — and much of this is lost today • Fred Brooks’ Mythical Man Month captures the tribal wisdom of this antediluvian era of software
  • 4. Oral literature • When oral tradition is distilled into clear narrative and reliably repeated, it becomes oral literature • For us in software engineering, the early Internet allowed a way to reliably share stories via USENET • USENET is filled with incredible and interesting narrative, but most survives only in archive • But one story from USENET does survive — and it has become the epic of software engineering…
  • 5. Our epic, as penned by Ed Nather A recent article devoted to the macho side of programming made the bald and unvarnished statement: Real Programmers write in FORTRAN. Maybe they do now, in this decadent era of Lite beer, hand calculators, and “user-friendly” software but back in the Good Old Days, when the term “software” sounded funny and Real Computers were made out of drums and vacuum tubes, Real Programmers wrote in machine code. Not FORTRAN. Not RATFOR. Not, even, assembly language. Machine Code. Raw, unadorned, inscrutable hexadecimal numbers. Directly.
  • 6. …and our epic hero, Mel Kaye Lest a whole new generation of programmers grow up in ignorance of this glorious past, I feel duty-bound to describe, as best I can through the generation gap, how a Real Programmer wrote code. I'll call him Mel, because that was his name.
  • 7. Our Odyssey • The Story of Mel was recorded in the early 1980s, but dates from the earliest days of software in the 1960s • Another set of stories recorded in the late 1970s at Data General has become software engineering lore… • Tracy Kidder’s Soul of a New Machine has wisdom that has long survived the team and company it describes • If Mel is our Illiad, Soul is our Odyssey
  • 8. The 1980s and 1990s • In the deeply proprietary era of the 1980s and 1990s, oral tradition was locked on proprietary islands — tribes privately passed on their own traditions and practices • Collections of oral tradition like sgi.badattitude were the stuff of legend — but they too have been lost • The canonical folklore from this era may be John Browne’s beautiful The Bug Count Also Rises, the winner of an internal Microsoft Hemingway parody contest (!)
  • 9. Dawn of a new era: November 7, 2005
  • 10. Oral tradition post-YouTube • With the rise of Internet video, story — orally delivered and aurally received — could travel unencumbered • Stories could be suddenly retold simply by sharing a link — with all of the force and authority of the original • Oral tradition can spread so quickly, we explain it in terms of a pandemic: stories that become viral • We in software were particularly lucky in that Google Tech Talks managed to capture much oral history and tradition before participants recognized what it meant to be recorded
  • 11. For me personally, a watershed
  • 12. For me personally, a watershed (ahem!) DTrace Review
  • 13. Oral tradition post-YouTube • Post-YouTube, our oral tradition is suffering from overload — we have an embarrassment of riches! • The true oral tradition has shifted from the content to the meta-content, e.g. this evergreen topic on HN:
  • 14. Oral tradition closer to home • Every source base is awash in narrative: of origin, of struggle, of conflict, of rewrite, of success and of failure • These narratives ultimately convey not only the history but also the values of a source base • In the proprietary era, these were purely oral tradition — something to regale new hires with over lunch • Every source base is loaded with these; several that are relevant to mine… (UNIX Unix 6th Edition 7th Edition SunOS System III SVR4 Solaris OpenSolaris illumos/SmartOS!)
  • 15. I: The untimely death of Joe Ossanna • In 1973, Joe Ossanna at Bell Labs wrote troff in PDP-11 assembler for the Graphic Systems CAT typesetter • In 1975, Ossanna ported it to C — with the intent of a later clean rewrite to make the macro language less alien • In 1977, Ossanna died suddenly, of either a heart attack, a car accident or (most graphically) being struck by a car • The code he left behind — which remains in our source base — is inscrutable; Brian Kernighan failed to rewrite it! • Code survives us
  • 16. II: “You are not expected to understand this” • Perhaps the most (in)famous comment in Sixth Edition:
 
 
 /*
 * If the new process paused because it was
 * swapped out, set the stack level to the last call
 * to savu(u_ssav). This means that the return
 * which is executed immediately after the call to aretu
 * actually returns from the last routine which did
 * the savu.
 *
 * You are not expected to understand this.
 */
 if(rp->p_flag&SSWAP) {
 rp->p_flag =& ~SSWAP;
 aretu(u.u_ssav);
 } • That which we can’t explain, we don’t understand!
  • 17. III: Logical XOR • I have always been enraged disappointed by C’s lack of logical XOR, having had a hard time holding my tongue, e.g.:
 
 
 /*
 * Logical XOR, where are you?
 */
 ASSERT((vstate->dtvs_nglobals == 0) ^ (vstate->dtvs_globals != NULL)); • I became involved in a heated argument with Roger Faulkner, who insisted that Dennis didn’t add logical XOR because “it can’t short-circuit” — which is obviously stupid • Important difference between Roger and me: Roger had worked at Bell Labs with Dennis…
  • 18. III: “Isn’t that much worse to write” (!) From dmr@plan9.bell-labs.com Sun Aug 6 23:33:54 2000
 To: roger.Faulkner@eng.sun.com
 Subject: Re: history question
 
 Hi Roger,
 
 back from some vacation; here's a belated response.
 ^^ was omitted because it is of little use, particularly
 because the "shortcut evaluation" guaranteed for || and &&
 doesn't help--both sides have to be evaluated no
 matter what. When you do need the effect,
 (A!=0) ^ (B!=0) isn't that much worse to write.
 
 Dennis
  • 19. IV: “You think this is cheesy?” • A favorite comment in the operating system is one that Jeff Bonwick and I wrote together in a moment of crisis • We had (finally!) figured a narrow path by which we could solve a devastating problem that seemed insurmountable • The details are highly technical, but documented thoroughly in code comments — the context around it in an abstruse chapter I wrote in Beautiful Code…
  • 20. IV: “You think this is cheesy?” /* * The turnstile hash table is partitioned into two halves: the lower half * is used for upimutextab[] locks, the upper half for everything else. * The reason for the distinction is that SOBJ_USER_PI locks present a * unique problem: the upimutextab[] lock passed to turnstile_block() * cannot be dropped until the calling thread has blocked on its * SOBJ_USER_PI lock and willed its priority down the blocking chain. * At that point, the caller's t_lockp will be one of the turnstile locks. * If mutex_exit() discovers that the upimutextab[] lock has waiters, it * must wake them, which forces a lock ordering on us: the turnstile lock * for the upimutextab[] lock will be acquired in mutex_vector_exit(), * which will eventually call into turnstile_pi_waive(), which will then * acquire the caller's thread lock, which in this case is the turnstile * lock for the SOBJ_USER_PI lock. In general, when two turnstile locks * must be held at the same time, the lock order must be the address order. * Therefore, to prevent deadlock in turnstile_pi_waive(), we must ensure * that upimutextab[] locks *always* hash to lower addresses than any * other locks. You think this is cheesy? Let's see you do better. */
  • 21. Code comments as oral tradition? • The best comments seem to have an aspect of oral tradition to them: they not only serve to explain what is going on, but provide a narrative as to why • Comments live with the code but do not otherwise affect its correctness — allowing for broad scope and artistic license • Relevant, correct software systems will survive long past their creators; comments are the art within the timeless machine • Comments are how we speak to future generations!
  • 22. Oral tradition in software engineering • Software engineering has changed radically in the last decade: it’s now open, transparent and distributed • This has forced a revolution in oral tradition, which has increasingly become recorded, yielding oral literature • Oral literature allows us to expose and preserve the narrative behind the artifact — to explain the why of the thing • Software engineering teams should be encouraged to record their oral tradition: it attracts technologists who share values! • Our oral tradition is part of our legacy to future generations!