Author. Gamer. Thinker.

Sunday, August 4, 2013

Good Programers Think In 4D

I was musing about the different developers I meet, and I began categorizing and labeling people. Never a nice thing to do out-loud, but something that can help you understand why some people are so much more successful than others as software developers.

So, this is where I get theoretical, metaphorical, and a little pretentious.

I think that in college they teach you syntax. If an application was a plane, syntax would be what gives it lift -- it gets your code off the ground. If you don't know syntax, the program won't compile and writing working code is hopeless. Every professional developer knows the syntax of the languages they work with. It is fundamental.

Another skill you are taught in college are solutions or patterns to typical problems. Problems can be broken down to smaller problems and each smaller portion solved with simple bits of code. Everybody makes a big deal out of design patterns and algorithms, but they are simply the fundamental tools of solving problems. The more tools you have, the quicker and more readily you solve problems. If we stick with the airplane metaphor, this is the skill that gives your development cycle thrust. It propels you forward.

A skill you aren't likely taught in college, but learn either on your own or by having coworkers nag the crap out of you, are destructive habits and patterns that lead to bugs. This area of development tends to be filled with subjectivity, misinformation, and good intentions. Poor developers will cling as tightly as they can to the building block patters they know, but not understand why that -- when they put these perfect patterns together -- they don't get working software. In our airplane metaphor, the ability to avoid common obstacles gives our development cycle lateral movement, allowing us to bank left or right and find a workable course toward our destination.

The fourth and most common mental skill to be a "good programmer", in my estimation, is the ability to see ahead of your current position in the development cycle. You've plotted your course by laying out a great design, avoided habits and anti-patterns that might making your application fail to work properly, and it is syntactically amazing. Then everything goes wrong because you didn't see the ramifications of one little change. You put in a line of code in one file to adapt to a new requirement and -- wham! You smash into a wall of bugs. First, one other completely unrelated feature stops working, then you put a bandaid on that only to notice more issues. A good programmer will know before they make a change to the code (a change necessary due to requirements or other bug fixes) what the ramifications are and whether the change will cause future issues. In our airplane metaphor, it's about the pilot thinking ahead, seeing problems before they are really problems and avoiding them. For our development cycle, that see-and-avoid mentality when making a change saves time, money, and a lot of late nights at the office.

That's all it takes to be a good developer. Sounds easy.

There are people who are more than "good developers" though.

Not everybody has a mind for five, six, and seven dimensions. So this may not be the best way of describing this whole concept. I've given you four dimensions so far, and I hope it wasn't too much of a stretch. Don't feel bad if it is. It doesn't make you dumb. It's just a concept that isn't natural to everybody. Unfortunately, I'm doomed to continue this description. That fourth dimension of time -- seeing ahead of the development cycle assumes that if you make the changes you plan to make that no outside factors beyond your current knowledge will influence your development cycle. So, we must continue on!

A fifth dimension is the lateral possibilities. The ability to see alternate patterns that achieve the same goals, but have different tradeoffs. Sure, you know a few design patters and can string a few algorithms together to make something happen. Good for you. But solutions aren't black and white. Every solution has tradeoffs. Seeing which perform better, save memory, and cost less time or money to develop give us a whole line of possibilities. What problems might arise from each choice, and what are you going to do about it? This dimension is simply about understanding that no one solution is perfectly right or wrong and that every one has tradeoffs.

A sixth dimension is the forward possibilities. The ability to prepare for features that nobody has thought of yet. To provide the extensibility and forethought in your design and choices of lateral possibilities that you account for the likelihood and needs around requirements that may someday exist. These are the non-technology possibilities -- the business and people factors that impact the development cycle by creating new, profitable, and interesting directions for the software you build.

The seventh dimension is the vertical possibilities. The ability to look at the two dimensional array of possibilities in the fifth and sixth dimension, and see the impact of evolving technologies and the ecosystem in which your software exists and must adapt and survive in. When a project starts, you might think you know what hardware your application will run on, which database you'll use, which browsers you'll support... whatever. It is easy to take this for granted. Knowing that some of your choices will be more restrictive and unforgiving to changes in the technological ecosystem your application lives in could be costly.

Do the best developers think in twelve dimensions? I don't know. I thought of these seven while eating a burrito at Chipotle for lunch today without any real effort into digging for deeper arrays of meaning. Seeing an eighth dimension is actually a fair amount of mental gymnastics and too much heavy lifting while enjoying lunch.

I look at the young people coming out of college and the people on their second or third career, and I want them to know that there is more to development than syntax. That they can be a good developer, but that we should strive to be more.

I tried to break down and simplify that which I don't really analyze when I myself am making choices. I simply study the problem and evaluate the myriad of choices before me and select what I think is the most pragmatic and likely choice. After all -- being able to see all of the possibilities, if there is such a person, isn't as important as being able to find the most probable and pragmatic path through to the successful release of your software.

You don't have to build a solution that can be extended in every possible way -- sometimes it is enough to know that if that possibility exists, you haven't made it impossible. Acknowledging and knowing what you are doing is part of it. We mitigate risks, we do our best, and in the end, we make the best choices we are able to. I don't always make the right choices, but with every passing project I become better at it. You learn from experience what outcomes are more probable and it helps you make those best decisions.

I won't say "correct" decisions -- because saying that one solution is right or wrong is something that only a person who doesn't see possibilities can dare say.

Pen and Paper Birthday Adventures

My birthday is coming up in a few days and, to celebrate the big four zero, a few friends came over to play games. We started off with some League of Legends, in which the twenty-one year old in the group promptly crushed us senior gamers, and then transitioned to the cooperative game Torchlight II. Both of these endeavors were a ton of laughs and good times.

At the beginning of our get together, we spent a little time ogling the pictures for the next Everquest... er... Everquest Next. (

After daydreams of old EQ raids, we started playing some LoL. I had never actually played a 1v1 against any of my friends in League of Legends, despite having played it countless hours and owning all of the champions. I knew that I would get crushed and that outcome was not a surprise, but still a great and fun experience.

Torchlight II is so fast paced and frantic that it is tough to really absorb the storyline in a multiplayer setting. You grab quests in World of Warcraft-esque click-accept-as-fast-as-you-can fashion and then continue on hacking and slashing. The game is attractive looking and it was just entertaining to spend time with friends, but I think that as a game, it wasn't very immersive in this format. We moved at breakneck speed and there wasn't time for reading quest text or even really making detailed and informed decisions about which skills might be best. Just keep pushing and clicking. We would have had an equal amount of fun playing Monopoly.

However, after about seven hours of digital gaming, my good friends indulged me in a little old fashion pen and paper gaming. In anticipation of this get together, I had invested about three hundred dollars in all of the latest core Dungeons and Dragons books, dice, and tools. A very expensive investment for one night of fun with little chance of using those books ever again (if my purchase of the third edition of Dungeons and Dragons books is any evidence. I think we played one time.) Forget the money, though. It was a blast.

I suspect that if you were trying to play on a budget, you could get away with buying the Player's Handbook, the Monster Manual, and then getting a one month subscription to the D&D online site that lets you build characters. ( This tool, though a little buggy, is totally worth the ten bucks. Hell, if you really know the rules, this is the one and only thing you need to play in many situations -- well besides either dice or an app for your phone/computer that acts like dice.) Having the official Monster Manual is not essential, but I would definitely recommend it. If you don't really know the rules, you probably should have the Player's Handbook handy.

I spent roughy twelve hours rolling up characters this week in preparation for the get together. Why so much? Well, I hadn't played in ages, and I know from experience that it normally takes a long time to roll up characters by hand. So, I wanted to make sure that we had a bunch of pre-built characters ready to go before starting to play.

How many times have you and your friends gotten together to play D&D and then spent the next 6 hours creating characters on that first night, without killing a single kobold?

As this was likely the only time I'd play in the next decade, I wasn't going to let the entire evening be about rolling new characters. So, I made a slew of choices for my friends to pick from. Once I got good with the character builder tool, I was able to go a little faster. Still, as I wasn't familiar with the fourth edition classes, races, or any details of them there was a lot of reading to do to make every decision. You could have the character builder generate decent characters for you, but I really wanted that handcrafted feel.

Because I was perfectly aware that this was not an ongoing campaign, I decided that all loot and experience would be accelerated and that we'd level up after each major milestone of the night -- about once every two to three hours. We'd go back into the fancy online character builder, level up, have new loot assigned and equipped, and then print up brand new character sheets. Yes, we went through a fair amount of paper. Had we thought about it more carefully, it might have been easier to distribute PDF copies of the characters after each level up. However, it is so nice to have real paper sheets to write on during combat, encounters, and to take notes on about the adventure. By the end of the night we were printing two pages per sheet in landscape mode, just to save ink and make the stack of used paper smaller.

On the whole, I think this accelerated advancement was a good choice. It kept the game interesting and allowed players to continually do something they like to do: develop and improve their characters in dramatic fashions. We were leveling up and roughly the same rate you might in World of Warcraft, and for this occasion, I think it was perfect.  Even if this was going to be an ongoing campaign, I think I would still choose to advance the characters faster than traditional -- and if we reached some pinnacle of power, then simply start new characters and a new story.

In general, the latest edition of Dungeons and Dragons is better than older versions. There were a few gripes that I had. The indexing was horrible. If you wanted to know about a rule that you were certain you saw five minutes ago... good luck. Between the table of contents and the index, you might have to dig through three to five books and still not find it. It was easier to do a Google search about the rule. On the plus side, most of the new rules are much simpler and once you got the hang of it, you didn't need to consult tons of ridiculous charts and tables to do things. It was a more streamlined process than the D&D of yore. I won't say that the Dungeon Master's guide was worthless, because that would be mean, but really, if you've been a DM at any point in the last thirty years, you probably don't need to see it. They actually have two Dungeon Master's guides now. Complete waste of money in my opinion. They seem more like feeble attempts to pick gamer's pockets than to actually provide real value.

The new Monster Manual was, in many ways, superior to older versions. It gave tips on encounter groups and offered encounters by level that let me put together many impromptu ambushes. It lacked the detailed charts by terrain types and such that you might have found in the old Dungeon Master's guides from back in the day, but it was still functional and contained a lot of my old favorite monsters. For the new DM, it might be a little overwhelming to find monsters appropriate to the climate, geography, and setting that your adventurers were in. As an old hand, I wasn't hindered. I do think this was an oversight on the part of Wizards of the Coast.

We played until sunrise -- roughly twelve hours of hacking, slashing, and falling into pits that were completely avoidable. Laughing and giggling like teenage boys. The time was definitely well spent. Now I itch to play again, knowing how unlikely that is.

Saturday, January 5, 2013

I just played Jax

So, I've been playing some League of Legends lately. I have been so immersed in writing my last book for so long that now that I've come up for air, I admit that I would probably be enamored with anything more entertaining than bubble-wrap. I typically play MMOs, though I have played RPGs (like the Torchlight and Diablo IPs) and RPGs (Starcraft, Warcraft, and all the way back to Dune.) I don't have almost any experience with MOBAs. I think I might have played DotA one time in its original form. 

I think the most essential part of playing League of Legends is to join the Low Elo community. They encourage a helpful, "stay classy" attitude that makes playing a pleasure. The solo queue is filled with people who will rage and blame and do anything but play well. When you login, simply join the "lowelo" (or "lowelo2") chat to look for people who aren't jerks. Just remember, it goes both ways. Don't blame other people when they die and try to be supportive. The game is more entertaining when everybody is laughing and enjoying themselves rather than swearing at each other and assigning blame.

I think my favorite format is the 3v3 Twisted Treeline map. It is non-stop action and entertainment. The 5v5 map is slow and a bit tedious. I really don't like that the "meta" (at this point I hate the word because everybody misuses it) where it has become a requirement to have a support character. Being a healer is boring in most games, and it is beyond my comprehension why Riot would encourage this mechanic.

I'm sure there are a few people out there who would immediate scream at me for how much they enjoy being the healer. I'm glad you enjoy it, but I think you are in the minority. I think that there is nothing heroic about being the healer. Sure, you make the team better and it is a team game, but you are the first one blamed when things go wrong and the last one to get credit when things go right. It's an awful position simply asking for blame assignment. This brings me back to the 3v3 games, which don't seem to have room for characters dedicated to full support. Maybe this will change, but I hope not. I probably will stop playing if it does.

Despite all of the things that Diablo III did wrong, this may be one of the things they did well. Nearly every character was capable of finishing the game on their own. Well, that's mostly true. With the proper gear they were able to finish the game. There was an issue where you relied on more sturdy characters to first put those items up for sale and you had to farm gold to buy it. That actually is a similar issue. People want to be self-sufficient, even in a team. Well, I shouldn't speak for the entire universe of gamers. I'll say that I like to be self-sufficient, even if I'm playing a squishy character.

If you have a spare hour to play a game, check out League of Legends. I think it is a lot of fun if you can find people to play with that aren't rude and obnoxious. I'm lucky to have a number of friends who play, but we've filled in empty slots from the Low Elo chat whenever we've needed more.

Before I sign off, I wanted to mention that my first book (Tritium Gambit) is still free on Amazon and iTunes, so get out there and pick it up if you haven't read it.

Saturday, December 1, 2012

Initial reactions to League of Legends

I love the art style of League of Legends and the gameplay seems pretty good. I was pretty excited about this RTS, right up to the point that I tried to join a player verses AI game.

After 10 minutes of waiting for a game to start, there were finally enough people to make a match and then after everybody accepted, nothing happened. At all. After a few minutes, I closed the client, restarted it, and it immediately prompted me to rejoin the game that I "abandoned." Presented with no other choice, so I clicked the "rejoin" button. The computer still shows that screen 30 minutes later. Ah well. The tutorial games are educational and the game looks really good.

My oldest son has been playing the second tutorial mission repeatedly for a few hours now and he's been having a great time. As my machine is simply stuck waiting, I've had plenty of opportunity to watch him duke it out with the AI. I think his Starcraft II micromanagement skills are shining through.

There do appear to be somewhere close to a billion choices you have to make when it comes to picking mastery points, skills, items, etc. It makes the game appear to have a lot of depth. I am a little concerned that my son is too young to really understand the repercussions of each of the myriad of decisions he's making at lightning speed, but maybe that's just because I'm too old and too cautious.

If you are looking to play this game, I recommend it. It's free, which is a pretty good price, and despite the fact that it hasn't worked very well for me with cooperative play, I think the game has a lot of potential. I'll warn you now that the install time is fairly long. I have a 50 megabit connection and it still takes a pretty long time to install and patch. I have friends who play PvP, so I know the game works, even if I have yet to experience it. I'll give it another try once the client allows me to play again.

Friday, November 23, 2012

First book free on iTunes

I know, I know. I haven't talked enough gaming lately. I've been busy with writing.

If you haven't read my first book, Tritium Gambit, it is free on iTunes today:

The second book is on Amazon and Smashwords and will be on iTunes and Barnes and Noble soon.

Thank you for downloading it.


Sunday, November 18, 2012

My new book

I am pleased to announce that, after months of toil, I have released:

The Kindle edition of Mercury's Curse is available on

Eventually, I expect it will also be available on Barnes and Noble, iTunes, and Smashwords. I do not have an ETA. The paperback edition will be available in roughly a month on