My consulting work is dedicated to making developer teams
more productive. The focus is to increase the velocity of the team, while
simultaneously increasing the quality of the software they produce.
This is done by focusing on three key areas. The amount of time
spent in each of the areas is dependent on the needs of each
customer.
Streamline Development Process
The goal is to bring speed and agility back to agile.
Too often, teams adopt an agile process, only to
implement it in an inefficient way that introduces
significant drag on velocity. I work with the team
and the leadership to identify those practices that slow down the
development process without adding value to the business.
We streamline the process so that every action produces
value in terms of faster development,
higher quality, or clearer focus on the business goals.
Improve Structure and Architecture
I provide an external review of planned and proposed architectures.
This includes research into alternatives, alignment with industry
standards, alignment with current and planned business goals, and
alignment with the current team's skillset.
Improve Team Skillsets
Even the best teams have gaps in their knowledge. When those gaps need
to be filled in order to achieve the business goals and they are in areas
where I teach, I will
offer classes to help.
There are four approaches under my consulting arm that address these goals. An engagement
may include any or all of these, based on customer goals.
Agile Coaching. I help the team regain their true agility by
critiquing their process work on a regular basis. I observe
their current process, and continually suggest improvements.
These improvements are often small changes that the team can adopt
quickly. This gets the team into the habit of continuously examining
their process and adopting a culture of continuous improvement.
Architecture Council Actions. The same attitude of continuous
improvement needs to become part of the architecture and design
teams. While the architecture shouldn't be entirely replaced, often
it can be modified slightly to respond to changing business needs,
changing platform direction, or new knowledge and experience.
In these discussions, we continuously review and adapt the architectural
direction so that the software continues to stay competitive in the
marketplace.
Mentoring. I work alongside the development team to
mentor them and help them become more productive.
This involves design reviews, code reviews, and general guidance.
I'll suggest libraries and classes that may quicken the
completion of current tasks. I'll help ensure the quality and
stability of the code being developed, and help ensure that proper
practices are being followed with maximum velocity.
Reference Implementations. I have deep technical knowledge of
many frameworks and programming languages. In certain areas, I'll provide
reference implementations of key components in order to validate key
architecture designs.
Developer Training
Successful companies recognize that talent is an asset.
They hire the smartest people they can, and then invest in those people.
Investing in your team is a sure-fire investment.
On top of having a team that can deliver the skills a business needs,
that team is able to deliver the best products and services to the market.
Bill’s classes are designed to let your team learn from an expert
in a way that’s convenient and sure to return results for your business.
Class Format
All classes share a common format that is designed to engage all of your brain.
Participants get a high level overview and learn background on the
topic followed by Bill demonstrating with live examples.
After that, the class becomes a guided lab where participants can put the knowledge into practice.
Finally, participants are given a couple problems to try on their own,
where they put their new knowledge into practice.
Class List
Current Classes
Upcoming Classes
%% TITLE %%
Summary
%% SUMMARY %%
Who Should Attend
%% WHO %%
Course Outline
%% AGENDA %%
Effective C#
This course takes students on a guided tour of many of the recommendations in Effective C# and More Effective C#.
I'll discuss the motivations behind the recommendations, and why they represent the habits used by successful C# developers worldwide.
This course covers many recommendations that the best developers follow in all their development.
Developers that want to improve their C# development skills, and want to understand why the recommendations in the Effective C# books should be followed.
In the same way that "Effective C#" is meant for developers that have some experience with C#,
this course is meant for developers that have been using C# for at least 6 months.
C# Language Idioms
Managing Equality
Conversion Operators
Object Capabilities
Resource Management
Garbage Collection
Non-Memory Resources
IDisposable
Generics
Generic Methods
Generic Types
Generic Delegates and Contracts
Working with the Framework
Common Ordering Relations
Events vs. Delegates
Overloading vs. Overriding vs. new methods
Dynamic Programming
The static type 'dynamic'
Runtime costs of dynamic
Expression Trees
Design Practices
Exception Practices
Base classes vs. interfaces
Delegates vs. Events
Async Programming in C# -- Summary
This course presents the fundamentals of async programming.
You'll learn what the async and await keywords do in C#.
You'll learn how to use the Task class to create well behaved asynchronous APIs.
You'll learn to use the utility classes that make asynchronous programming easier in C# 5, or later.
Most importantly, you'll learn to spot many of the common mistakes developers make when using asynchronous programming techniques
and what you should do instead.
Developers that are familiar with the C# language and want to learn and use async and await features in C# 5.0, or later.
Some previous knowledge of threading and task scheduling in Windows is helpful in this class.
Async Syntax
async and await
async and await compiler translations
async vs. synchronous Task methods
Task Asynchronous Programming (TAP) Model
Basic TAP idioms
Optional TAP idioms
Design considerations and tradeoffs
Client Responsiveness
UI Responsivenss
Asynchronous Notifications
Asynchronous State Management
Server side Scaling
Avoiding Idle Resources
Minimize context switching
CPU Intensive Requests and Async
Library Design Considerations
Avoid Deadlock
Captured Contexts
CPU bound vs. External Resource Bound
Unit Testing Considerations
Controlling Sync vs. Async
Controlling completion order
Testing failure cases
LINQ Practicum
LINQ and the associated language features changed C# programming drastically.
This course will give you deep knowledge of how LINQ works, and how you can use it to solve many of your everyday coding challenges.
I'll cover practical LINQ tips and tricks, common pitfalls, and how to get great performance from LINQ based algorithms.
You'll learn to create your own LINQ based methods that are consistent with the LINQ execution paradigm.
Developers that have been exposed to LINQ, but are not sure they are using to its fullest potential.
This is an intermediate course, and at least 6 months programming with C# is expected of developers attending this class.
Query Expression Syntax
Basic Syntax
Common Query clauses
Query Results
LINQ supporting Language Features
Type Inference and Anonymous Types
Lambda Expressions
Extension Methods
Lazy Evaluation
Query Variables
Results Evaluation
Controlling Evaluation Eagerness
Query Composition and Fluent Syntax
System.Linq.Enumerable API
Creating Additional Combinators
Query Composition vs. Results Composition
Query Expression Processing and Advanced LINQ Syntax
Query Expression Pattern
Overload Resolution in Queries
Determining Better Methods
IEnumerable vs. IQueryable
IQueryable Goals
Expression Trees
Executing Remote Queries
Single Page Applications with Angular and ASP.NET MVC
This course assumes basic knowledge of ASP.NET and web programming.
You'll learn how to use HTML5 and JavaScript to create engaging modern web applications.
You'll learn how to do more programming on the client side and minimize the number of network round trips to the server.
You'll learn more about JavaScript, HTML5, and CSS. You'll learn to use Angular, JQuery, Bootstrap, and DotLess.
You'll also learn when Single Page Application (SPA) models should not be the used,
but how to make the best use of the SPA technologies in the context of a large application.
During this course, you'll work with major technologies used to build Single Page Applications.
The labs will build up a rolodex style application.
You'll include client side presentation, view model development, data binding with Angular, client side state management,
server APIs, server side storage, and communication protocols.
This course is designed for developers that are new to web programming, or new to ASP.NET and C#.
Minimal prior knowledge of ASP.NET is assumed. Companies that are converting an existing application to a SPA model should attend this class.
Introduction to Single Page Applications
Technologies Used
Benefits and Trade Offs
Mixed Model: Multiple Single Page Sections
Client Presentation
HTML layout
CSS styles
JavaScript Syntax
Client Interaction
Manipulating DOM Elements with JavaScript
Angular.js
Client View Models
Client Server Interfaces
Defining Service Interfaces
RESTFul Services
WebAPI
Application Considerations
State management
Multiple paged applications
Memory usage
Lean Development
This course teaches practical Lean Development practices.
You'll learn how to evaluate your development practices and reduce waste in your workplace.
You'll learn the current practices used by efficient organizations to create software with just enough process to be repeatable, high quality, and fast.
You'll learn how to remove those practices that do not provide enough value to justify the cost of those actions.
Developers and managers interested in reducing the wasteful practices in their organizations.
Defining Lean Practices
"Lean" vs. "Agile"
Optimize the Whole
Examples of Common Practices
Searching for Waste
The "One line Change" test
Queues and Delays
Worthless Deliverables
Change, Measure, React
The right scope of change
Measuring Impact
Adopt or Reject
Case Study: Test Driven Development
Unit Testing
Refactoring
Integration and Load Testing
Case Study: Scrum based Project Management
Backlog Management
Defect Management
Failure Engineering vs. Value Engineering
Continuous Improvement
Measurement Techniques
Proper Change Management
Empowerment
Developer Productivity with C# 6.0
This course provides a survey of the new features in Visual Studio 2013.
You'll get an overview of the language features added in C# 6. The majority of the
content will explain the new language features, and how you can be more productive.
You'll learn to use the new productivity improvement features in Visual Studio 2015.
Finally, you'll learn to use the new team centric features in Visual Studio 2015.
Developers with some experience using a previous version of Visual Studio who are adopting or soon to adopt Visual Studio 2015
and C# 6.0.
This course will be particularly useful to developers that want to convince their organizations that they should
be adopting C# 6.0.
This is still in development. Look for a published agenda by October 2015.
Learning TypeScript
This course explains the features of the TypeScript language. It is designed for
developers that have exposure to JavaScript, but are not JavaScript experts.
This course explores the TypeScript features that lead to increased productivity in
client side web development. We'll explore TypeScript features and how those features
make it easier to create correct programs more quickly.
Developers and teams that are exploring options for large scale web development.
Teams that are looking at using TypeScript to make their client side development teams more
productive.
This is still in development. Look for a published agenda by December 2015.
One ASP.NET
This course provides an introduction to modern web programming using ASP.NET.
It covers the major components of ASP.NET, without assuming prior knowledge of .NET web programming.
You'll learn to work with all the major ASP.NET components.
You'll have the knowledge and practice needed to build modern, professional websites using ASP.NET.
You'll learn the different strengths of different components that are part of ASP.NET and
you'll have all knowledge to pick the best tool from the ASP.NET offerings.
This course is currently being re-designed for ASP.NET vNext.
Expect major updates to the agenda and the topics by Spring 2016.
This course is designed for developers that are new to web programming, or new to ASP.NET and C#.
Minimal prior knowledge of ASP.NET is assumed.
The agenda that follows was developed for Visual Studio 2013. A new version is under development
and will be released for Spring 2016. The new version will cover major topics in ASP.NET vNext.
File: New Project
New Project
Basic IIS Administration
ASP.NET Components
Adding MVC
MVC Architecture
Razor View Syntax
Controllers, Models, and Testing
Adding WebAPI
Why another communication Framework?
RESTful WebAPI
WebAPI vs. ActionResult
Integrating MVC and WebForms
One ASP.NET means integration
Web Forms in the right place
WebForms and MVC Communication
Integrating SPA and MVC
SPA Controllers
JavaScript clients for WebAPI and ActionResult
SPA and Server State
Adding SignalR
Server side Notification
Real time updates
Full Duplex Communication
Open Spaces Seminar
We will explore software strategy in this one day workshop and apply it
to your business and technical objectives. The goal is to provide you with
working strategies for future software development and analyze current
issues that may be ipdeding your team's progress. You will need to be engaged
heavily – this is an active working session! Bring a challenge that is
impeding your team’s progress. We will dig deep into the issue to
design the right solution for your business.
Workshop Objective Examples:
Increase Productivity: Discuss industry best practices and how
to improve your software development process.
Manage Business Expectations: Techniques to help sell technology
initiatives to non-technical colleagues and senior leadership.
Platform Direction: Examine which platform you should invest in for the future.
This course is designed for technical leaders. Typical attendees have titles
of CTOs, architects, principal software engineers.
What's unique about this offering is that you set the agenda.
Bring your most important challenges and we'll tackle them
together.