Staff Blog: Graham Wihlidal, Senior Software Engineer

Posted on


My name is Graham Wihlidal, and I am a Senior Software Engineer at BioWare.

I started programming with LOGO in elementary school. Over the years I picked up Perl\CGI\SSI, AppleScript, PHP, SQL, HTML, graphic design, and other skills to allow me to contribute to the infant Internet. As I honed my craft, this led to the realm of dedicated server hosting, RedHat\Cobalt Linux administration, BIND8\DNS management, and even commercial Web hosting and contracting on the side while still in junior high.

During high school, I dabbled with Turbo Pascal, but began to develop complex desktop applications with REALBasic. When it seemed like I was hitting a wall, at the mercy of the virtual machine, I started to teach myself C and C++ in order to write native plugins for the complex processing I needed to perform. The natural progression was to abandon REALBasic and move to pure C\C++ with Metrowerks PowerPlant as the UI framework, and to develop 2.5D Isometric sprite-based roleplaying games and engines with Apple GameSprockets. Around this time, I was determined to work for BioWare. Nothing was going to stop me, although the release of Neverwinter Nights tried to sabotage my efforts to work on my own projects.

From that point on, I focused on honing my abilities with low-level x86 assembly, C\C++, and OpenGL\Direct3D, by developing my own 3D-graphics systems, game engines, and content tools. A wonderfully frustrating cycle began: trying “the next most awesome architecture ever envisioned,” watching it crash and burn after months of work, razing most of it to the ground, salvaging the parts that worked well, and going back to the drawing board. This cycle is the best piece of advice I could give to any aspiring (or even expert) programmer. You do not become a great programmer by finding the right solution from thin air; you do so by knowing through experience all the approaches that failed miserably in the past, and then choosing one of the remaining successful or untried solutions for that particular problem.

While we’re on the subject, another piece of advice specific to debugging problems of any difficulty: always verify your assumptions! You may assume that some function you are calling does one thing, but how do you know if it works correctly in all cases or if it was quietly rewritten underneath you? I have seen many occasions where developers spent hours or days looking over a piece of code, only to realize they were assuming things worked a certain way when such was not the case. Debug the entire stack from your code, all the way down to the lowest level. In some situations, I have even done this unsuccessfully, and then gone into the hardware and found the problem there! Those are really fun.

Finally, a common misconception is that great code is paired with complexity and bragging rights; nothing could be further from the truth. Great code is paired with elegance, complexity broken down into simplicity, and being readable on a single page. The best code will accomplish a difficult problem in the fewest lines of code; the best optimization is code that never executes. There will always be a programmer better than you; listen and learn from them, because it’s a team sport.

I graduated from Computer Systems Technology (Honours) at the Northern Alberta Institute of Technology, and studied a number of mathematics, artificial intelligence and 3D-rendering courses at Game Institute. Trying to learn as much as possible about 3D rendering and game programming, I also studied and completed a number of challenging Microsoft Certifications, for designations as a Microsoft Certified solution developer, large-scale distributed systems architect, and database administrator.

During college and afterwards, I was a self-employed software engineer with most of my contracts out of the United States. These contracts included the development of systems in C#, ASP.NET, Java Servlets, C\C++, 64k\x86\PPC assembly, PHP, BizTalk Orchestrations, SharePoint, Oracle, SQL Reporting, and HTML. Independent contracting was an excellent experience for me, as it allowed me to develop skills in learning new languages and systems at a rapid pace, and improve on entrepreneurial soft skills.

Later, I was hired as a lead application developer at a private company, developing workflow automation software; the project was a suite of products deployed in small to large businesses, designed to minimize or eliminate inefficiencies due to human error or manual processes. Companies like IBM, Adobe, Sun Microsystems, and others had developed an XML Meta language called BPML (Business Process Modeling Language) that could describe the day-to-day processes of any company, small or large. Our software took BPML further by developing a software layer around this innovative concept.

After this, I moved on to a software engineer and consultant role at CGI, developing innovative and robust business and intelligence software for the government.

In 2006, I published a 640-page book titled “Game Engine Toolset Development.” I signed the contract with my publisher at Game Developers Conference in 2005, and the book had to be on shelves at the same conference the following year; during this time, I was still employed full time at CGI. Having a demanding full-time job alongside an accelerated writing deadline was an interesting lesson in time management and prioritization, to say the least! Seeing my book on shelves at the Game Developers Conference in 2006, and hearing praise from industry was extremely exciting, justifying the blood, sweat, and tears that I put into the book.

While marketing my book at the Game Developers Conference in 2006, I participated in a number of informal interviews with BioWare Corp (pre-EA). It seemed to me that BioWare would be a good environment to work in, so I returned home to Edmonton and participated in formal interviews and programming tests. I was offered the initial role of Art Tools Programmer on April 10th (my birthday! – how’s that for fate?), and the rest is history.

Over my 7+ years at BioWare, I have worked on almost every type of core engine, game system, and hardware. My specializations include 3D rendering, low-level memory and CPU optimization, transitions to new hardware, and scalable parallelism; however, I take a great deal of pride in a reputation as a reliable generalist, being able to deep dive into any system at any point and understand how it does or does not work, getting it into a shippable state on a tight deadline. Because of this, I bounce between projects quite often to help optimize them. The titles I have contributed to include Mass Effect, Mass Effect 2, Mass Effect 3, Dragon Age: Origins, Star Wars: The Old Republic, Dragon Age: Inquisition, and Battlefield 4.

Part of my skillset also includes some competency with DCC tools like 3D Studio Max, ZBrush, Maya, and Adobe Photoshop. As a result, I work closely with artists and art directors to develop workflows and pipelines, troubleshoot visual artifacts and fidelity, help establish guidelines and budgets, and act as a liaison between the art, design, and programming departments.

In addition to my day-to-day work, I frequently travel to the United States, Japan and Europe to work with DICE, first-party vendors, attend conferences and trade shows, and present our cutting-edge technology and processes.

My current assignment has been a close collaboration with the excellent rendering and core engine teams at DICE to develop Frostbite 3, which is powering the next generation of high-fidelity, immersive titles from EA, including Battlefield 4 and Dragon Age: Inquisition. This work includes feature development, rendering improvements, low-level optimizations, and bringing the engine to new, cutting-edge platforms like the PlayStation 4 and XBox One.

I absolutely love my career; I work with extremely talented people who also love what they do, and am lucky enough to say honestly that I have found my dream job.

BioWare is an amazing place to work; there are incredible role models, exciting projects, admirable core values, and aggressive career growth opportunities.

Finally, for the aspiring programmer: innovate, try, fail, learn, and repeat.