i dream in code

  class Book:
    def __init__(self, a, t, p): = a
      self.title = t
      self.published = p
    def description(self):
      return self.title + " by " + + " published in " + self.published

bits of programs
glide around
in my head

  function Book (t, a, p) {
    this.title = t; = a;
    this.published = p;
    this.description = function() {
      return this.title + ' by ' + + ' published in ' + this.published;
    return this;

i close my eyes
and there it is

  0900 Dim thisBook As book

always the code
pointy k's
and bumpy m's

it follows me
from one rem cycle
to the next

  01  BOOK
      05  TITLE           PIC X(15).
      05  AUTHOR          PIC X(15).
      05  YEARPUB         PIC 9(4).

i've used
a lot of
programming languages

  class Book {
    private String title;
    private String author;
    private int year_published;
    public Book(t, a, p) {
      title = t;
      author = a;
      year_published = p;
    public getDescription() {
      return title  + " by " + author + " published in " + year_published;


  0100 author = "Tolstoy"
  0200 title = "War and Peace"
  0300 published = 1869

to Ruby and Python

  class Book
    attr_accessor :author, :title, :published
    def initialize(a, t, p)
      @title = t;
      @author = a;
      @published = p;
    def description
      "#{@title} by #{@author} published in #{@published}"

it all
runs together

   0100  class Book:
   0200    attr_accessor :author, :title, :published
   0400    public Book(t, a, p) {
   0500      title = t;
   0600      author = a;
   0700      year_published = p;
   0800    }
   0900  end

these dreams
of code
they are hell

  var codeBook = Book("Inferno", "Dante", 1320);

coding is my job
five days a week
i'm coding man

but i don’t want to code
when i'm sleeping

i just want to sleep
when i'm asleep


  pride ="Pride and Prejudice", "Austen", 1813)

since i can't
get away from the code
i try to make it
as easy as i can

after all
i’m tired
in fact i’m asleep
life should be easy
when i’m asleep

         NOW = TIME(0)

when i’m dreaming
in code
i make an array

  pride = new Book("Pride and Prejudice", "Austen", 1813);
  war = new Book("War and Peace", "Tolstoy", 1869);
  books = [pride, war];

and i let your code
borrow my array


and your code
changes my array

  // Your nefarious code.
  public your_nefarious_code(Book[] books) {
    zombies = new Book("Pride and Prejudice and Zombies", "Grahame-Smith", 2009);
    books[0] = zombies;

it's my array
i didn't want you
to change it

truth be told
i do it to myself

  // An honest mistake
  public my_function(Book[] books) {
    jaws = new Book("Jaws", "Benchley", 1974);
    books[0] = jaws;

i have an excuse though
i’m asleep

  # Don't modify this code unless you are unconscious.

this changing
behind my back
makes me
thrash in my sleep

  def []=(idx, value)
    raise "YouCantChangeMyArraySucker"

so in my dream
i make
a new rule
no more
changing arrays

    // Your nefarious code foiled.
    // Blam! Throws a YouCantChangeMyArraySuckerException!
    books[0] = zombies;

once i create an array
that's it
you can’t change it
neither can i


i don’t
have to worry
about your code or threads
messing with my arrays

or my code
or my threads
it’s just easier

  0600 REM I like zombies

but sometimes
i need
to change my array

  GoTo 0000

but if i do
i’m back to square one
i don’t want to deal with it

  function justLikeTheOldOneExcept(a, i, x){
    result = a.slice(0);
    result[i] = x
    return result

so i'll let arrays make
copies of themselves
copies that are
the same as the original

only different

  var pride = new Book("Pride and Prejudice", "Austen", 1813);
  var war = new Book("War and Peace", "Tolstoy", 1869);
  var zombies = new Book("Pride & Prejudice & Zombies", "Grahame-Smith", 2009);
  var books = [pride, war];
  var other_books = justLikeTheOldOneExcept(books, 0, zombies);

then i can have
my old array
my new array


now i don't have to
expend the effort
to trust you

  /* I trust me more than you. */

or me

  /* I don't trust me. */

but sometimes you
change my objects too

  public void aNefariousBookMethod(Book b) {
    b.setTitle("Dirk Gently's Holistic Detective Agency");

sometimes i forget
and change them myself

  // Going about my sleepy business..
  Book war = new Book("War and Peace", "Tolstoy", 1869);
  // Wait what?

it’s been a long night
so let’s have the same rules for objects
and arrays

  def justLikeTheOldOneExcept(v, i, x):
    result = copy(v)
    if isinstance(result, list):
      result[i] = x
       setattr(result, i, x)
    return result

no changing
just modified copies

  Book book1 = new Book("War and Peace", "Tolstoy", 1869);
  Book book2 = book1.justLikeTheOldOneExcept(
                           "Dirk Gently's Holistic Detective Agency");

after all
it's just a dream

  // Rules are like spouses. There is an optimal number to have.

now there are fewer
rules to remember

sometimes i make an object
with private fields

  class Book {
    private String title;
    private String author;
    private int year_published;
    // ...

then i discover
that i need
to get at
those private fields

  class Book {
    private String title;
    private String author;
    private int year_published;
    public String getTitle(){
      return title;
    public String getAuthor(){
      return author;
    public int getYearPublished(){
      return year_published;

so i make them public


i had to make the
private fields private
and then i had to make
the private fields public

that’s a lot of work
and then it’s more work

  class Book {
    public String title;
    public String author;
    public int year_published;

it’s just easier to
make all the fields public

after all
why am i hiding from the data?
don't hide from the data
it's just data

  class ThoseObjects {
    public String title;
    public String author;
    public String cityPublshed;
    public String countryPublished;
    public int yearPublishd;
    public int editoon;
    public int copiesSold;

and there are
lots of fields
and i get tired of all the typing
and my fingers make mistakes

  git ci -m 'Fix misspelling of Book fields.'

so i’ll just use a
map or a hash or a dictionary
or whatever we call it in this language
and make an open
name/value thing

  var pride = {"title": "Pride and Prejudice", "author": "Austen", "published": 1813};

now i can make
new objects full of data
as fast as i can type
which isn’t very fast
my eyes are closed

  var zombies = {"title": "Pride and Prejudice and Zombies", "author": "Grahame-Smith", "published": 2009};
  var war =  {"title": "War and Peace", "author": "Tolstoy", "published": 1869};

if all my data
is in
hashes or
or maps
whatever we call them
in this language
then i don’t have a place for my code

  interface Function {
    public Object invoke(Object arg);
  class MakeDescription implements Function {
    public Object invoke(Object arg) {
      Book book = (Book)arg;
      return book.get("title") +
             " by " +   
             book.get("author") +
             " published in " +  

so i’ll just make little
one method
no data
and put my code there

i’ll call these things
that’s a word i learned in
math class
before i feel asleep

  var make_description = function (b){
    return b.title + " by " +   
    " published in " + b.published

but before the night was over
the dream continued

– Russ

A version of this article originally appeared on Cognitect blog.