- It never forgets. Think of it like source control but with transactions replacing commits.
- Time is a first class citizen. This is really an outgrowth of the above feature but is worth pointing out on its own.
- It uses the incredibly compose-able Datalog query language instead of SQL and can include clojure.core expressions in its queries.
- It can easily be used as a graph database.
The “Curious Case of the Tiny Thieves” is being joined in progress and so a little backstory is necessary:
The dexterous and rather handsome rouge Lutz was investigating these “Tiny Thieves” with his band of mostly merry adventurers: Raest a cleric of Palore, Bran the mighty barbarian, Torment the super naive atheist paladin, a wild magic user called Very Forgettable Name, and Iesha or Aida or Ada AKA: the old lady magic user who casts a lot of sleep spells. They discovered the little thieves trying to abscond with their solid gold cat statue which they received as a gift for returning a talking cat to an old lady who was really a dragon in human form — long story.
Turns out the whole town hated these mini scofflaws as they has been on a veritable spree of the crime variety. A reward was offered and pursued by our fairly fearless heroes. As far as they knew the criminals were: 6-8 inches tall, never seen in full light, and immune to sleep spells. Lutz made a super cool trap for these minute miscreants but they avoided it perhaps because the gang had left the lights on. Seems obvious in retrospect… They did find tiny foot prints in the fireplace the next day! They were also found the same footprints the next room over where a very expensive necklace had been stolen. Tiny thieves: 1. Adventurers: 0.
That was all prologue, believe it or not.
Upon investigating the roof and dirt surrounding the “Sleepy Dragon” the team supreme found evidence of rope used to climb down the chimney and footprints leading away from the inn. Following the trail of regular sized footprints the gang pretty much got lost right away. Sigh. The trail was definitely headed south and that’s about all they knew. In that direction lay: The bad part of town, The duke who had suspiciously never been robbed, and a new unknown church that ministered to the poor in said bad party of town. “Why not stop in at the working class church and ask around?” thought pretty much everyone. Raest, who apparently has more money than sense, decided that 5 gold was an appropriate bribe/offering to a dirt poor chump. Not 5 copper, mind you, but 5 gold. As in 500 copper. Bran had been invited in to the small place of worship by Raest in a move that was so very sensible it belied his previous insane tipping/bribing strategy. I feel like I’m focusing on this too much… But seriously 5 gold. FIVE DAMN GOLD. It makes a rouge wretch to think of it.
Iesha noticed the lay priest was totally lying about everything with her wicked awesome old lady perception skilz. However that information was disclosed after Raest and Bran had disappeared into the hovel/church.
Lucky Lutz, the super awesome leader of the group, had wisely decided to keep his ear to the door and therefore heard screams from within. First through the door and down the stairs Lutz sprinted only to be held up by the barbarian’s massive size in the stairwell. Bran had been stopped by…
The Tiny Thieves! They were clearly automatons (explaining why they could not be put to sleep) and surprisingly strong as they managed to subdue the brick shit house that is Bran and even Lutz: the slipperiest rouge in the land. Unfortunately for those wee jerks, Torment has a bewildering talent with his net. He effortlessly swept them off of Lutz from 10 feet away!
But what of Raest and his terrible ability to estimate bribes? He was in another corner of the savage basement of heck getting all perforated by the lay priest of a bad guy god. That’s right: Raest had paid 5 gp for an invitation to an underground murder party.
Raest cast a quick command spell which, as you may know, can be only one word. That word was “retch.” Cult-y McJerk Face then heaved up his lunch while getting pulverized via mace to the face. He died fast in a bewildering flurry of vomit and steel. Despite this early success Raest was lit up like a Christmas tree by a bunch of magic bolts from a pair of magic jerks. Torment barely missed falling into a pit trap and then charged the head cult guy who's name probably starts with a V. Sadly V(icky?) introduced Torment to the Xmas tree experience mortally wounding the paladin. Torment collapsed to the ground unconscious and bleeding out. Bran and Raest kicked ass for awhile but succumbed to the combined forces of the tiny thieves and dickhead magic users. Low on health, they were put into a magical sleep and were soon to be easy pickings. Surely Lutz could have saved the day had he not been magically blinded and therefore unable to help his friend Torment dying just a few feet away. Aida was upstairs drinking water and that other guy was investigating the latrine. Really. They may or may not have had a slap fight while getting down the stairs.
Things looked dire for our rag tag group of misfits until the cult leader made a mistake. Which was good because the only thing stopping his dance of diabolical destruction was the late arriving, but very hydrated, team of Aida and wild magic guy. Did V(oldemort?) over estimate the strength of his magic portal’s vacuum power? Or did he simply slip like the jackass he was and always will be? Maybe we’ll find out next time because everyone but the old bat and a mostly dead Torment got sucked through the portal into another land.
Another land of suck. 5 seconds of being in the new place revealed 2 things:
1) The new bad guys are plentiful and way into lacquer armor.
2) Lutz and company are to be offerings of some sort. Which doesn’t sound good at all.
- To get the URI-map (A map of how to call the service for all resources)
- Actually make the call (Using the above map)
- What? There’s a 3? Yup, that second call could return another URI-map
- It could continue
Recently I re-tweeted this thought from Pete Holmes:
top reasons for divorce. 1984: 1. financial problems. 2. religious differences. 2014: 1. constant inclusion in group texts. 2. no wifi.because I'm in the middle of a communication crisis. I do "knowledge work" so it’s considered inappropriate to have a device constantly making little beeps and boops while the person next to me is working on some insane LibXML (you don’t wanna know) bug. Programming requires extreme concentration and distractions are to be avoided.
— Pete Holmes (@peteholmes) September 14, 2014
The rub of it is that I’m “on call” if our software product bursts into flames. Therefore, I must keep my phone in a mode capable of disturbing me so I don’t eat lunch, play ping-pong, or just code right through the disastrous failure of our software.
This used to be fine back when text messages were either:
- Time sensitive
- From one person
Why not a mass email? Why do I get group texts trying to plan something days or weeks away? Shouldn’t that be an email thread? The answer is as obvious as it is sad-making: People have given up on email. For every Inbox Zero zealot, there are a hundred people who’ve essentially let their inbox run wild with clutter. Missed important emails because of that clutter? — better move to text messages For Everything. Of course, this leads to cluttered text messages. Plenty of times I’ve been furiously searching through my email to find someone’s reply only to remember “Oh, they’re one of those text-y people, I better scroll through all the various group texts threads they’ve been involved in… Sigh.”
A small aside: Some people don’t have unlimited text messages on their phone. The horror, right? My boss consistently crashes through her text message limit b/c of “friendly” group messages.
The problem of communication clutter isn’t going away. Ever. Abandoning email for texts just moves the problem. I implore you to take charge of your inbox, people. Getting emails you never read? Unsubscribe or Block! Can’t bring yourself to do that? Well, how about creating a rule that moves your daily…
Hold on, got a text… yup, a silly friendly chatty one from a friend who never emails anymore. I really like this guy but such frivolity is a tweet or an email or a Facebook or a Whatever but not a text that demands my attention.
Where was I… Oh yeah, create rules in your email client of choice that automatically move “less often read” messages to a folder for later (read: never) reading. If you’re still getting a flood then you must keep going. Unsubscribing, blocking, and rules are your new watchwords. If you can’t handle this fire hose of information now what do you think is going happen when everyone can send “animated emojis” on a whim from their Apple Watch (or some other wearable computer thing)?
Your “inbox” is not just your email inbox. It is Every Damn Message you receive in Any form. They all via for your attention and giving up on any one communication form only annoys your friends while providing, at best, temporary relief.
Apology: I’m sorry if you’ve sent me a group text in the past and see this as an attack. I really do want to hear about your cats, see your kid’s pics, and ponder your stray thoughts… In an appropriate medium. Does that sound bitchy?
Episode 4 “Time to Exercise!” is out right now! Search for it on your favorite podcast app or check out our free temp website here: http://softwareapprenticeship.libsyn.com
With 4 weeks under his belt (plus 9 weeks of Dev Bootcamp) our apprentice, Jonathan Howden, continues his quest to become an enterprise software developer at an amazingly rapid pace. Can a dedicated man become a good developer without a college degree? Tune in and find out (spoiler: he’s doing well but it’s intense)
Topics this week:
- Doing push-ups to break up the lethargy of coding
- Migrating from Authlogic to Devise/Warden and the perils of using a framework’s column in the database for activation.
- Why senior programmers avoid becoming mentors
- Rails’ Asset Pipeline
- The usual screwing around and one censored F-bomb (sorry - it was me).
Yesterday we all sat in a room and reviewed Jon’s chess code (his outside of work coding project). I’ll try to put up a more detailed article about it soon, but in brief it went well. It’s fun to watch a junior developer try to encode all the crazy logic of chess while keeping the code clean, tested, and understandable. Other than making the classic mistake of mocking/stubbing the very object he was testing, Jon has some pretty readable code that will “mostly” let 2 people play chess against each other.
Episode 5’s in the can (on the SSD?) and we’re recording episode 6 later today with Dave Hoover, co-founder of Dev Bootcamp. Jonathan attended Chicago’s DBC in September of 2013 so Dave will get to check in with how Jon is doing in the “wild.” Also, Dave and I worked at both ThoughtWorks and Obtiva together so it should be quite an interesting conversation.
I really wanted this to be a weekly podcast but here we are at the end of the 9th week and only recording our 6th ep. Now that we’ve been through the recording and editing process a few times it should be easier to stick to a weekly schedule. Even if we weren’t recording the conversation I would still have a weekly wrap up with members of the team and the apprentice — it is a very nice way to sum up the week and lessons learned. It's sort of a weekly, recorded, low stakes retrospective.
The views and opinions expressed here are my own and don’t necessarily represent positions, strategies, or opinions of Backstop Solutions Group.
The views and opinions expressed here are my own and don’t necessarily represent positions, strategies, or opinions of Backstop Solutions Group.
Recently we released episode 3 of the Software Apprenticeship Podcast but had to pull it back for re-editing because of some problems with how developers talk to each other. Developers are not kind to ANY code. Even our own. Especially our own. Sitting next to a dev while he or she discusses the code they are working on can be a shocking experience. Words like “Crap,” “Junk”, “Garbage” and many worse are used often. A lot of this type of talk was on episode 3 and when someone at Backstop (who’s job it is to protect us from ourselves and comments taken out of context) heard it they asked us to edit the podcast to take out some of the more offensive comments. This is why episode 3 sometimes fades into music and then comes back mid-conversation. Sorry about that.
I don’t know where I first heard the definition of developer as “Whiny Optimist” but it is uncannily accurate. We developers are forever complaining about previously written code. Code is awful. Code is crap. Code is the worst spaghetti wrapped around horse manure we’ve ever seen.
We couldn’t go on if we thought we’d have to live out our lives fighting the very thing we create. There is this optimism about future code. It will be bright and shiny. The next project to re-write the
Every year I get better at what I do, so even code I thought wonderful 3 years ago can be “crap” to me today. I look back and see a developer who didn’t keep orthogonal concepts separate who coupled code that should not be coupled and I am sad. I regret my past inefficiencies and curse them.
How bad is this code really? Backstop’s code is rigorously tested many times automatically before being poured over by humans. Any code change in my product gets tested first on my machine (by automated tests) then on another “Build Server” (which runs the tests I was supposed to run and a bunch more), then another series of “Regression Servers” will run some even longer regression tests that literally use the app as our customers do. If it passes all that then we’ll have our Quality Assurance people go over it again to make sure the machines haven’t missed anything. The last thing the Q.A. people do is write a new automated regression test to make sure this functionality doesn’t break in the future.
What the heck are we complaining about then? The software works! It helps many people make a lot of money, it makes the company money, and is a leader in the industry. We developers are, in some ways, a bunch of ungrateful jerks.
Let me see if I can explain why. Writing software that solves hard problems is hard. Duh. There are only so many people who can do it and we struggle through. Writing software that solves hard problems and can continue to accept new features easily is the HOLY GRAIL of software development. Rarely has it been done even though every company claims their code is the “best in the industry.” If you were to get your hands on the unedited version of episode 3 you would hear a lot of developers complain how we wish we had written code in the past that could be easily changed today. We might even call such code “garbage” but what does “garbage” really mean? In our app it has come to mean code that works, is well tested, but resists change more than we would like. We are whining about having to do more work. If only our past selves had properly separated the concerns more, if only there was more time for refactoring. But some day we will reach that shining castle on the hill. And there will be ponies and rainbows for all.
- ▼ November 2015 ( 3 )
- ► 2014 ( 6 )
- ► 2010 ( 17 )
- ► 2009 ( 91 )
- ► 2008 ( 48 )
- Code ( 61 )
- Apprenticeship ( 57 )
- Rails ( 53 )
- commentary ( 48 )
- Ruby ( 31 )
- RSpec ( 20 )
- Metrics ( 17 )
- metric_fu ( 13 )
- Flog ( 9 )
- complexity ( 9 )
- testing ( 9 )
- RailsConf2009 ( 8 )
- git ( 8 )
- RubyConf2008 ( 7 )
- test_coverage ( 7 )
- Bugs ( 6 )
- Mocking ( 6 )
- craftsman_swap ( 6 )
- not_code ( 6 )
- Agile2009 ( 5 )
- Amazon ( 5 )
- refactoring ( 5 )
- ActiveRecord ( 4 )
- JRuby ( 4 )
- Linux ( 4 )
- LoneStarRubyConf2008 ( 4 )
- RailsConf2010 ( 4 )
- Saikuro ( 4 )
- XP ( 4 )
- churn ( 4 )
- design ( 4 )
- Fixtures ( 3 )
- LoneStarRubyConf2009 ( 3 )
- Math ( 3 )
- Obtiva ( 3 )
- RailsConf2007 ( 3 )
- Rake ( 3 )
- Rcov ( 3 )
- RubyKaigi2010 ( 3 )
- RubyMidwest2010 ( 3 )
- Svn ( 3 )
- legacy_code ( 3 )
- Flay ( 2 )
- GLSEC ( 2 )
- Mingle ( 2 )
- SQuiD ( 2 )
- TextMate ( 2 )
- Windows ( 2 )
- WindyCityRails ( 2 )
- lean ( 2 )
- Backstop ( 1 )
- Bundler ( 1 )
- DUST ( 1 )
- EVDO ( 1 )
- GC ( 1 )
- IO ( 1 )
- MacRuby ( 1 )
- MongoDB ( 1 )
- OSS ( 1 )
- OSX ( 1 )
- Routes ( 1 )
- RubyWorks ( 1 )
- Tomcat ( 1 )
- attachment_fu ( 1 )
- cache-fu ( 1 )
- citcon ( 1 )
- consulting ( 1 )
- craftsmanship ( 1 )
- css ( 1 )
- db ( 1 )
- iPhone ( 1 )
- interview ( 1 )
- mac ( 1 )
- memcached ( 1 )
- memprof ( 1 )
- oracle ( 1 )
- ord_sessions ( 1 )
- ostatus ( 1 )
- pairing ( 1 )
- redis ( 1 )
- restful_authentication ( 1 )
- singleton_class ( 1 )