Friday, December 23, 2016

New Time Vocab Guideline

12pm is now always “noon” and 12am is now always “midnight”.  You may say things such as “noon thirty” to indicate “12:30pm” or “midnight forty five” to indicate “12:45am”.  Similarly, talk about “noon plus 3:25” in order to indicate “3:25pm”.
So the problem is that anytime you have some sort of modulo arithmetic people fail spectacularly.  I think it’s because discontinuities is something that can generate Cognitive complexity [1] and modulo arithmetic has a giant discontinuity built right into it.

Technically the new Vocab Guideline still has a discontinuity in it, but it’s a discontinuity that is a bit easier on the mind.  AM is from the latin ante meridiem (before midday) and PM is from the latin post meridiem (after midday) [2].  This adds two difficult things for the individual to process in addition to the notoriously bad modulo arithmetic. Namely an acronym from a dead language, and the disconnect between solar noon and 12pm and midday.

So making people think about a latin acronym is bad because most people don’t know latin.  Now they have to deal with something completely out of left field when they’re already having problems.  The other side is that midday used to actually be a meaningful concept before our modern conveniences.  You got up at sunrise because that’s when you could see and you went to bed at sunset because that’s when you couldn’t see.  Midday was solar noon because that’s when the sun was in the middle of the sky and you knew the day was half over.  Today solar noon and actual noon don’t match up, and it doesn’t matter anyway.  We have alarm clocks, meetings with the other side of the world, internet, lights, 24/7 stores, and uber.  Noon and solar noon have nothing to do with whether or not the day is half over.  

This actually isn’t the first instance of something that doesn’t make a lot of sense that we still use due to tradition, but totally made sense back in the day.  You might think that a mile as a unit of measurement doesn’t make a lot of sense at 5,280 feet.  Shouldn’t we use the metric system or something.  Well we inherited miles from the Roman mile, which was defined as 1,000 paces [3].  And that sort of sounds like the same thing that we get from the metric system.  It’s almost like they did something that made sense instead of having a totally arbitrary system.

Monday, November 28, 2016


There’s a Joel on Software [1] blog about why you should never rewrite a program from scratch.

He gives a couple of examples from the 90s (? I guess … I wasn’t active in the field until the late 00s) that all ended in disaster because people tried to rewrite some very complex program from scratch.  Then comes the punchline:  The reason why everyone hates their programs is because they’re filled with badly written components that have had hundreds of independent incremental changes made over time.  And the reason that these programs work and need to be kept is because these hundreds of independent incremental changes are all bug fixes.

So when I hear this I immediately think of stories about machine learning being able to create well optimized sorting algorithms, but the source code is completely incomprehensible.  My interpretation is that some problems exist in a space that has bad cognitive complexity [2].  When you hit this problems with a machine learning algorithm the algorithm starts charting out the space, but it’s blind and stupid.  It bumps into all of the little holes and discontinuities and makes ad hoc fixes that make sense in the moment but generate code that doesn’t make any sense.

My thought is that the Software Engineering process that was in place in the 90s (and let’s be honest, is probably still is in place nearly everywhere) is basically nothing more than a machine learning algorithm.  A blind and stupid algorithm that doesn’t have the wherewithal to conceptualize the problem that it is trying to solve.  Joel sees all of these less than ideal software components and says this is how we get working software; I see all of these less than ideal software components and think that we need a better way to analyze what the end users need and generate requirements.  Better bug tracking, better flaw resolution procedures, better discovery phases, better prototyping, better implementation techniques.  It has been over 15 years, I wonder if Joel’s opinion has changed or been otherwise refined.

Can the software engineering process be better?  Well I heard a story about how the JPL resolves bugs.  Every bug at the JPL isn’t a problem with the software it’s a problem with the process.  When they find a bug in the software they find out how to change the process such that the bug wouldn’t have shown up in the first place.  The next thing they do is to audit the entire code base to ensure that they get all instances of the bug that may have been introduced when they were using the faulty process.  Probably too involved to use for a throw away web app, but it does give you something to think about.

Here’s an idea: Semantic movie scene search engines

We’ve got all this increasingly impressive image recognition technology.  So let’s run it over every movie ever.  Then we can build a database.  Finally you throw a scripting language over it.  

Imagine we could be living in a world where all you need is to type the words “Kevin Bacon walks out of an elevator” and you’ll get a montage of every time Kevin Bacon walked out of an elevator.

Saturday, November 26, 2016


I’ve got three links: 

The first one is a description of evo moment 37.  The second is a Doom 2 custom map that someone built.  And the last one is an in depth breakdown on a challenge on Super Mario 64.  

What do all three of these links have in common?  They highlight people being absolutely unreasonably good at video games.  Don’t get me wrong though.  I think it’s fantastic that people are capable of being so good at anything and this includes video games.  However, I also can’t help but think that there is some change that can be done in society such that these people’s hard work and expertise can be more productive.  What’s going on in these tiny samples of video games at large is after all rather impressive; there’s much more where this came from.

I don’t think the answer is gamification.  More like finding opportunities for people with this sort of potential to have the leeway to be excellent in the world. 

Thursday, November 3, 2016

How Suicide Squad Should Have Started

I think there’s two problems with Suicide Squad.  The first is that they advertised it as a Joker movie.  The second is that Will Smith decided to play Deadshot as cool when he should have played him as flawed.  It’s pretty obvious why mis-advertising a movie is a bad idea, so let’s talk about the second issue.  Why shouldn’t Will Smith be a cool Deadshot?  The problem is that Deathstroke [1] is much cooler then Deadshot.  Eventually DC is going to make a movie with Deathstroke and no one is going to care about Will Smith and his much less cooler Deadshot.  Also Deadshot is much more interesting as a flawed person.  Deadshot never misses because he accidentally shot his brother while trying to shoot his abusive father.  This is also might be why he can’t bring himself to kill batman.  Because batman is a personal rival that reminds him of his brother.

So here’s the way I see fixing Suicide Squad.

The movie opens by retelling the end of the last movie.  The Suicide Squad is fighting Enchantress and suddenly Adam West in the 1960’s batman suit flies into the room and proceeds to punch everyone into submission (complete with POW!).

Cut to Joker in an abandoned warehouse.  He’s sitting at a table surrounded by his gang and Harley Quinn.  He’s just been telling his story about Adam West Batman.  The camera spins around to see a lone Deadshot.  Deadshot says, “Thats the stupidest story I’ve ever heard.”

It’s really hard for a movie studio to admit they’re wrong, but in this case they should apologize to the fans and this is the perfect way to do it while also making a great joke.

The movie rewinds from this point (with an audible rewind sound) to an earlier part of the film that we haven’t actually seen yet.  Deadshot is outside a warehouse with a group of people.  He says, “I’ll handle it myself.”  The response is, “You can’t do that by yourself.  That’s suicide.”  Deadshot gives back a grin.

Cut to the movie’s title:  Suicide Squad

Back at the warehouse we deliver some expositional dialog that let’s us know that Deadshot is brokering a deal between some unknown person and the Joker gang.  Several camera shots highlight the one-sided nature of the room.  The Joker has beefy, gun-toting psychopaths.  Deadshot sits by himself looking small.  However, he’s also completely unfazed by the potential danger to his person.

An explosion occurs and there’s a police raid on the deal.  It’s not going well.  Between Joker’s gang and Deadshot the police don’t have a chance.  However, batman shows up and is able to subdue the majority of Joker’s gang including Harley Quinn and Deadshot.  Joker gets away by stabbing Deadshot in the back (perhaps literally).

The rest of the movie is Joker doing something big chaotic and insane in order to rescue Harley Quinn from having to be part of the Suicide Squad as well as Deadshot trying to get revenge on Joker for betraying him by joining the Suicide Squad willingly.

The warehouse action scene is a great opportunity to do some cool camera work and tell about Deadshot’s past.  Before each shot that Deadshot takes you slow down time and show a flashback of him being abused by his father.  Cut back to the action and Deadshot takes another shot.  Finally Deadshot has the opportunity to shoot Batman and time slows down again.  However, this time instead of seeing Deadshot’s abusive father we see Deadshot accidentally shooting his brother.  Time speeds back up and Deadshot misses Batman.

This also lets us build up a morbidly humorous bit with Joker.  Joker can see Deadshot doing the slow motion flashback thing and “copy” it.  Joker approaches a swat team member with a knife, time slows down, we get a flashback of children opening a present with a puppy emerging out of it, cut back to the action scene and Joker stabs his victim.

The original Suicide Squad movie is about Enchantress breaking free and causing problems.  The real story should be something about Joker, but Enchantress trying to break free via covert actions would actually make a really great secondary plot to a Joker movie.  Each time Enchantress is let off her chain she sets up something without a clear purpose.  At the end of the movie we are finally able to put together what we were seeing during the entire movie.  A plot expertly executed that gives her freedom.  And then 30 seconds into her escape and revenge Joker pulls off some ridiculous attack that kills her.

Naturally people are going to ask where Batman is.  The movie can totally answer this as well.  Literally have someone from the Suicide Squad ask Amanda Waller why they just don’t get Batman to fix everything.  

The camera immediately cuts to a massive Batman fight scene.  He’s fighting a room full of men with guns.  In the background there’s a nuclear bomb with a 30 second countdown shown slowly counting towards zero.  

The camera cuts back to Amanda Waller and she says, “You can’t expect us to put national security in the hands of a crazy vigilante who doesn’t answer to anyone.”

It would also be great to deal with is why nobody tries find out who Batman really is.  Personally, I think secret identity drama is kind of silly and normally done wrong.  So far the DC cinematic universe has done a good job with this because it looks like everyone knows who Batman is, but no one can do anything about it because he’s a billionaire ninja.  Batman is unfazed every time someone says they know his secret because his name isn’t Bruce Wayne OR Batman.  It’s the sound his fist makes when it hits you in the face.  New Suicide Squad is going to expand on this.

“If Batman is such a lose cannon why don’t you just find out who he is and neutralize him?” asks Captain Boomerang.  Camera cuts to Batman punching people in the face.  Camera cuts again to a well dressed man in a suit.  He’s in city hall handing some documents to an unseen person, “And you *will* stop these ridiculous inquires into Mr. Wayne or we *will* move forward with our $200 billion dollar defamation lawsuit.”  Cut back to Batman punching people in the face.  Cut back to Colonel Rick Flag saying, “It isn’t that easy.”

You can also run this scene again with the Joker to humorous effect.  Random gang member asks why Joker doesn’t just find out who Batman really is.  Cut to Adam West in the BvS batman suit punching people in the face.  Cut to the earlier scene with the lawyer handing the unseen person the document in city hall … only for the camera to pull back showing the lawyer is really in a bad part of town and the unseen person is actually Joker.  The line about $200 billion is replaced with an identical one except with $200 quadrillion.  Cut back to George Clooney punching someone in the face in the 1960’s batman suit.  Cut back to Joker who says, “I’m not *that* crazy.”]

Obviously there’s a lot more work to be done.  But a “remake” of Suicide Squad with these sorts of elements would go a long way to fixing the issues with the movie.

Tuesday, September 6, 2016

Avi's Number

"... suppose we define f(X) over integers as taking the 1st digit from the left, then the 2nd, then the 4th, then the 8th, etc, so f(12345)=124 and f(12345678)=1248
Set y=f(f(f(f(f(…f(Graham’s number))))) such that there are the fewest number of fs such that y has less than a million digits." [1]

y is Avi's number.  Is Avi's number a prime or composite number?

Because we know the last digits of Graham's number, it seems to me that there might be a way to determine if the last digits of Avi's number is definitely not a prime.

Monday, September 5, 2016

Pistils at dawn

A man with a beard is being harassed by a man in a top hat.  He has had enough and stands up forcefully, “That does it!  Pistols at dawn!”

Cut to black and the sounding of a rooster crowing.  We slowly fade from black and the man in the top hat is revealed holding a .50 caliber desert eagle.  He looks confident and handles the weapon like an expert. 

The camera jumps to the man with the beard.  He’s holding a single petunia.  The camera jumps back to the top hat man who shows a look of incredulity and superiority.  He knows how this duel is going to end. 

Another rooster crows and the bearded man begins to sprint forward.  The top hat man seems somewhat surprised and opens fire.  The bearded man makes a dramatic gesture with the petunia and successfully deflects the incoming bullet with a shower of sparks.  The top hat man begins to panic and fires repeatedly.  The bearded man expertly waves the petunia to deflect each incoming round.  Sparks shower his path as each bullet collides with the petunia and is propelled harmlessly away.  We see one more panicked look of horror on the face of the top hat man and the bearded man has reached him.  An enormous stroke of the petunia cleaves the top hat man in two.  The duel is over.

Cut to the bearded man on a bicycle leaving the scene of the duel.  A quick camera jump down to his feet reveal that they are resting not on normal bicycle pedals, but instead this bicycle uses large rose petals to turn the wheels.

Always a good decision

So the opening shot is a man sitting in his car; it’s dark outside.  The glass on the windows are kind of fogged up and the overall atmosphere is one of heat and wetness and dirt.  His eyes betray his debauchery; he’s had a lot of alcohol tonight.  He’s looking into the rear view mirror and we can see behind his shoulder; there’s flashing police lights.  However, he seems to be looking more at himself than at the flashing lights.

Next shot is uniformed legs in boots walking surely and fully of confidence.  The legs are in no hurry, but they carry an air of speed and certainty.  These legs belong to a man whose face we never see.  A man who knows his job.  A man who knows that his job saves lives.  A man who knows exactly what he’s going to find when he gets to his destination.  The camera pans upward as we get to a car.  All we see of the man is his back.  This is a police officer and he’s about to knock on a car door to deliver a DUI.

We’re back in the first car and the police man is knocking on the window.  The first man rolls down the window with dread and inevitability written on his face.  A shadowed face moves toward the open window.  “Had a few drinks tonight?”  It comes across more as a demand; a demand for a confession of wrongdoing.

The man looks over to the passenger side seat of the car to a as of yet unseen occupant.  An accusatory look, but also a pleading one.

The camera cuts to the passenger.  The Samuel Adams guy sits in the passenger side seat.  You know the one from those commercials.  Wearing old-timey clothes and accompanied by a stein full of beer.  “Always a good decision.”  Yeah, that guy.  He’s sitting silently in the passenger side seat of this guy’s car.  Holding a stein full of beer.  He’s not saying anything, but he has a goofy smile that takes up most of his face.

The camera cuts to a blank screen.  A voiceover begins, “Drinking and driving is never a good decision.  Please drink responsibly.”  

The camera cuts back to Samuel Adams being handcuffed, the stein with contents spilled is tipped onto the ground.

Wednesday, July 6, 2016

Affine type systems and giving away owned fields

The problem

If you have an affine type system, then objects and closures that return (from a method in the case of an object and from a function call in the case of the closure) an owned field cause major problems.

Object Example:

class Blarg 
    private owned<int> x = 0;
    public owned<int> GetX()
        return x;

let b  = new Blarg()
let x = b.GetX()
let x’ = b.GetX()

You can get around this problem by breaking encapsulation.  If the private fields are public and you grab them directly you can get the lifetime analyzer to ensure single ownership of a field.  However, it would be nice if we could keep encapsulation and also breaking encapsulation isn’t really an option for closures.

The Proposed Solution

Dependent types, row polymorphism, affine types, and macros.  Using an affine type system you can modify the type of the  object (or closure) that you’re dealing wth after calling a method on it.  I think the basic idea in literature is called session types.  So if you knew which field you were giving away statically, then you could pass back a new object type that didn’t have the owned field present.  Of course you’ll have to redeclare the object in a new variable because it will have a new type, but that’s where the macros come in handy.  Basically, just redeclare the object in a new (hidden) scope with the same name and hide all the evidence that it’s going on.

Manually creating a bunch of different objects to handle any possible owned field being given away seems tedious, so I’m suggesting that you use row polymorphism to track the different possible objects.  Typically you use row polymorphism to preserve fields that aren’t required by some method, but I’m also suggesting you tweak it some such that you kill off the owned field in the returned object/closure type.  This should take care of any situation where it’s statically knowable which field is being given away.

However, maybe you don’t know statically which field is going to be given away.  So you throw in dependent types and force all methods to be total to ensure that all programs must be statically analyzable.

Analysis of the proposed solution (plus some musing)

It feels like it would be really difficult to pull off.  And if you pull it off I’m not sure that programming in that style would be productive or result in more comprehensible code.  It seems like this method would preserve encapsulation and closures.  And I also think it’s interesting that encapsulation and closures seem to fight against an affine type system.  It’s also interesting that closures immediately start working like you would want them to if you allow copying any field that they return (or maybe it shouldn’t be *that* interesting because closures come from lambda calculus and beta reduction is just textual replacement).  

Encapsulation and closures seem to live in a different world than affine types and it looks like getting them back in is a bit odious.  I wonder if there isn’t an analogous idea that we can embed in an affine typed system such that we get all of the benefits of encapsulation and closures without needed to do backflips to handle returning owned fields.

[] - Okay, let’s convince ourselves that affine type systems by themselves are probably not going to be improved such that you can statically track the lifetime of an owned field in order to invalidate programs that give the field away twice.

class Blarg
    private owned<int> x = 0;
    private owned<int> y = 0;

    public owned<int> GetUnknown( int z )
        if ( blah_blah_halting_problem( z ) )
            return x;
            return y;

let dynamicInt = TrueRandomNumber()
let b = new Blarg()
let x = b.GetUnknown( dynamicInt )
let x’ = b.GetUnknown( dynamicInt + 1 )

Okay, I’m pretty sure there isn’t a static analysis technique in existence that will be able to determine whether or not single ownership of Blarg’s inner fields is being respected.  No lifetime analysis technique should be powerful enough to defeat the halting problem.  You’ll need something stronger like a non-turing complete language with dependent types.

Thursday, May 26, 2016

Cognitive complexity

I’ve been worried about what I’ve come to call Cognitive Complexity for a while.  In short, cognitive complexity is why some problems are hard for people to solve.  This stands in contrast to what computer science typically is concerned with when it talks about Complexity.  Algorithm complexity in computer science is concerned about how many steps of computation or how much space a problem takes to solve.  Solving a problem in a very simplistic way may have a very high algorithm complexity, but it might be easy to understand and vice versa.

One might hand wave away Cognitive Complexity by saying everyone has different cognitive abilities and experience levels.  A complex problem might just be a lack of experience or require a specific perspective in order to become a simple problem.  However, I think there might be something more fundamental going on.  For sure there’s some relative things going on where experience, perspective, and skills will make a complex problem easy where a simple but unfamiliar problem may be harder.  I think, though, that all things being equal there are problems that really do take more cognitive effort if you could somehow level the cognitive playing field.

There’s at least several ways to look at this.  My focus is primarily about what makes different programming problems complex.  Maybe that’s about a problem you’re trying to solve with a program,  maybe that’s the way you’re trying to solve the problem with a program, or maybe it’s something you’re trying to understand about a program.  In the programming context, I think there’s a few different ways you have to look at why something might be complex.  I’m going to talk about the first one here and then add the others in future blog postings.

The first type of cognitive complexity I want to talk about is the complexity of the inputs and outputs of some sort of black box.  Maybe this is a mathematical function that is defined completely by the nature of its inputs and outputs, maybe it’s a procedure where you don’t have the source code, or maybe it’s some sort of transform where the implementation doesn’t tell you as much as the before and after pictures.

So far I don’t have an algorithm setup to generate a Black Box Cognitive Complexity metric.  And the rules I’m about to go over don’t really have an absolute ordering in their importance.  

Given some sort of function (the function being your black box) you’ve got inputs and outputs.  With the inputs we can generate a set of valid inputs.  We’re going to call this Valid Space.  For what’s coming next it’s probably useful to be able to construct a metric space [1] or a topological space [2] with the input space to the function (where the Valid Space is going to be some sort of subspace).

Rule 1:  If Valid Space is equal to the set of all inputs (i.e. the domain), then you’re dealing with low complexity.  

Rule 2:  Maybe your Valid Space isn’t equal to the domain.  Well in the next best thing is to have a Valid Space that has minimal holes [3][4].  A hole in the Valid Space messes with your intuition about the black box.  Some inputs are fine, but if you travel through the valid input space in an arbitrary fashion you’re going to encounter illegal inputs, which break your black box in either overt or covert ways.  With minimal holes you also minimize the edge cases you need to keep track of.

Rule 3:  Your Valid Space should be a path connected or well connected space [5].  Having a Valid space that’s path connected means that there exists some function that will let you index through the entire space.  This isn’t as good as having no holes in your Valid Space (because then you can jump around arbitrarily), but it’s the next best thing because instead of memorizing the entire Valid Space you just have to memorize the function that generates the entire Valid Space.  Of course if you can’t be path connected being well connected is probably next best because then your Valid Space is just one “chunk”.  Not having to worry about special disjoint regions of inputs seems beneficial to overall understanding.

Rule 4:  The function of your Valid Space to the output of the black box should be continuous [6].  The general intuition of a continuous function is that small changes in inputs will correspond to small changes in outputs.  This is beneficial because it makes life easier on your intuition.  If changing the input on your black box just a little results in radically different outputs from the black box, then it’s much harder to use the outputs for some other black box.  Predictability leads to lower cognitive complexity.

Rule 5:  The function of your Valid Space to the output of the black box should “preserve paths”.  I don’t really have a great definition for this one right now, but I think it’s roughly the same as saying that your black box should be a fully faithful functor [7].  The basic idea is that if you have some sort of system with relationships or transforms and you send that system through the black box, then the resulting system should have the same sort of relationships (or else you should expect trouble). 

My motivating example for Rule 5 is as follows:  Let’s assume that there exists a black box that takes a spoken language and produces a corresponding written language.  With spoken English, the letter “N” sounds like the letter “M”.  Now let’s use our black box to create written English.  In written English the letter “N” also looks like the letter “M”.  This is what I mean by “preserving paths”.  The spoken “sounds like” relationship is converted into the written “looks like” relationship and exists for the same letters in both systems.  This seems like a good thing for English because if you misspeak the wrong sound (“N” vs “M”) it will be written in such a way that miswritten word will sound similar to the correctly written word.

An example of where paths are not preserved, resulting in a problem, is with name lookups in databases.  The black box we’re considering is either written English to database lookup function OR spoken English to database lookup function.  With both written and spoken English, “N” and “M” are similar and can be confused with one another.  However, a database lookup function considers “N” and “M” to be completely separate entities.  The relationship between the two letters/sounds is destroyed.  This is problematic because it means that if your name is misspoken or miswritten it will be very hard for a person to notice that something has gone wrong, but the database will fail to locate your personal information.  Rule 5 asserts that black boxes that do not preserve paths will create situations that are more cognitively complex.

Wednesday, March 9, 2016

Why I think there aren’t more miracles

Imagine you’re renting a house.  The tenant doesn’t keep very good care of the lawn because he can’t afford to fix his lawn mower.  Now the tenant is going to be imprisoned by the city for reckless endangerment via extreme eyesore (also imagine the the mayor is a neat freak and is big on totalitarian laws).  

So you go over to the tenant’s house and spent your own time and money to fix his lawn mower.  And then you spend your time and effort to mow the lawn.  You even pay for the gas.  Twenty minutes later the lawn police come by to arrest your tenant, but when they see the immaculate lawn they realize they have no power here and move on empty handed.

The next day your tenant brags to everyone about how he cleaned up his lawn before the lawn police showed up.  He really showed them.  He doesn’t mention anything about the heroic efforts of a certain landlord.  In fact he even talks about how much he showed the landlord.  That landlord really wanted to evict him, but now he’s not going to get the chance.

How upset are you going to be.  Upset enough to have the tenant arrested over the city’s anti-bragging laws (imagine that mayor also doesn’t like bragging)?  

Okay how about this instead.  You don’t fix the lawn mower.  Instead you slip some money under the tenant’s door so he can afford to fix the lawn mower himself.  Or maybe you let one of your contacts know that there’s a certain tenant who could use some odd jobs so he could afford a lawn mower repair job.  As your involvement becomes more indirect and harder to recognize as help by the tenant, the less offensive a bragging tenant is.  In fact if you anonymously sent a job his way he wouldn’t even suspect that you’re the one behind his deliverance.  And when he brags he’s doing so in his ignorance and from his point of view correctly.

I think that’s the reason why God doesn’t often use flashy miracles, but we usually see people delivered in what looks like coincidence or even prudent (but unreasonably lucky) planing.  However, so far I’ve just put out a story, so let’s see some scripture.

God wants us to live, but people seek after evil

So the setup is that I assert that God wants everyone to come to salvation.  And we see that in places like 1 Timothy 2:3-6 “This is good, and it is pleasing in the sight of God our Savior, who desires all people to be saved and to come to the knowledge of the truth.  For there is one God, and there is one mediator between God and men, the man Christ Jesus, who gave himself as a ransom for all, which is the testimony given at the proper time.”  And 2 Peter 3:9 “The Lord is not slow to fulfill his promise as some count slowness, but is patient toward you, not wishing that any should perish, but that all should reach repentance.”  

However, we also see that people don’t seek after God in places like Romans 3:10-18, Psalm 53, and Psalm 14, which all say the same basic thing (i.e. no one seeks after God).  But if you also look at Ezekiel 18 (specifically verse 23) we see that God really wants people to turn to him:  “Have I any pleasure in the death of the wicked, declares the Lord GOD, and not rather that he should turn from his way and live?”

Ignoring miracles is not safe, but it’s what we’re good at

Now what happens if people ignore God, but instead seek after evil.  Well, I think Jesus spells it out pretty clearly in Matthew 11:20 - 24
Then he began to denounce the cities where most of his mighty works had been done, because they did not repent.  “Woe to you Chorazin!  Woe to you, Bethsaida!  For if the mighty works done in you had been done in Tyre and Sidon, they would have repented long ago in sackcloth and ashes.  But I tell you it will be more bearable on the day of judgment for Tyre and Sidon than for you.  And you Capernaum, will you be exalted to heaven?  You will be brought down to Hades.  For if the mighty works done in you had been done in Sodom, it would have remained until this day.  But I tell you that it will be more tolerable on the day of judgement for the land of Sodom than for you.”

So it’s not good to ignore the miracles of God, but is trusting in the miracles important or is the important thing trusting in God?  Luke 16:19-31 tells the parable of the rich man and Lazarus and the end at verse 31 says an interesting thing about miracles:  “He said to him, ‘If they do not hear Moses and the Prophets, neither will they be convinced if someone should rise from the dead.’”  Just like we saw that no one seeks after God it seems that people also have trouble believing even if they see a miracle.

My take away

I think I first started thinking about this while reading the Old Testament.  People talk about Old Testament miracles like they were something that happened all the time, but my experience with reading the Old Testament is that they are actually kind of rare.  It seems like very often God delivered people by throwing their enemies into confusion, emboldening the righteous and terrifying the wicked.  Like with Gideon in Judges 7.  

Thinking about the scripture that I mentioned here, it makes me think that God often offers deliverance in a way that’s not flashy or really all that direct.  But I think that happens because just like the tenant in my story it’s easy for us to forget our helper and instead believe that we are the ones who saved ourselves.  An act that may bring greater and deserved wrath.

All scripture quotes are taken from (ESV).