Over the 18 years of my software development career, I have worn many hats. I have worked with "front-end" javascript, created "back-end" services, developed mobile applications, deployed and organized Continuous Integration systems, drilled deep down into Windows Installer to improve product delivery and deployment, and created architectural strategy for internal tools. The wide range of software practices under my belt have helped me identify cross-disciplinary patterns, and in turn, given me a broader understanding of the software development process on my path to being a well rounded engineer.

Work Experience

Travelers

https://www.travelers.com/
Sr. Software Engineer
Mar, 2022 - Current

Focus on code quality and developer experience, I got to dig deep into development patterns that created code smells and enable an increase in team feature delivery velocity.

  • Refactored an existing collection of angular components with a pattern of copy/pasting into generic components enabling the existing functionality with about 40% of the original code.
  • Created a domain specific language to describe the behaviors of forms that the teams created as part of day to day work.
  • Explored pathways to improve the deployment story as the company wants to shift to cloud deployment.

Change Healthcare

https://www.changehealthcare.com/
Sr. Software Engineer (Services Delivery)
Jan, 2018 - Mar, 2022

As a senior software engineer on the Services Delivery team, my responsibilities centered around the development of processes and tools to transition the team to a cloud and self-service model.

  • Spearheaded the design of customer deliverables for product migration to container based delivery & deployment.
  • Mentored engineers working on specialized internal tooling for the Services Delivery team.
  • Streamlined the customer configuration & release process changing it from 3 week manual effort to push button automation that consumes an existing customer intake sheet.
  • Designed and developed a bot that handled CI/CD automation driven by the Jira business workflow for customer release delivery.
  • Implemented sanity checks and systems validity testing for release and deployments completed by automation.
  • Pushed to drive the team to better coding standards with code review, pair-programming and brown-bag sessions.

Change Healthcare

https://www.changehealthcare.com/
Sr. Software Engineer (Product)
Jan, 2017 - Jan, 2018

As a software engineer on the product development team, my responsibilities include development of new workflows and features, bug fixes, and guiding the product team towards cleaner and simpler product delivery.

  • Validated system integration modules against new versions of peripheral software products. In the process developed additional adapters to bridge version incompatibilities.
  • Resolved long standing services issues with updates for service packs, finally allowing a single service pack to upgrade any old version of our product.
  • Proposed and implemented improvements to the development, building and deployment of hotfix packages, streamlining the process from a complicated four-part configuration process into a single "source of truth" layout file.
  • Worked as an intermediary between the production team and my old services team to create smoother product handoff with fewer breaking changes for process developed by services team.

McKesson

https://mckesson.com
Sr. Software Engineer (Services Delivery)
Sep, 2011 - Jan, 2017

As a software engineer on a service delivery team, my responsibilities included implementation of special application requirements, packaging custom configuration, and general oversight of tech-related issues for each of our clients. As the senior engineer on the team, I was also responsible for setting the strategy for the team to solve less trivial problems.

  • Developed a deployment strategy for customer-centric product overrides. Abstracted the complexity of WIX installer MSI behind a business problem-oriented Domain Specific Language (DSL). Automated the build process, leading to reduced build times and decreased user packaging errors.
  • Oversaw design on several in-house, web-based software tools. In the process, reduced duplication efforts between tools by extracting core shared elements into a supporting McKesson-branded UX framework.
  • Took charge of developer growth effort with regular "brown bag" sessions and knowledge transfer on different topics of interest.

Korchek Technologies

http://korchek.com/
Software Engineer
May, 2007 - Sep, 2011

Worked on a small development team as a .NET C# developer, but like most members of a small teams, wore many hats in the process. Under the guidance of the Sr. Engineer, gained a finer appreciation for elegant and simple solution design.

  • Worked on development of new products, including CareChek 2 & 3 and Korchek Report System.
  • Pioneering new web based product, Web Unit Archive, which leveraged client side data binding frameworks to provide a thick client user experience in a web browser.
  • Involved in data conversion and automation scripts. Creating conversion mappers for legacy binary data in efforts archive customer deprecated applications.

Cosential

https://www.cosential.com/
Software Engineer
Apr, 2006 - May, 2007

As one of three developers in the company at the time, I had the opportunity to work and many differing capacities, which was a great learning experience for this early time in my career. Cosential was my first job on a strictly web based application and it was here where I was exposed to asynchronous javascript request. Seeing the importance and impact of the technology, AJAX and front end engineering became a focus of personal growth.

  • Learned and worked with ColdFusion to maintain and extend the Cosential CMS application
  • Creating PHP data sync connections for clients database systems in order to migrate them to our service
  • Building custom websites for our clients from designer image files with HTML, CSS and JavaScript

Abbott Jewelry Systems

http://theedgeforjewelers.com/
Jr. Software Engineer
Oct, 2004 - Apr, 2006

Starting work while still taking classes at college, I was lucky to have played chess with the CTO at a local coffee shop. After winning against Joe, he invited me for an interview at his company and took a risk on me after looking at some PHP scripts of questionable quality. In the time I worked under Joe, his decades of experience and wisdom were a strong influence on my development as an engineer.

  • Introduction into .NET programing with ASP.NET Web Forms and VB.NET desktop applications
  • Worked with the Compact Framework version of .NET to build out and deliver inventory tracking software for Windows Mobile 5
  • Created inventory syncing storefront websites for clients of AJSLLC Edge users

Projects

ZeUnit - Open Source Project (Founder)

Testing framework designed to bridge the gap between traditional unit and system wide integration testing. The design goals of ZeUnit are grounded in the realization of a sad truth, developers will be writing integration tests and not business people who focus the data. Facing this reality, begs the question, 'Why write the tests in a made up markup language when dotnet developers feel most comfortable using dotnet?'
  • No markup language required to build tests, instead ZeUnit focuses on easily consuming outside data sources.

  • Built on the principles of progressive enhancement allowing users to start with simple tests and scale the complexity for system wide integration.

  • Test functions return the results, not 'spooky action as a distance' to mutate execution state making asynchronous testing easy to support.

Storyteller - Open Source Project (Pull Request)

Storyteller is an integration testing framework with a GUI for test data entry and a nice HTML subsystem for generating detailed reports. In my personal and professional work, I found that being able to quickly generate HTML reports on code execution enabled me to build integration tests that not only flag issues with the system but also greatly helped with debugging. When I was confronted by the limitations of adding some filtering behavior into the generated reports, I decided to dig into the code to see how this can be addressed. The following pull request is my resolution to this roadblock.
  • Replaced hard coded functions to render static css and js content with a composable document builder.

  • Exposed the newly created document builder to enable side-loading additional content into the generated HTML reports.

  • Default behavior of the existing system remained unchanged by the pull request, expanding functionality without breaking backwards compatibility.

  • All additional code written has 100% unit tests coverage.

Recent Posts

The platform that this blog utilizes is ghost , a really simple an bare-bones blog. The main reason for this publishing engine over the pletera of choices out there... Markdown. I get to write everything in markdown, and ghost will go about making it pretty. Especially if you throw some prismjs in for code highlighting. But is pretty code enough??? Rhetorically answering this with a resounding NO... the code also needs to be correct. And how do we as software engineers make sure code is correct? That's right, unit tests. Which got me thinking a bit... Given I am already in a javascript runtime, can't I just inline my unit tests right into the blog it self? This post is a biproduct of the a couple of nights of tinkering with jasmine, iframes and events between… »

Geeks like to tinker. And we really like our new toys. So when my girlfriend asked me to put together simple tool for her grandfathers business, I thought this was a great opportunity to learn something new: Polymer . The internet seemed full of glee for it; what could go wrong. {<1>} Well... Since my last post was well over three month six months ago, it is clear that this strategy went over about as well as a two front war for Germany. Quoting the project at about 80 hours, with the learning curve I was expecting to spend about 120 hours, My baptism by fire wasn't to be the concern of my patron. 150+ hours in, and at a second dead end after a full re-write from scratch. I was beaten, bruised and defeated, and I crawled back to the tried and true Bootstrap… »

I have heard it said that learning a second language is pretty hard, but learning subsequent languages gets progressively easier. Already an ESL (English as a Second Language) student in high school, I was forced to attempt a 3rd language, Spanish courses that were mandated for graduation. I merely muddled through it. "That galaxy is signaling in binary. I should signal back, but I only know enough binary to ask where the bathroom is." Bender ( Futurama - S4E8 - Godfellas ) My excuse for my limited Spanish acquisition is that perhaps I'd been diverting my learning toward computer programing languages instead. "I dedicate this performance to the lovin' memory of Microsoft QBasic. Keepin' it real." Futuristic Sex Robotz But the excuse is only an afterthought. I only… »

Every now and again you hear developers at some programming event talking about this fabled myth of a function, the understanding of which will transcend you to a new plane of programming. Well, challenge accepted. Spoiler, I am still among us mortals. Thinking About the Problem The first place you go: wiki . If you are anything like me, lambda calculus hurts your head and only paints a fuzzy picture. Heavy math aside, what problem does it solve? It lets us have recursion of anonymous functions. Factorial function to the rescue To define recursion you must first define recursion. But seriously, in order to be able to make this function anonymous, we need to get rid of our dependency on " factorial " I agree, crazy. But lets give it a try. Some closure… »

We all know the secret to responsive ng-view s, right? Well, it isn't really a secret. I am talking about routeProvder.when resolvers for pre-loading asynchronous server data. You really don't want your view sitting empty. resolve - {Object.< string, function >=} - An optional map of dependencies which should be injected into the controller. If any of these dependencies are promises, the router will wait for them all to be resolved or one to be rejected before the controller is instantiated. If all the promises are resolved successfully, the values of the resolved promises are injected and $routeChangeSuccess event is fired. If any of the promises are rejected the $routeChangeError event is fired. The map object is: key – {string}: a name of a dependency to be… »

Every now and again, my boss asks my team and me to sharpen our minds by writing fiction. These brainstorming assignments are designed for team building and to unleash creative thought. The topic of this daydream is: What do you think is going to be the role of medical technology in 2030? It started as "Folding At Home," a crowd-sourced project to map protein folding. For just a few watt hours a month, a home computer would think about the problem of protein folding while idle--a very ambitious project at a time in which the rate of technological change was still expected to follow Moore's law. "Moore's law" is the observation that, over the history of computing hardware, the number of transistors in a dense integrated circuit doubles approximately every two years. The… »

If you have never watched/read anything by/about Richard Feynman you need to stop reading this post right now! There is a marathon to be done. He was a brilliant man with an amazing ability to de-construct complicated concepts into laymen-friendly terms. In this video , he talks about the difference between knowing something and knowing the name of something. But he also points out the importance of having a common language. 5:14 - what he forgot to tell me was that the knowing the names are things is useful if you want to talk to somebody else. So it isn't surprising that a lot of people, including yours truly, do the following google search before going on job interviews. Ideally, this is simply a lexical refresher for the abstractions and concepts you… »

Note, this post has been edited on 12/11/2014 and 01/12/2015. These changes were made to keep the code base changes to handle routing and directives. A previous post talked about a general idea behind data annotation and the ability to mark up classes. But the example was far from being real world or useful. Today we are going to explore the way that data annotation can be used to decouple business logic with angular bindings. We are in search of a simpler solution to ES6 modules or RequireJS and Angular modules. Module Pattern and Angular ES6 brings us modules and the "import" keyword for better composition management, which basically means that this code: transforms into RequireJS code that creates a dependency and on './ngBase Nicely enough, ngBase becomes the… »

While everyone is fawning over Angular 2.0, it isn't something we can really use for a while. But Tracuer and @script are here, and--as long as you support IE9 and up--they are here for you today. The Angular team published a playground for @script: https://github.com/angular/atscript-playground So why is annotation-oriented programing so much win? The quick answer is meta programing. Buzz word alert : The basic idea is that you can mark up some object in your code with additional meta-information. And the cool part: parse that mark up at runtime to give your application additional intelligence. But lets take a quick look: An annotation is really just the instantiation of some class that can be bound to an 'annotations' property on the target class. The above code… »

Why do I code? I get paid for it. I like the creativity it unleashes. I seek to communicate (with computers). I played with legos as a kid, and programing is damn close. Originally I started coding because I wanted to be like my dad. This is shortly after I wanted to be a fireman and cosmonaut. One day, Dad showed up with a computer from work, and that night we "pair programmed" a times table program. A life long love was born. My hope is that, as a reader, you are here because you too share a fanatical dedication to your craft. Conventions MS Bob When dealing with programing concepts, every now and again the bad ideas need to be highlighted. What better scapegoat then MS Bob . »