As I continue to work on the platinum trophy for Dark Souls 3, I’ve now completed my second play-through of the main story (NG+). At more than 90 hours played so far, I’ve more than got my money’s worth. I’m compelled to chase these final achievements in honor of my need to complete all the things, but first I took a quick break to upload the boss-kills and other in-game footage I’ve captured so far. Here’s the playlist:
Watching EVO 2018 this weekend got me excited for the release of Soul Calibur VI. I have loved the Soul Calibur series since a friend of mine introduced me to the second and third entries in the series back in 2004. I played Soul Calibur III for hundreds of hours, studying all of the techniques and intricacies of the characters. I’ve been a fan of fighting games since I discovered Street Fighter II in the early nineties, but something about the hand-to-hand weapon combat of the Soul Calibur series has always fascinated me. I find the characters and story to be very charming and the different fighting styles of the various personalities on the roster are all so different.
When I heard about Soul Calibur VI earlier this year, I became very excited. It’s been a long time since we’ve had a new entry in the series. It was 2012 when Soul Calibur V was released for last generation consoles (XBox 360 and PS3) and those have felt like a long six years. Seeing the previews of SC6 at EVO got me pumped. Seeing Siegfried back on the big screen is going to be great. I love learning all of the different characters, but Siegfried will always be my first.
Tonight I hooked up my XBox 360 for the first time in a couple of years and, after a number of lengthy updates, fired up Soul Calibur V to get back into the swing of things. I’m sure a whole bunch of stuff is changing in SC6, which is great because we’ll have a whole bunch of new stuff to learn. It still can’t hurt to re-familiarize with the mechanics of the series and recap the story. While I was digging through my gaming archive boxes, I found some other Soul Calibur items; my SC3 strategy guide, and my SC4-themed HORI fight stick. I use Razer Atrox fight sticks these days (still have my XBox 360 Atrox fortunately!) but it was fun to find the HORI SC4 stick. Brings back a lot of really great memories.
I’m not sure which platform I’ll choose for Soul Calibur VI, although I’m heavily leaning towards my PlayStation 4. I don’t own an XBox One and I’m not convinced the PC community will be very strong. It would be great to see cross-platform play but that seems like a bit of a dream right now. For the next few months, while we wait for the release, I’m going to enjoy reliving the memories of Soul Calibur V and soaking up the beauty of the tale of two swords.
I’m having fun watching #EVO2018 and of course it has me inspired to get back into playing Tekken. When I tried to launch the game, I was greeted by a black screen with the startup video audio playing in the background. Alt-tab didn’t work, clicking on the task bar didn’t work. Well, crap!
Fortunately, internet to the rescue. This forum post pointed me at a game settings configuration file: https://steamcommunity.com/app/389730/discussions/0/1291817837621663705/
Tweaking resolution and fullscreen settings in that file got it launching appropriately.
As a good citizen to future me, I created an Evernote to avoid me losing the information in the future.
In preparation for the Battle for Azeroth, I’ve been learning all about the changes to the paladin class and looking at ways to spice up my user interface. There are many ways to customize the World of Warcraft client. One of the most amazing features of WoW is the rich add-on and modding support that is available directly. Over the last fifteen year, the WoW modding community have created some very mature add-on libraries that allow players to entirely overhaul the user interface. One of the most flexible and powerful of these add-ons is WeakAuras. In a nutshell, WeakAuras allow a player to define one of more visual items to display and then describe rules for when those items should be shown or hidden.
One of the main reasons I like to define weak auras is to bring more attention to certain buff or debuff scenarios during a fight. On my retribution paladin, for example, it is valuable to understand the damage windows presented by Avenging Wrath and Inquisition. For this purpose I created two large icon auras as well as animated backgrounds to show the remaining time of each. These serve not only as reminders of remaining duration but also make the spells feel more impactful by dressing them up a bit with shiny effects.
This image shows a custom Forbearance tracker, which can be useful when soloing challenging content to understand when the big savior spells can be used. I’m experimenting with ways to better tracking Forbearance on other raid targets and party members as well. Little visual cues can make a big difference in the heat of battle.
WeakAuras can be a bit intimidating at first. Unlike other add-ons that are designed to fill a specific purpose, WA is a framework from which you can realize your own designs. The “aha!” moment for me with using WA was realizing that it really only has two main components: 1) how an item should be displayed, and 2) when to display that item. Once you break it down to that level, the rest gets a lot easier.
Display settings are used to describe how an item should appear when it is being shown. The following panel describes an icon that is shown just above the player portrait in the health bar. This icon shows when the player is in combat using a custom texture (crossed swords). The swords have been colored red and scaled up to about the size of the portrait. This is to give a clearer indication of when the player is still in combat.
Triggers are used to describe when an item should be displayed. The following image shows a trigger for the icon that is used to show when Blessing of Protection is ready. Describing the conditions for when an item should be shown or hidden makes it easy to describe how custom WeakAuras should behave.
The WeakAuras discord is very active, and a great place to research customization ideas: https://wago.io/weakauras. Both the CurseForge link and Discord for WeakAuras are available at the main site: https://weakauras.wtf/
I highly encourage anyone who is curious about experimenting with their World of Warcraft user interface to give WA a try. If you’re the kind of person who learn better in a community then check out the discord. If you’re more of a passive learner, you might check out the myriad videos on YouTube, or experiment with an interface created by someone else. There are many example configurations available here: https://wago.io/weakauras.
I’m late to the game with Dark Souls III. It made the list of “games I want to experience” back when it first released, then life took over and a couple of years disappeared into the ether. Now that I’m finally able to delve into the dark lands of Lothric, I’ve discovered a rich dark fantasy packed with depth and unafraid to break with conventional game design.
While I wasn’t able to play Dark Souls III immediately, I have heard a lot of feedback from other gamers. People either seemed to love or it hate it based upon its difficulty and the combat system. Overwhelmingly, the community described Dark Souls III as hard and punishing. I quickly see where this perception comes from. As soon as the intro movie finished, I am fighting with the first few enemies and reading the sparse tutorial hints. Few encounters hold back, and enemies are quick to exploit even the smallest mistake. My first deaths came quickly.
Taking a step back, I stopped trying to win and committed instead to just watch and learn. Ignoring many deaths, I simply watched enemies and practiced rolling away from their strikes. Experiments with blocking schooled me in the importance of stamina. Testing follow-up strikes taught me that my own greed was the reason for many of my own deaths. I quickly learned that the combat in Dark Souls requires patience and encourages very deliberate timing. The system helped me to learn, to slow down, to think carefully about my actions, instantly punishing any attempt to fall back on wild button-mashing.
Once I got past the fear of combat I started to realize just how much progress was being made. Dying in Dark Souls comes with some penalties. You restart at the last bonfire (checkpoint) you rested at and all enemies re-spawn. Additionally, your current souls (level up resource) are dropped at the point you died. You have to reclaim them to avoid losing them and they survive only a single death. However, not all things are reset. Certain doors can only be opened from one side, and some ladders must be lowered from above before they can be used. These changes persist through death and allow for shortcuts that were previously unavailable. Entire sections can be skipped and it’s often worth a death or some lost souls to open the right door.
What impressed me most about the design of Dark Souls III is the way that I always felt as thought I couldn’t go any further. That my skills were inadequate and the next challenge would be too much. Yet at every turn I made a little more progress. An item gathered, a new technique for a tricky enemy, or that glorious feeling when you come across a new bonfire at the last moment. I don’t know how, but at least twice now I’ve come across a bonfire when just hanging on by a thread. That feeling of relief and accomplishment when you light the fire and watch that sliver of a health bar fill to full, and full Estus charges return.
It’s that tension in the game design that is making Dark Souls III so memorable for me. The fights are hard and the losses I’ve endured feel so incredibly brutal. Yet the memories I’ll take away are of those clutch victories, amazing discoveries, and the sense of accomplishment from sticking at a fight I previously felt I couldn’t possibly win. The art direction, music and sound design, and oft-confusing story are a delicious backdrop to a brilliantly realized technical achievement. I don’t think I’m yet half way through (only just killed Abyss Watchers) yet already I feel I’ll be telling the tales of my adventures for years to come. This is one for the story books.
We took Rowen to a climbing gym yesterday. She saw someone ascending a rock wall on TV and wanted to give it a try. Rowen was nervous at first but got past her trepidation and had fun, especially jumping on the safety mats.
We stayed for about an hour and tried a variety of different scramble areas, including one with a rope assisted harness. We got a pack of five passes so we’ll definitely be back again soon.
Today we remember a truly loving friend. I am very sad to announce that this morning we lost our cat, Lucy. Ten years ago, we met a tiny fluffy ball of energy. Amidst a flurry of other kittens, she scrambled back and forth chasing anything and everything that moved. She was never the brightest, nor the most graceful of cats. Often found hiding under, in, or behind some box, blanket, or sofa. Lucy had the biggest heart. She just wanted to be loved. She was broken, but in all the right ways. Our hearts are heavy with the sadness of her loss.
I remember the day we took her home. This tiny little creature, so keen to explore the world around her. Her affection was immediate and we knew then that we’d found a friend who was very special. While today we are very sad at her passing, we are also looking back at the great joy she brought to our lives. People form very strong bonds with their pets and so it was for us. I’m going to miss her scampering feet and bright green eyes. I’m going to miss the sound of her licking Meaghan’s laptop keyboard (yes, she really did this), and the sound of her meows when she needed some love.
I regret that we lost her so soon, but look back fondly at the bond we built and the love we shared. Lucy was a bit of a loner at times. She was a phenomenal spider hunter who loved to snuggle, but wasn’t afraid to tell you when she was done. She lived a good life, and brought a lot of love and joy to our house. Meaghan, Rowen, and I are sad to have lost her but so glad to have known her. I’m sorry, Lucy, that your journey had to come to an end. We will always love you.
Anyone working with large software systems knows the difficulties of retaining visibility into those systems. As software solutions grow, it becomes increasingly difficult to retain a clear picture of how the components fit together. In an age of increasingly demanding software consumers it is critical to quickly find and solve problems before they grow. Enter NDepend, a collection of tools designed for deep analysis and visualization of the software solutions you create.
NDepend provides a rich analytic tool set to help gain a deep understanding of your code and monitor the health of a project throughout its lifecycle. I’ve used NDepend in a number of projects on which I consider myself very knowledgeable. NDepend provides pleasant surprises, even within those familiar projects. It’s great to see the new insights I gain when analysing familiar solutions. I can quickly see the structure of my code in ways that were previously unavailable to me.
I recently started work at a new job where I became quickly involved with a number of large software solutions. Cvent have two decades of software, some written in .NET, others in Java, and a solution here in our Portland office written in Ruby. I’ve been a polyglot developer my whole career, but switching between so many large code-bases through the course of a working week means I need tools to help me maintain a working mental model of the structure of the various solutions I’m working with.
One of the first things I did upon returning to Cvent was to fire up the new NDepend 2017 and point it at one of the larger core code-bases I needed to learn. Many of my peers have worked at Cvent for several years. They are very familiar with the structure of the solutions they manage. It was important I ramp up quickly to extract as much as possible from conversations regarding solution structure, integrations, and refactoring.
As with most projects of any reasonable size and age, the documentation is either lacking or out of date. There are a few high level class and interaction diagrams kicking around, but with a few hundred thousand lines of code and solutions containing tens if not hundreds of projects, it can be hard to know where to start. NDepend’s heat map, overview dashboard, and dependency graphs helped me to quickly learn the lay of the land.
Integration with Visual Studio
Once an interesting relationship or piece of code is located, a double-click brings up the relevant file and method directly within Visual Studio. This is a great way to navigate between a high-level view of the system architecture directly into the details of a class or method of interest. Moving back and forth in this way between the abstract models of a large system then into the details of the most interesting modules helps build familiarity much faster than simply reviewing each module line by line.
It didn’t take long before my peer architects were asking whether they could get access to the tool. “Those navigable dependency graphs are awesome!” said one architect, looking over my shoulder as I merrily skipped around different modules, tracing paths through the architecture.
At its core, NDepend is a database that automatically indexes everything about the code you write. The solutions analysis stores and indexes information about aesthetic, technical, and architectural metrics. Dashboards and reports present the data in a variety of useful dashboards and reports. Examples include the number of lines of commented code, the number of parameters received by a method. Additionally there are more complex architectural metrics such as afferent and efferent coupling.
Dynamic queries, written using CQL (Code Query Language), drive many of NDepend’s visualizations. Tailoring these queries to your liking allows for customization of NDepend’s reports to your own coding standards and guidelines. It’s a powerful mechanism for rooting out areas of the code that might otherwise be difficult to uncover.
NDepend ships with predefined rule sets. These rules are used to analyse code and provide feedback on areas of concern. The rules are built using the CQL and can be customized by the development teams that rely upon them.
Delegating a part of the task of reviewing code quality to an automated process can help to avoid having that feedback taken personally. A team that votes and agrees upon the rules and standards they hold themselves to can codify those standards as a rule set. When the automated analysis highlights violations to those agreements there is a clear statement about what needs to be done. It also avoids the costs involved in having humans perform such mechanical tasks.
A snapshot of code quality is useful for quickly generating a list of issues that can improve quality. However, it doesn’t give a great sense of how the code is improving, or worse potentially devolving, over time. By measuring the trend of the code it is possible to estimate how long it will take to pay off a particular type of technical debt. Think scrum velocity measures but for code quality.
Trend analysis takes results from different analysis runs and allows you to visualize how the quality of your software is changing over time. NDepend trend monitoring is driven via the definition of a set of trend metrics. The technical team defines the rules for technical debt and quality gates. The team controls how the quality is measured. This increases the sense of ownership in trend analysis and monitoring. Relying upon an customized automated tool to provide this feedback saves precious developer hours for the more important task of writing the software. This also provides architects and team leads with feedback on how their engineering initiatives are affecting the overall quality of the delivered solution.
Learning Your Own Code
NDepend is a rich tool with a vast array of features for measuring and monitoring code quality and structure. As with any tool it can take time to learn about all of the capabilities and master their use. One of the best things about NDepend is how quickly even the initial analysis adds value. Whether I’m learning about a new piece of code or working on familiar software I’ve maintained for years, NDepend always shows me something new. You can never know too much about the structure and dependencies within your code.
I highly recommend NDepend to any software architect or senior developer who wants to understand their software more clearly. Understanding the structure of your code is the first step. Monitoring the quality journey it takes through every commit and pull request takes that to the next level. Professional effectiveness can depend upon having the right tools at hand. NDepend is definitely one you’ll want to have in your architectural bag of tricks.
The complete list of changes is available here: http://www.ndepend.com/ndepend-v2017
Disclosure: I do not work for NDepend or Zen Program Ltd. I received an evaluation copy of NDepend for my review.
I have rejoined Cvent to help guide their Portland group as part of their software architecture team. Cvent provide world class solutions for planning and managing events across a wide variety of industries. My role is to guide their software development efforts and help set technical strategy.
Taking a Break
Before I came back I did something I haven’t done in two decades. Not since I first entered the software industry have I taken a break between jobs. It sounds silly, but I just hadn’t ever found a good opportunity to take a break so I just kept on going…for two straight decades. We’ve taken vacations here and there, and had several great adventures, but I’ve never taken anything resembling a sabbatical and certainly never took time between jobs before. I’m really glad I did. It made the world of difference.
This Sunday we drove down to Silver Falls State Park for a family hike. It was the perfect weather for it, not too hot and not raining! Since it was Rowen’s first real hike (woohoo!) we decided to take an easy route to start and go from there. She ate up the first loop in no time, and soon we were faced with the choice of heading back up from South Falls to the lodge and being done by noon, or pushing on to Lower South Falls and facing the arduous switchback climb up Maple Ridge. Anyone who has done that loop knows that while the distance is a very manageable 4 miles, it’s the ascent that gets you, especially when you’re a four year old with little legs. Rowen took it in stride. Apart from some stops for snack breaks on a couple of benches she just kept on plugging up the hill, red-faced and rosy-cheeked, but smiling and laughing the whole way. We were very, very impressed.
Rowen standing at the top of South Falls. This is the start of the hike, just down from the lodge.
The impressive South Falls waterfall.
Yours truly, smiling at the start of a great hike.
Rowen and Meaghan investigating monster caves behind South Falls.
Playing in the stream.
A throne fit for a queen. Rowen theorized that this could be used for her castle.
Celebrating our arrival at Lower South Falls. It’s a steep descent in places and despite having cobbled steps, it can be quite slippery. Rowen was happy to be down. We hadn’t told her about the impending “up” yet. 🙂
“I’m building a fairy house, Daddy!” Rowen loves collecting things along the trail to build houses with.
Using her fishing pole (a stick she found) to catch fish in a nearby stream. This was very near the end of our four mile journey, so we stopped on the bridge to play for a while and enjoy the lovely day.
We’re definitely going to be doing more hiking this summer and I’m excited that Rowen had such a good time. When we were finished with our loop and eating sandwiches at the lodge, she asked if we could go on another hike this same day! I’m super impressed, baby girl. Well done!