Mitchell Lee

Web Development Engineer at Amazon.com.

Seattle, WA, USA Information Technology and Services

Summary

Pragmatic thinker, agile enthusiast, and an undying passion for software development, I’m constantly trying to push the bar for myself and my team. I’m thrilled to be pushing the curve, and being part of the defining the future. I firmly believe the best software teams are those that work as a team, and spend a lot of my time looking to remove roadblocks, and improving team productivity through streamlining release process, automation, communication and training.

I am a proud father of two amazing sons, and a dedicated husband.

Experience

Web Development Engineer | Amazon.com
September 2014 - Present | Seattle, USA

Development Team Lead | Coldwin Software Inc.
February 2014 – August 2014 | Winnipeg, Canada

Lead Software Developer | KORE Systems Group
August 2012 – February 2014 | Winnipeg, Canada

Provide technical and managerial leadership to small team of software developers. Provide technical expertise and guidance to all teams within the organization on best practice and striving to improve productivity and efficiency to deliver features.

  • Designed, architected, and lead developer on a large Web API project intended to be the first step in transitioning the company software platform to a SOA architecture. Leveraging existing frameworks and tools, to meet high scalability and high availability demands of the growing business.
  • Designed, and implemented a continuous delivery strategy based on Team City, rake and Chocolatey (Nuget)
  • Delivering high value software to our clients on tight deadlines, while leading my team to make major improvements to the overall stability and testibility of the software platform, through brownfield refactoring techniques, dependency injection (Castle.Windsor) and the use of the Nhibernate ORM.
  • Directly involved with customer relations, having significant relationships with all of KORE’s primary business partners. Traveled to customer locations to gather requirements, build relationships, and demo software and prototypes.
  • Working with all levels of the business to refine process, improve productivity and communication, and secure tooling and hardware necessary to improve productivity and quality of software.
  • Go-to guy for mentorship in and out of my team, key contributor and technical adviser in major department decision making, working closely with other lead developers and management to define standards, requirements and tools.
  • Designed and developed several frameworks, shared libraries and tools to improve software quality, and reduce time to market for new compoents and applications.
  • High focus on team development, hosted/presented many lunch and learns on various tools, technology and process.

Software Developer | Price Digital March 2010 – August 2012 | Winnipeg, Canada

Work on a WPF Desktop application in a truly agile environment. Write and maintain unit/behavior/acceptance tests, adding new features to the software, and participating in demos.

Primary Project: Displacement Room Designer:

  • “Paint” like product that allows the user to draw a room, and place client products within that room. It calculates airflow and comfort data based on product placement to give the user a visual view of the airflow within the room
  • Written in WPF/C#, following MVVM and DDD
  • Agile Project Management, iterative development
  • Behavior Driven Testing and Acceptance Testing

Developed Public facing web sites for Price’s subsiduaries/partners:
Jorban Riscoe
WellFromWithin
Price Mechanical Industrial

Blog Posts

Solving Euler Problems in F# - 002 - Even Fibonacci numbers

Continuing on my series of solving the Euler problems in F#, here’s the next one:

Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …

By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

Again, like the first problem, we can leverage the power of F# Sequences to make this problem trivial. I learned something new with this particular problem, and using unfold to create an infinite fibinocci sequence is pretty awesome:

let answer = Seq.unfold (fun (a,b) -> Some( a+b, (b, a+b) ) ) (0,1) 
                |> Seq.takeWhile(fun x -> x <= 4000000)
                |> Seq.where(fun x -> x % 2 = 0)
                |> Seq.sum

Pretty straight forward, create a fibinacci sequence, collect while the number is less than or equal to 4 million, filter out only the even numbers, and then total them all up.


Solving Euler Problems in F# - 001

In my quest to master everything there is to know about functional programming and F#, today I start working through the “Euler Problems”

The first problem is pretty basic, so I won’t talk to much on it, but the problem we’re trying to solve:

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000.

This kind of problem is exactly what functional languages are designed to solve, and in a very basic one liner, we have our F# solution:

let answer = [1..999] |> Seq.where(fun x -> x % 3 = 0 || x % 5 = 0) |> Seq.sum

Angular JS Tab Control - An Experiment with Directives

I’ve been working with AngularJS for some time now at work, and I’m finding I really like it. Of course, one of the things I did wrong when I first started working with it, was to think “jQuery”. After some self study, and reading many blog posts and articles, I finally understood what I was doing wrong. Angular is not a jQuery clone. It is not a typical browser abstraction library that jQuery is. It’s a powerful front end framework for building dymanic, and declarative web applications.

After coming to this realization, and having the requirement at work to turn a basic web application page into a printable report, I decided to learn more about directives. So here is my first attempt at creating a reusable angularJS directive, a basic tab control.

The HTML

First, I had to decide what the HTML should look like, and I settled on something similar to:

<tab-control id="MyFirstTabControl">
	<tab id="Tab1Content" name="Tab 1" route="/tab1" default>
		Tab 1 content goes here
	</tab>
	<tab id="Tab2Content" name="Tab 2" route="/tab2">
		Tab 2 content goes here
	</tab>
	<tab id="Tab3Content" name="Tab 3" route="/tab3">
		Tab 3 content goes here
	</tab>
</tab-control>

The primary pieces of this, includes the main directive, the “tab-control”. This is basically a container element that’s used to scope the tabs together.

Then, the bread and butter of the control, the “tab” directive contains the content, and the meta-data about each tab, including a route attribute that will modify the browser history on navigation, and allow the user to link to a specific tab on the page.

The Javascript

Next, we need to define the tab-control directive within my Angular application:

var mainModule = angular.module("mainModule", []);

mainModule.directive('tabControl', function($location, $rootScope) {
    return {
        restrict: 'E',
        template: '<ul id="{id}" ng-repeat="tab in tabs"><li><a href="#"></a></li></ul><section ng-transclude></section>',
        scope: {
            id: '@id'
        },
        transclude: true,
        controller: ['$scope', function($scope) {
            $scope.tabs = []

            this.addTab = function(tab){
                
                if(tab.IsDefault) {
                	$location.path(tab.route);
                	tab.selected = true;
                }

                $scope.tabs.push(tab);
            }

            $scope.selectTab = function(tab){
            	$location.path(tab.route);
            	$rootscope.$broadcast("TabChanged", tab);

                for(var i=0; i<$scope.tabs.length; i++){
                	$scope.tabs[i].selected = ( tab.name == $scope.tabs[i].name );
                }
            }

            $rootScope.$on('$locationChangeSuccess', function () {
                var hash = $location.path();
                
                for (var i = 0; i < $scope.tabs.length; i++) {
                	$scope.tabs[i].selected = ( hash.indexOf($scope.tabs[i].route) >= 0 );
                }
            });

            this.selectTab = $scope.selectTab;
        }]
    };
});

The tab control directive is responsible for managing the list of tabs, as well as navigating between them. For this, we need access to the $location object, which allows us to control the browser history and the url. Because the tab control does not live inside a bubble, we also need to listen to the rootScope’s locationChange event and select the appropriate tab. This allows other items on the page to navigate tabs, as well as the user to update the url in the browser window.

We’re not done yet though, we still need another directive to define a “tab”.

mainModule.directive('tab', function () {
    return {
        restrict: 'E',
        template: '<article id= name="" ng-if="selected" ng-transclude><header></header><section ng-transclude></section></article>',
        transclude: true,
        replace: false,
        scope: {
            id: '@',
            name: '@',
            route: '@',
            default: '@',
            selected: false
        },
        require: '^tabControl',
        link: function (scope, element, attrs, ctrl) {
            ctrl.addTab(scope);
        }
    };
});

This directive is pretty straightforward, we define the template for the html, and populate the scope attributes from the meta data of the original tab element. Note: In this example, we are using ng-if to hide the hidden tabs. This has the advantage of completely removing the tab content from the HTML when it’s not visible. This may not be ideal depending on your requirements, just change it to ng-show

The thing I like the most about this, is there’s no dependency on the html. We can define tabs anywhere in our application, in a very declarative way. We also are doing 0 dom manipulations, making testing our directive straightforward, and simple.


Get in touch


I am available for freelance jobs, presentations, and technical debates. (No spam please). Please contact me and send me your questions and inquiries.

mitch@evildev.net | Seattle, WAa

Or, just scan this QR Code:

Contact Me