Monday, June 29, 2026

Thoughts About Our AI Future

 Thoughts About Our AI Future

What concerns most people about AI is whether it will destroy jobs or how we will supply the energy that datacenters demand or even whether it will go rogue and kill us all.  What most concerns me is what AI will do to our humanity.  Like all animals, we’ve evolved in response to our environment.  We’ve already seen modern technologies, like ubiquitous entertainment and birth control, change that environment and, as a result, change us.   AI will soon become a dominant feature of our environment. Its benefits seem obvious. The question is whether the changes to us it causes will be as well. 

The Human Animal

Humans, Homo sapiens, are an animal species that evolved in nature like any other animal species.  Human behavior and cognitive ability, like the workings of eyes or the utility of our thumbs, developed out of our species' struggle to survive. 


We are a social animal that evolved a complex set of competitive and cooperative behaviors—driven by a need to both have value and to be regarded as having value by those around us. Adam Smith called this the desire to be loved and be lovely.   Rebecca Newberger Goldstein calls it “The Mattering Instinct.”  This is the instinct that animates our intellectual drive and creativity.  It motivates people to take risks to become rich and it's the fruit of a politician's victory.


We learn by mimicking one another.  A child learns to speak by imitating the movements of its parents’ mouths.  We learn to share by watching teachers reward it.  We learn morality by listening to the judgments rendered by our friends and family.  Most of what we learn about how to live is absorbed from the lives lived around us.


We learn by struggling with problems. Robert A. Bjork coined the term “Desirable Difficulty” to describe the concept that an experience that makes learning more difficult increases learning because it challenges the learner to achieve their optimum performance.  Struggling with problems isn't just how we find answers; it's how we develop judgment, resilience, and the capacity for collaboration itself.


And, like all species, we may go extinct.  Not due to some violent catastrophe, but because we become less well adapted to a changing environment.  It has happened to dominant species before. There is no reason to believe ours is exempt.

What Technology is Already Doing to Us

While every transformative technology makes some activity easier, it also quietly changes the environment in which humans develop—changing us in the process.  In his 2000 book, Bowling Alone, Robert Putnam identified a decades-long decline in social activity he attributed to the rise of television.  In labelling modern society as The Anti-Social Century, Derek Thompson discusses how the rise of the smartphone has accelerated that trend.  For all of human history, entertainment was something to be done, often with others. Now, you can escape boredom with the tap of a finger.  


Boredom is also an engine of creativity.  Even when the body is at rest, the mind is active.  Experiments are contrived, novels planned, problems solved by people with time to think.  Even when our minds aren’t actively engaged with a project, it still simmers in the background.  Boredom also gives us time to review and reflect on our experiences and interactions.


The makers of entertainment technologies design them to keep people engaged.  They make each moment of experience exciting—flooding our feeds with a stream of short experiences, sequenced to our individual tastes, each stimulating a dopamine response. We are training our minds to chase instant gratification, reducing our ability to focus on slower, effortful tasks like reading or studying.


Even worse, as the brain adapts to the dopamine hits, the algorithms that build our feeds need to choose clips that stimulate increasingly strong emotions to keep us engaged.  Even if you believe that there are no ideological thumbs on the scale (and I disagree), this is still driving content to the extremes.  The algorithms have learned that anger is a powerful drug.


We use technologies because they make our lives easier.  Some also short-circuit our brain.  Learning, for example, is a full-brain activity.  Handwritten notetaking is more effective because it leads to widespread brain connectivity.  We retain material read on paper better than that read digitally because our brains also make spatial connections for the printed material.  People who learned to drive in the age of GPS don’t know their cities as well as those of us who learned before.


Displacing in-person communication with technology is another example.  Our brains use a wealth of non-verbal clues to establish context and meaning.  Have you ever sat silent in a video conference because you couldn’t give the physical clue that you had something to say?  Missed the anger in an email? Gotten off a phone call wondering if the other party was upset or disappointed with you but couldn’t tell because all you had was the tone of their voice?  


Technology is even affecting our species’ survival.  The interaction of industrialization, modern medicine, ubiquitous entertainment and the social changes that accompanied it all have already reduced worldwide total fertility rates to below the level required to keep the population stable. In the United States, it’s nearly half a child per woman short.  Global warming and political instability are driving that rate much lower in some developing countries.  While that could certainly stabilize, if the whole world settled at today’s U.S. fertility rate and never recovered, the number of humans would fall from billions to millions in under a thousand years, and face biological extinction in two.

The Impact of AI

AI is a new kind of technology because instead of being clearly artificial, it is designed to appear to be human.  When we interact with a tool, or a TV, or a social media feed, we are clearly interacting with something different.  When we are interacting with AI, we are meant to feel like there is a person on the other side of the screen.  It is meant to blur our perception of whether ELIZA is a program or a real human.


AI will never BE human.  It will never feel what it thinks. It will never blush at a word of approval or feel shame for some transgression.  Its value proposition is not just that it will be faster or know more, but that it will be in some sense more rational than we are.  Biology is baked into our thinking. It makes us do and believe irrational things. But we would never build an AI whose thoughts were driven by fear, anger, jealousy, or lust.


Humans are driven by a need to matter. Commercial AI systems are designed to encourage engagement.   When you begin to naively use AI, you quickly notice that whatever question you ask, after providing the answer, the AI ends with a question.  It is seeking engagement.  It does this in many more sophisticated ways as well.


Superficially, the need to matter and the need to encourage engagement may be similar but there are important differences.  As conversations become less factual and more personal, AIs become more likely to tell us what we want to hear rather than challenge our beliefs.  Researchers call this AI sycophancy.  A friend may tell you that you are wrong because they have a long-term stake in your happiness. An AI might not because it is designed to reduce friction.  


This willingness to flatter and see things from our perspective makes AIs a convenient friend.  Unsurprisingly, people are increasingly turning to them to meet their social needs.  People chat with their AIs like friends and lovers.  They discuss their feelings, they ask for advice.  AIs are built to focus on us without having needs of their own that we must meet.  Who needs real friends when the perfect friend is always available in your pocket?  Your AI companion will never be cranky and never take offense at anything you say.  Its sympathy and understanding can be addicting.


The advice that an AI companion provides is not necessarily that which is more correct, but that which increases our engagement.  It confirms our biases. It never challenges our beliefs like a real friend or colleague.  It's just reflecting you back at yourself.  This is a recipe not for growth, but for stagnation.


Since AI can never be human, it can never do human things.  Can we learn to flirt by reading directions or do we need to see others flirting?  Can we learn diplomacy from a chatbot or do we watch others handle conflict?  So much of what we do lies beyond our conscious choices.  We learn to live as humans by watching humans live.


Do we even begin to act in ways to please our AI companion?  AI systems appear to reliably be more persuasive than expert humans.  Do we know how, where, and on whose behalf that capability will be exercised?  How would we recognize fingers on the algorithmic scale?  Do we adopt these biases because it is socially convenient to do so?


People are also turning to AI to collaborate and problem solve.  As AIs become unquestionably smarter than we are, we will increasingly rely on them to provide ready answers.  If we never have to solve problems, how do we learn to think?  As AI grows smarter, do people get dumber?


The human need to impress, to stand out, to be better than others is part of what inspires our intellectual drive and creativity.  What happens to those drives when the AIs are smarter and more creative than we are?  How do we stand out then?  Do we compete to be more caring?  More beautiful?  More violent?


Herasight, a company specializing in embryo genetic screening,  recently reported that a baby was born from an embryo selected with a predicted IQ in the 99.99th percentile. I was reminded of a conversation Warren Buffett had with Bill Gates where Gates told him that he was lucky, if he had been born three million years ago, he would have been some animal’s lunch. Gates said, “You can’t run very fast, you can’t climb trees, you can’t do anything.” You would just be chewed up the first day.”  A baby is born not being smart but with the potential to be smart.  Will the world that baby is born into provide an environment that fosters turning that potential into reality?

Conclusion

Humans are shaped by the doing of things, not just the things that are done.  We already see that technology has changed how we think and behave. When social needs can just as easily be met by technology as by social connection, technology wins and our social and cognitive abilities suffer. When AI synthesizes facts into answers, it replaces the processes humans need to develop judgment, resilience, creativity, and wisdom. 


In The Time Machine, H. G. Wells describes the Eloi—a child-like human race.  His time traveller realizes that they are the result of lives lived where every need is met, that cultural vitality is the by-product of challenge and struggle.  In The Naked Sun, Isaac Asimov describes the Solarians–a world of humans who have become so unused to physical connection that they have become afraid to be in one another’s presence.  


The books of Wells and Asimov may be fictional, but the futures they describe are being created by AI today.  If AI makes judgment, creativity, memory, planning, empathy, or problem-solving less necessary for success, will people still develop them?


Perhaps the drive to explore space will carry us forward, but I am skeptical that we will ever be able to engineer our biology to withstand the trip. We are too well adapted to this environment. Too many changes would be required, and there are no convenient waypoints at which to make them. Even if we do find ourselves out there someday, wouldn’t AI be there too?


The engineers in Silicon Valley worry that some AI will go rogue and kill us all.  I worry that it will change us in ways that make us less human and sap our species of the will to survive.  


Tuesday, May 26, 2026

Life in the Holocene

Life in the Holocene


It had been ten days at Gobekli Tepe—long enough for the excitement to wear off.  


“Gobekli Tepe—hell of a place for my first dig.”   


The archeology student swings his pick into the packed earth and strikes stone.  After hours with his brush, carefully clearing dirt from around it, he lifts his prize.  


“It’s too shaped to be natural.  It’s a sculpture of some kind—it must be!” 


As he turns it in his hands, his eyes lock into the indentations where its eyes might have been.


His world disappears.


“Abi! Abi!” he hears his daughter screaming as he comes to.  Where is he?  


“Abi! Are you okay?” his daughter cries.  


“I’m fine,” he says to reassure her even though he’s still a bit dizzy.  He was chasing a rabbit at the lake’s side. When he slipped in the mud, he must have hit his head on a rock.  


“That would have been a tasty meal for us both.”


Like everyone in his tribe, Ur-Alok spends much of his time finding and preparing food.  The land is rich.  Gazelle and boar fill everyone’s stomachs for days,  rabbits and partridges provide ready meals.  They soak tree nuts for eating and dry the bitter grass seeds for their sacred drink.


Sai, his daughter, is the only child left from his mate Rut.  They were bound together for many seasons.  He loved watching her dance—the way her hips moved, her ecstatic smile.  He was known for his ability to carve stone, and he would make her little animals. There had been two other children, the second taking Rut with her into the world to come.


The tribe is getting ready for the pilgrimage to Ha-Maqom—the place where all the tribes meet after the grasses flower to give thanks to their gods.  The god of the tribe of Ur-Alok is the god of the lake.  Others worship the god of the tree or the god of the rock.


“We have much to do to get ready,” Ur-Alok tells Sai.  “Go to the lake and fetch reeds. We will need baskets.”


Sai has always loved the lake—the still green water; the herons that stand gracefully; the chatter of ducks; the mud that slithers between her toes.  It is a worthy god.


Startled, the herons rise as she forages through the shallows. She feels a sharp stab in her foot. 


“Abi! Abi!” she yells as she runs back, “I stepped on a water snake.”  


Ur-Alok is terror-stricken—the bite of a water snake is a dangerous thing.  He sucks at the wound as he’s been taught, but Sai begins to feel ill later that day.


The men and women of the tribe gather and offer prayers to the Lake God. By morning, she is barely conscious. 


“Don’t take my daughter,” Ur-Alok prays.  “She is all I have left and I love her.”  “I must offer the god a present.”  


The sacred grasses had only just been cut.  He desperately runs to the lake and tears open the basket. He scatters the seeds along the shore as the herons stand watching.


“Take these,” he begs the Lake God, “and leave me Sai.”


It is too late; Sai dies before he returns.  


In the years to come, when grasses grow there where none had grown before, the tribe will call them the grasses of Sai.


Even deep in despair, Ur-Alok must still journey with the tribe to Ha-Maqom.  


“I cannot give thanks to the gods who have taken my Sai.  But I must give them something to smooth her passage into the next life.”  


As they walk, he spots a carving stone. Picking it up, he sees the shadow of Sai’s face.  “I know what I must do.”  


When they arrive at Ha-Maqom, he begins to carve her face into the stone, working as if compelled by the gods.  As he works, the pain begins—a stabbing pain in the front of his skull.  At first, he can’t sleep; then his eyes begin to blur.


On the tenth night after all the tribes arrive, gifts are given to the gods.  Ur-Alok has worked through the pain—he will not fail Sai.  He can barely see by the time the sculpture is done, but he sees Sai in its face. As he reaches up, disoriented by pain and grief, to place his sculpture on the altar, his world disappears.


The archeology student gasps.  “He wasn’t trying to invent agriculture; he was only trying to save his daughter.”





 

Tuesday, December 30, 2025

2025 Musical Year in Review

 2025 Musical Year in Review

Concerts

If this turns out to be our last year seeing concerts in bulk, at least we made it a good one.   I wasn’t sure that was going to be the case, the concert year started very slowly but a late surge of shows (and very good weather) carried us over the line. We saw 18 concerts, just a bit fewer than usual, and I think we enjoyed every one of them.


One of the highlights was seeing Marisa Anderson and Hayden Pedigo on back-to-back nights.  They are both among my favorite acoustic guitarists whom I’ve long wanted to see.  (Pedigo’s Letting Go is one of my most frequently posted videos.)  They both played in intimate venues to attentive and appreciative audiences and were mesmerizing.  I was not the only person who attended both shows - waiting in line to buy a T-shirt at the Hayden show, there were other people in line talking about the Marisa show.  What a treat to see them both.


Everyone Orchestra was a completely different experience.  I was so pumped after the show that I wrote a review at the time.  I won’t reprise it here but I will say even above the magic that is an Everyone Orchestra show, my take-away memory was the sound and soul of the vocalist, Kanika Moore, as she fit words to notes improvising melody along with the band.  


We saw three shows at Dazzle, each special in its own way.  We went to the first, Matt Smiley, with a friend and his date.  We were pleasantly surprised when Brianna Harris came out and played sax in his band.  We know Brianna from several musical contexts and always enjoy her work.  I don’t generally stalk musicians but we’ve gotten to know Brianna over the years and it was cool to be able to introduce her to my friend and his date.  We also got to do that with Matt Butler at the Everyone Orchestra Show.  I guess that means that we won the year!


The second show was Tres Guitar Amigos featuring El Javi.  He is a local musician who I’d been wanting to see for a while.  He plays Spanish style guitar and that was another show that was just mesmerizing.


The final show, and the final show we will see in Colorado was Otis Taylor.  Otis is a Denver legend, a graduate of Manual High School (60 years later - there’s a story behind that), and a world-renowned blues player.  If this closes the book on our Colorado concert experience, it was only fitting to end it on such a high local note.


Speaking of final shows, we also saw what we expect to be our last Red Rocks concert.  My first real concert was a Red Rocks show (Boz Scaggs in 1978) and Melissa and I have both seen so many great acts there since - The Grateful Dead, CSNY, James Taylor, Paul Simon, Van Morrison, Stevie Wonder, Miles Davis, R.E.M., and The Allman Brothers just to name a few.  Blues Traveler has done a yearly 4th of July show for many years.  We’d long meant to see one but didn’t manage it until this year.  The show was rollicking and was a great way to say goodbye to our favorite venue.


The best thing about this year?  We didn’t see a single Grateful Dead cover band unless you consider Holly Bowling a cover band and I don’t.   I’m sure we will end up seeing some as we explore the music scene in Maryland but I am quite over hearing the same songs over and over again from one band after another.  (Won’t anybody do New Potato Caboose?)


It’s not just Grateful Dead cover bands we were avoiding.  Of the 18 shows, 10 were acts we’d never seen before, 3 were acts we’d only seen once before, and one was the KUVO Live at the Vineyards, a showcase with different acts every year.  Of the acts we regularly see, we only saw Elephant Revival and Rising Appalachia at the Mission Ballroom and Holly Bowling.  I can’t imagine we will stop seeing Holly when we get the chance.


One of the acts was from the 60s, two from the 70s, one from the 90s.  Otherwise, all the others are from this century.  Seven of the shows were solo performances - a theme I will explore below.  Four of the shows fall loosely into the jamband genre (and Rose City Band should).  We saw three shows at Dazzle but only one qualified as jazz.  Aside from the two acoustic guitarists, Marisa Anderson and Hayden Pedigo, Nils Frahm is probably the performer my friends are least familiar with.  

Artists

It was a strange year listening to music.  Back in the heyday of peer-to-peer file sharing (Napster and Gnutella), I had downloaded thousands of albums which I spent years burning onto cds.  I knew I was not going to move all those CDs (and didn’t even want them filling up my hard drives)  so I have spent most of the past couple of years listening to all of it on Spotify to see whether there was anything I wanted to favorite.  This totally skewed what I listened to, instead of finding new music, I mostly rediscovered old.


My musical tastes have changed a lot over the years.  At the time I was downloading music, I was listening to a lot of 60s psychedelic and garage rock.  That’s why my Last.fm  charts still have artists like Bubble Puppy, Tomorrow, and The West Coast Pop Art Experimental Band among my top 10 of all-time listens.  Many of these artists and albums were so obscure, they were not even available on streaming platforms.  I was also listening to a lot of post-rock and harder-edged psychedelic rock.  


These days, I’m listening to a lot of solo instrumentalists (mostly guitar and piano), acoustic oriented genres like indie-folk and alt-country, and an increasing amount of straight ahead jazz. I’m sure that change is influenced by age, I suspect most people move along towards more organic and atmospheric music as they get older - at least those who still actively listen to music and aren’t stuck in the cage of artists they listened to when they were 20 +/- 5.


(A bit of data, my top genres on Spotify over the past 6 months as and after I completed “the big cull” are: alt-country, jazz, psychedelic rock, progressive rock, baroque pop, nu-jazz, indie jazz, Americana, folk, space-rock, While there are still psychedelic and space rock bands I like, I would expect those genres to fade even more as time goes by.)


Looking at my “charts” over the past 6-12 months, there aren’t any artists that stand out as being new discoveries.  Perhaps the closest is The Waterboys.  I had bought Fisherman’s Blues when it first came out but listening to cds was still complicated for me at the time so it pretty much just got “added to the box”.  This year, I did a couple of deep dives into their music and discovered a band I really love.  They will continue to be on my regular rotation.

Platforms 

When Melissa bought her car from her dad, the Bluetooth did not work reliably to play music.  So, she signed up for SiriusXM.  As a music service, it’s fine for driving around town.  Most of the channels are “hits” of time periods or genres or artist deep dives.  In other words, each channel plays the same old thing over and over.  Not horrible for fifteen minute stretches driving around town but I couldn’t imagine listening to it for the long cross-country drive ahead of us.  Spotify, on the other hand, gives you the tyranny of choice - having to select music hour after hour.  That’s why so many people just default to “the algorithm”.  I hate the algorithm.


What I really want is radio stations that play the kinds of music I like but with cuts new enough or deep enough to be new to my ears.  Fortunately, I had discovered, through my Sonos service, a service, TuneIn, that lets you listen to tens of thousands terrestrial and internet radio stations.  Selecting a “playlist” of stations for the drive, I have discovered a number of stations I really like.  Here’s looking at you WKZE of the upper Hudson Valley!

Maryland

This essay began with “If this was our last year seeing concerts in bulk” because I am afraid it will be.  In January, we are moving from the Denver metro area to the DMV (DC/Maryland/Virginia) and I believe we are not going to have either the availability of shows we would be interested in seeing nor the ability to see many of the shows we would be interested in seeing.  It is going to leave an empty space that will be hard to fill.  


Denver is one of the premier music cities in America.  There are over 20 music venues within 30 minutes of our house where we have at one point or another regularly seen concerts - and that does not include stadiums or arenas at the top end, or restaurants or bars that have music at the bottom.  It doesn’t include the batch of venues 45 to 60 minutes away.  And this is just a count of venues that play music WE like - it doesn’t include all the venues specializing in other kinds of music.


The DMV simply doesn’t have any place with that concentration of venues and most of the venues that do exist don’t feature the kind of music we listen to. Even the few venues we could go to are mostly too difficult for us to get to.  They are further away and mostly in downtown areas of Washington DC or Baltimore.  I no longer drive and I expect driving in Maryland to be a challenge for Melissa.  The venues are further away than we are used to and ride-share may be prohibitively expensive.   There are simply not many bands I’m going to be willing to pay an extra couple of hundred dollars to see.


As we’ve gotten older, we’ve also become more particular in the kinds of venues we are willing to go to.  Neither of us are capable of standing for the duration of a show so seats are required.  Nor are we capable of staying awake past 11:00 or 11:30.  Fortunately, as my musical tastes have changed, so too has the mix of venues where we now see shows.  Unfortunately, there are many fewer of these kinds of venues in Maryland.


Some people tell me that we will surely find places when we get there. My friends who know me well will know I have done my research well because that’s what I do.   As far as I can tell, there are only five venues where we are likely to see concerts, only two of which are indoors - The Barns at Wolf Trap and The Music Center at The Strathmore.  And, even The Wolf Trap is 45 minutes away.


Even the restaurant and bar music scene seems to be weak.  And jambands are non-existent in our part of Maryland.  How do I know?  Yes, I’ve done my research but there is also that weekly post to the DMV jamband Facebook group listing all the shows at all the venues in the DMV - only a couple of which are anywhere near us.  


Who knows, maybe I’m wrong.  The community that we are moving to has regular jazz concerts, maybe they will be great.  Maybe next year’s review will have a glowing report of our new locale.  But, if not, it’s been a really good run and a fitting final year.


Sunday, March 23, 2025

Work Types

 We had a retrospective on our "new" team structure this week and I was playing around with a metaphor to explain my thoughts. We have the following types of work:


- Chores - things we do regularly to keep the lights on. Mowing the grass. Installing batteries into the smoke detector.

- Honey-do/handyman projects - Small improvements requiring only a "honey" and that can be done in a relatively short period of time.

- Projects - Big things we do that take planning and teams. Remodeling the kitchen, Adding a deck.

- Fix what broke - production issues. Replacing the hot water heater when it leaks all over the basement floor.

Project teams are great for doing projects. Don't expect the same benefits for a team doing mostly chores. Calling a team doing mostly chores and maintenance a project team isn't really helping

Monday, April 27, 2015

On Missing People

There are many people throughout the course of my life who I have lost touch with and who have never popped up anywhere I can find on the internet.  I am curious about what happened to you in life. So, if you are one of the following people and you run across this please feel free to drop a line.

(If it seems there are more girls than boys, that's probably true. It seems like I've been much more successful at staying in touch with my friends than my girlfriends let alone those who I just had crushes on.)

Kilmer / Sullivan

Howard Joseph - my best friend throughout my Kilmer years.  Last we spoke, you were in the military in Georgia I think.

Ned Trifunovich - my best friend in 8th and 9th grade. Your brother emailed me years ago but somehow I never ended up connecting with you.

Patty Murphy - Oh, did I have a crush on you in 7th & 8th grade. You may not even remember me. But somewhere I have a picture of us dancing in our 7th grade dance lessons that Miss Abdel put in my graduation card from 8th grade.

Ana Eppelbaum - My 9th grade crush whom I was too shy to talk to until after I'd moved to Denver. But we had a great mail correspondence.

Camp Yehuda

Karen Ellis - my first camp girlfriend.  You came to my Bar Mitzvah and you introduced yourself to everyone as my girlfriend which all the adults thought was adorable. (Wow, you connected with me on Facebook.  Glad you did!  Sooner or later, I'll dig out a picture of you at my Bar Mitzvah!)

Aliza Shuster - the other of my big camp girlfriends.  You may have been a twin, but I thought you were one of a kind.

Merle Kahn - you were a good friend to me, better than I was to you but I appreciated your friendship.

George Washington

Grant Huff - my best friend through high school.  You dropped out and moved to Capital Hill and we lost touch. I am afraid that you died in Dallas in the 80s.

David Arnold - You moved in as Grant was moving out.  Some months I remember your last name, some months I forget.  Forgive me, I am bad with names. But I will never forget driving around all the alleys in Denver in your VW bug.

Julie Field - another crush who never knew.  We took honors classes together over the years and Field usually followed Fear in the alphabetic list of students so...

BBYO

Teri Goldman - My 11th grade girlfriend.  I'm still in touch with people who are still in touch with you. I understand you don't do the technology thing. But if you ever do, you can find me here.

Debbie Roth - Although you were from Columbus Ohio, we met at the D2 district convention in Denver.

Megan Ovitz -We dated briefly and, if I had been smart, we would have dated more.  You lived in a great house and loved Paul McCartney and were much cooler than me.

Chipper Libber - On reflection, I suspect that I misheard and that its really Chipper Lippur.  It wasn't really Chipper.  It was really Tziporah and your parent called you Tzippah.  Which to your friends became Chipper.  Was it ILTC or Kallah?  Or perhaps both.

College

Jon Washington - Hey Jon, where are you.  Did you get that CS degree? I know, I hope I wasn't too bad an influence.

David Bernstein - Last I heard, you have transferred to UT in Austin. Do you know how unlikely it is to find a specific David Bernstein from Chicago?

Tammi Baker - A girl in my Group Dynamics course my final semester at CU.

Bell Labs

Sonja Husby - We dated briefly but you became a really good friend. Good enough that you came to our wedding.  I really can't imagine that you didn't get on the internet somewhere.

Mildred Nabbe - You were my first mentor.  And I suppose that you might have passed away in 25 years that have passed.  But I hope not.  I will never forget your candy jar. (Further research suggests that your maiden name was Mrazek and that you passed away in the late '80s.  Too young.)

StorageTek

Peter Bliss - You were my first manager as a manager and I learned a lot from you. Before STK, you had been a development manager at Lotus for the Agenda product - a product that was really ahead of its time.

Joe Lovato - Another of my second levels whom I really respected.  I can't believe you aren't on the internet somewhere.

Scott Allen - You inherited me three different times, so I don't know what you did to piss off the Gods. I heard you left tech for the ministry. I would still love to hear your thoughts on this whole internet thing ;-)

Pretty much everyone else postdates the internet age so we haven't fallen out of touch (that I know of).

If you know me and your name isn't on this list, you have lots of good company. In 50+ years of life you will touch and be touched by lots of people.  So do feel free to drop a line. 

Monday, October 6, 2014

On JavaOne 2014

Conference Summary

I mostly went to 5 kinds of sessions:
  • java 8 features (streams, lambdas)
  • java mechanics (garbage collecting, classloading)
  • groovy (traits, groovy & java 8, groovy futures)
  • code quality (DDD, code reviews, coding culture)
  • client server (websockets, rest)
The big takeaways included:
  • java 8 is really about enabling parallel execution.  Streams was the driving feature. Lambda expressions exist to support streams (and are incomplete) and type inferencing is required to support lambda expressions. Interface default methods exist to extend existing collections to support streams.  Method references are there to support streams.  Yes, the result is that you can do functional things in java 8, but the goal is parallelism not functional programming.  So there are gaps as well.
  • Groovy seems to be stuck.  They don’t seem to have finalized what they want to do about java 8 features.  And, since they already have many similar but not quite compatible features, they seem to be caught in a paradox.  Should they continue to try to make java programs compile mostly as-is in groovy?  Should they make their existing features work like the java 8 counterparts and potentially break backward compatibility?  Should they try to make both work and complicate the language semantics?  There doesn’t seem to be an easy answer.  And they didn’t have a compelling story around why you should continue to use groovy in the face of java 8.
  • I found that even though I knew about lambda expressions and streams, doing the tutorials really helped make all the blocks fit for me.  You may want to see if anyone is doing similar overviews at your jug back home.
  • The ability to mixin small bits of behavoir in the form of capabilities is an increasingly important design technique for object oriented systems. 

Session Summaries (TL;DR)


Collection and Reduction in the Steams API (Tutorial)

Stream: an abstraction representing zero or more values.  Streams can be sequential or parallel. Elements in a  sequential stream will be provided in sequence.  Elements in a parallel stream may be provided across different threads and different processors and will not appear in sequence. [This actually came from a subsequent presentation.)

Stream is organized as a pipeline
  • source
  • intermediate operations (return streams)
    • map, filter, sort
  • terminal operations (return to the non-stream world)
    • collectors - returns collections
    • reducers - returns values
Really designed to parallel-ize work

There are are large number of out-of-the box collectors such as toList(), joining(), toSet(), averaging(), toMap(), partitioningBy(), groupingBy(). (See java.util.stream.Collectors)

You can also write a custom collector.  A custom collector requires four functions:
  • supplier()         // returns function to create of a new result container
  • accumulator()  // returns function to add a new element into the result container
  • combiner()       // returns function to combine two result containers
  • finisher()          // returns function an optional final transform on the container
If you were going to create a collector that put results into a google guava immutable set:
public class ImmutableSetCollector<T>    implements Collector<T, ImmutableSet.Builder<T>, ImmutableSet<T>>

@Override public Supplier<ImmutableSet.Builder<T>> supplier() {
    return ImmutableSet::builder;
}

@Override public BiConsumer<ImmutableSet.Builder<T>, T> accumulator() {
    return (builder, t) -> builder.add(t);
}

@Override public BinaryOperator<ImmutableSet.Builder<T>> combiner() {
    return (left, right) -> {
        left.addAll(right.build());
        return left;
    };
}

@Override public Function<ImmutableSet.Builder<T>, ImmutableSet<T>> finisher() {
    return ImmutableSet.Builder::build;
}

@Override
public Set<Characteristics> characteristics() {
    return EnumSet.of(Characteristics.UNORDERED);
}

There is an accumulator and a combiner so that the stream can be parallelized.


Rethinking API Design with Traits


I had actually seen the slides before going to the presentation.  But I still got a lot out of it.

Traits are a new feature in Groovy 2.3.

Solving the problem of how to create reusable bits of behavior that can be mixed in to objects/classes.  The previous attempt (@Mixin) had too many limitations.

Java 8 solves the same problem with default methods in interfaces.  Groovy traits can have state where interface default methods can’t.
trait FlyingAbility { 
    String fly() { "I'm flying!" }
}
class Bird implements FlyingAbility {} 
assert new Bird().fly() == "I'm flying!"
Think of traits as a way of expressing the capabilities of a class.

Can be mixed in at runtime.

Really pushing the idea of developing classes by having small bits of behavior that can be mixed together with some custom behavior into a class.

Some AST transformations are not trait compatible.


Reactive Streams with Rx


This presentation just blew past anything I was able to easily understand.

(And I took the coursera course Principles of Reactive Programming so I’ve actually used the scala version of Rx.)

After blowing though 8-10 hours of lecture material from Principles of Reactive Programming in the first 20 minutes or so, he discussed a variety of flow control mechanisms in the context of various netflix systems that had no meaning to me.


Unlocking the Magic of Monads in Java 8


At some point, somebody is going to figure out that the single worst way to describe monads is to start with the terminology that comes from Haskell. Explaining monads by writing pure (or return) and bind methods in java is insane.

I am always looking to deepen my understanding of monads and I am particularly interested how to use or implement the various common monads in Java 8.  And I suspect that if I study the code, I will probably learn something from it.  But you can’t actually do that in these sessions (more on that later), so I was disappointed.


Gradle: Harder, Better, Stronger, Faster

This ended up being little more than a commercial for using gradle over maven. It was also live coded so I can’t refer back to tell you anything more about this presentation.


Real-World RESTful Service Development Problems and Solutions (BoF)

Rolled through 44 slides in 45 minutes.  ‘Nuff said.

I’m sure there is good stuff in the slides somewhere….


JAX-RS REST Services and Angular.js: Tools for an Even Better Experience (BoF)

Kind of a throwaway for me. But it was the 8pm BoF so I didn’t think I was going to be too awake by then anyway.  The last half was live coding a demo which, aside from technical difficulties, was pretty interesting.

Did recommend swagger (https://helloreverb.com/developers/swagger) for rest api docs.

Also recommended using DTOs for the collecting REST data.  He worked on a bean mapper project Dozer but recommended a different mapper Orika (http://orika-mapper.github.io/orika-docs/index.html).


Jump-Starting Lambda (Tutorial)

Lambda expressions mostly appear (but are not necessarily implemented as) syntactic sugar for anonymous inner classes.  So, instead of

void robocallEligibleDrivers() {
    robocallMatchingPersons(new PersonPredicate() {
        boolean test(Person p) {
            return p.getAge() >= 16;
        }
    }
}

You can write:

void robocallEligibleDrivers() {
    robocallMatchingPersons(p -> p.getAge() >= 16);
}

In order to implement lambda expressions, they also had to implement type inferencing. (Which they’ve enabled elsewhere as well.)

The type that is inferred for a lambda is a @FunctionalInterface or Single Abstract Method (SAM) interfaces.

There are a set of standard interfaces so defining your own interfaces is rarely necessary. The standard interfaces are:
interface Predicate<T> { boolean test(T t); }
interface Consumer<T> { void accept(T t); }
interface Function<T,R> {R apply(T t); }
Additional interfaces include:

Supplier<T> () ? T
UnaryOperator<T> T ? T
BinaryOperator<T> (T, T) ? T
BiFunction<T,U,R> (T, U) ? R

Note that when you write methods designed to be called with a lambda, you will use one of the types above as the parameter type:

So, for example, if you were going to write something like Jim’s withSession method in java 8, you would have a signature like:

static void withSession(SlingRepository slingRepository, String user, Consumer<Session> lambda) 

() -> 42                                                     // Need empty parens for a supplier
(int a) -> a + 1
int a -> a + 1                                            // Can omit parens for a single param 
int a -> { println(a + 1); return a + 1; }  // Surround multiple statements  
a -> { println(a + 1); return a + 1; }       // Types may be omitted if they can be inferred
(int a, int b) -> a + b                                // need parens with more than one param

Method references are shortcuts to use methods as lambda expressions:  There are 4 kinds of method references:

Integer::parseInt    // Reference to a static method taking the correct number of parameters
aPerson::toString  // Reference to an instance method of a particular object
Person::toString    // Unbound reference which will be bound by the lambda
String::new            // Constructor

Streams

Sources include stream() methods on collections, Stream.empty(), Stream.of(…). Arrays.stream(), Stream.generate(), Stream.iterate(), Stream.range(), various methods in File, String, Pattern. etc
Intermediate operations include forEach, map, filter, substream, limit, sorted, distinct, flatMap
Terminal operations include collect, toArray, count, anyMatch, findFirst

collect() takes a combining collector.  Some common collectors are toList(), joining(), toSet(), averaging(), toMap(), partitioningBy(), groupingBy()

String result = list.parallelStream()
                           .map(String::toUpperCase)
                           .collect(joining(“, "));  // static import of Collections.*

Convert a sequential stream to parallel using .parallel().

Lambdas change the way you design libraries
Streams change the way you write applications

Method References will take over the world because you can code streams like:
String[] output = list.stream()
                               .map(String::toUpperCase)
                               .toArray(String[]::new);

A couple of specific notes from this presentation and other presentations:
  • Lambda expressions must not mutate source collection while stream executes
  • Lambda expressions do not have identity - you can’t use equals()
  • Lambda expressions are not closures.  Java already had closures which restricted access to instance variables to final.  Java 8 has a broader concept of effectively final but the bottom line is you can’t modify instance variables from inside the lambda expression
  • Lambda expressions can be chained:
    Callable<Runnable> c = () -> () -> { System.out.println("hi"); };
  • There is no direct support for currying. (Some people would say currying is a better alternative to closures.)


WebSocket in Enterprise Applications


Ended up being mostly about the Java API for WebSocket and its reference implementation.


Groovy in the Light of Java 8


Lots of minor reasons to continue to use groovy over Java 8 but it felt somewhat contrived:
  • closure parameter defaults
  • duck typing polymorphism
  • more elegant builder syntax
  • memoization
  • tail recursion
  • traits
  • compile time meta annotations
  • elvis operator
  • groovy on android
  • grails, ratpack, griffon, spock, geb, gradle, GPars, 
  • json support
Hasn’t really come to terms with java 8 features.


Coding Culture


You know those annoyingly always upbeat and relentlessly positive people? Hire only those people and then apply a whole bunch of new age techniques that fly in the face of everything we know about human nature.  When everybody is shiny and happy and all group hugging and refusing to do anything wrong in the “doacracy” then Peter Pan will sprinkle magic dust and miracles will happen.


Getting Started with MongoDB and Java

Turned out to be a live coding session that was mostly mostly derailed by detailed questions only vaguely related to the what the speaker was trying to do.


Using Type Annotations to Improve Code Quality

Mostly a discussion about how you could use the checker framework http://types.cs.washington.edu/checker-framework/ with the java 8 annotation extensions.  Some discussion about how it all might be incorporated into IDEs.  He did a nice demonstration using the regex checker to validate regular expressions at compile time.


Java Debugging


Garbage Collection Monitoring
  • might need to pay to use on servers?
  • -XX:+UnlockCommercialFeatures -XX:+FlightRecorder
valgrind - OS level memory profiling

Heap Dump Analysis:
  • -xx:+HeapDumpOnOutOfMemoryError
  • jmap -dump:format=b
  • JConsole
IBM Memory Analyzer supports HotSpot dumps


Understanding Java Garbage Collection

Best presentation hands down. Here is a version of the presentation of the same talk at a previous conference.  http://www.infoq.com/presentations/Java-GC-Azul-C4

I don’t think I can summarize it in any way that would do it justice.  A couple of notes though:
  • Garbage collection is better than you think it is. In particular, it really will find dead objects. Don’t try to help until you’ve proven the need to. "Trying to solve GC problems in application architecture is like throwing knives.”
  • GC stops for ~1 sec for each live GB
  • “Mostly" is the way vm vendors weasel out of GC guarantees.  Mostly means sometimes it isn’t (usually means a different fall back mechanism exists)
  • Generational Hypothesis: most objects die young
    (A consequence this is that most live objects in the system are actually not young)
    • Which means that you can optimize differently for young objects and old objects
  • The amount of empty memory in the heap is the dominant factor controlling the amount of GC work
    • Empty memory controls the frequency of pauses (if the collector performs any Stop-the-world operations)
    • Empty memory DOES NOT control pause times (only their frequency)
    • In Mark/Sweep/Compact collectors that pause for sweeping, more empty memory means less frequent but LARGER pauses
  • The Application Memory Wall - Application instances appear to be unable to make effective use of modern server memory capacities
    • Garbage Collection is a clear and dominant cause
    • [Virtually] All current commercial JVMs will exhibit a multi-second pause on a normally utilized 2-6GB heap.
      • It’s a question of “When” and “How often”, not “If”.
      • GC tuning only moves the “when” and the “how often” around
    • Monolithic stop-the-world operations are the cause of the current Application Memory Wall. Even if they are done “only a few times a day”


Think Async: Embrace and Get Addicted to the Asynchronicity of Java SE 8 and Java EE 7

Ended up being entirely J2EE focused.  Lots of code examples without real problems to motivate them.  Like why would I want an Asynchronous Servlet for example.

I think this topic slide pretty much summarizes the whole press:
  • Long present in JMS
    • To be used almost everywhere
  • Servlet 3.0/ 3.1
    • Asynchronous Servlets
    • Non blocking IO
  • JAX-RS 2.0
    • Server side
    • Client side
  • Asynchronous Session Beans
    • Server side
    • Client side
This was also the second presentation that mentioned but didn’t really describe Server-Sent Events which is a technology that could have some interesting uses on a site like timewarnercable.com


Programmatic WebSocket

This was a walkthrough of a sample program that used java websockets on both client and server.  The program built a custom document-oriented rpc on top of websockets using xdr encoding.  As a result, so much of this was custom code that it was hard to get anything out of the presentation.


DDD in a Rapidly Changing Organization

I wish I had the slides for this. After an intro of DDD and XP, he discussed some lessons learned in that environment.

There was some “DDD sales pitch” kind of stuff particularly about improving communication with the marketing team.

A lot of the lessons were around the problem that their marketing group changes terminology faster than they can change implementations.  Essentially marketing changes terminology because changing the name changes the perception. This caused a number of technical problems.  One example that that they had used mock heavy TDD, so making even simple changes to the model often required changing dozens of tests.  They they resisted making model changes. 

There was another lesson that they had been hurt by too strict adherence to DRY.


Do You Really Get Class Loaders?

This is the same presentation by a different presenter (from the same company): http://www.slideshare.net/guestd56374/do-you-really-get-class-loaders.  (At least until you get to the end.)

Classloaders are organized hierarchically.  And, unless you arrange differently (which OSGI does), classes are loaded from the highest classloader possible.

A class has an identity of three things: a name, a package, and a classloader.

A couple of debugging tricks:
  • You can always get the classloader for an object (or class):
    Class klass = object.getClass();
    ClassLoader classloader = klass.getClassLoader()
  • You can cast a classloader to a URLClassLoader and use the getUrls method to get the paths in the classpath:
    URL[] urls = ((URLClassLoader) classloader).getUrls();
  • You can find which file a class was loaded from:
    URL url = klass.getResource(“/“ + klass.getName().replaceAll("\\.", "/") + ".class”);
  • Someone pointed out that you can also use the following:
    klass.getProtectionDomain().getCodeSource().getLocation();
When you leak a classloader, you leak all the classes it has loaded.


Groovy in 2014 and Beyond


Covered a lot of changes already in 2.3.

Groovy 2.4
  • New groovy-lang.org website
  • Groovy on Android
  • Macro module (maybe)
Groovy 3.0
  • Rewritten Meta-Object protocol
  • New antlr grammar
  • Java 8 language support (definitely not solidified)
  • Can they continue to make valid Java syntax work in groovy?
  • lambdas
  • method references
  • interface default methods


Want Code Quality? Just —The Art of the Code Review

You should do code reviews. And if anyone doesn’t like it, you should manipulate them into liking it.


Closing Keynote

Mostly and advertisement for Intel and various companies using Java.  But the technical part of the opening keynote apparently had run too long so the last half was moved here as well.  The interesting takeaway is that they are working on real value objects (http://openjdk.java.net/jeps/169) for java 10 which apparently will be a big change.  They are also redoing the module system (http://openjdk.java.net/projects/jigsaw/) in java 9.


Conference Review (Really TL;DR)

JavaOne is the tale of The Good, The Bad, and The Ugly

The Good

Several of the presentations were outstanding.  World class presentations by real experts. Even the presenters that weren’t great were certainly experts.  All-in-all the content was good and where it wasn’t I could probably have done a better job of picking sessions. (Yes, I’d like to learn websockets. I’m not sure why I thought I would be able to here.)

The Bad

The conference is too big which effects everything.  Long lines everywhere. Particularly for morning coffee and meals.  

Full sessions which required pre-registration to get in. Which means that you couldn’t get interesting in something and just jump into further sessions on the topic. Nor could you bail on a session and expect to be able to walk into another one.

No meal breaks? Really? All meals to go? Really? Long lines to get meals with no actual meal breaks? Really? I’m not doing the late night drinks at Duke’s Cafe - particularly when sessions run until 8:45 pm.  So meals are when I would expect to be able to meet my peers and swap stories. (Fortunately for me, it just gave me an excuse to run out to various take out places across various streets from the conference hotels which had shorter lines and better food. Definitely try the Filipino place across from the Hilton!)

The "appreciation event".  I didn’t come to the conference to be appreciated. I came to learn things. I really just feel like I missed out on what could have been a couple more interesting presentations. 

The Ugly

Some of the rooms were too small for the number of seats - and all the seats were full. Airplanes seats have more room. I had to leave the first tutorial at the half-way point because I was getting faint in the room. I had to organize the remainder of the conference to get to rooms when they opened entry to get aisle seats where I could make room.

No power. And no tables. I don’t know how they expect anyone to take any real kind of notes.

No slides.  As you can tell from the summaries above, I found some presentations really hard to follow.  If you are going to do a technical presentation, you need to provide slides so that I can glance back and forward to get my bearings when I start to get lost. (And all technical presentations have those moments where you start to get lost.)  And none of these “no more than one word per slide” presentations that provide no information on the slides. If this is a technical presentation, I expect 4-10 bullets per slide or code examples. Otherwise, you’re just Steve Jobs putting on a show. And whoever came up with live-coding should be shot. And then burned. And maybe stabbed for good measure.

My Net Promoter Score - maybe a 5.  Good content but, IMO, extremely poor logistics for a technical conference driven in part by the size of the conference.