Throughout my career I have remained passionate about the craft of developing software. It is not only about writing software
that is functional, but also about writing software that is well-structured, reliable, performant, and
maintainable. As a software leader, it is important to be remain technically strong to be able to relate
to and collaborate with team members, to build mutual respect, and to contribute meaningfully to the
success of the organization. And as an individual contributor, software skills and experience reflect
the capability and the value of one's contribution to the business.
Embedded C Development
My earliest work as a software engineer was developing embedded real-time software in C and assembly for mobile phones. Throughout
my career, I have adapted and evolved my capability to program on several platforms and languages, but
I remain completely comfortable in the embedded RTOS programming environment. My graduate studies emphasized
data communication and networking, and I have been working in wireless communications throughout my career.
These recent embedded projects feature wireless connectivity.
Bluetooth LE for Gaming Headset
One of the teams I was managing found itself in a difficult position. Our silicon supplier reported late in the program that
they would be unable to deliver BLE connectivity for one of the major headset designs that was in
progress with mass production only weeks away. Missing BLE would block mobile connectivity for command
and control of the headset, a key product requirement. To prevent the project from falling behind,
over the course of two sprints, I implemented BLE support in the headset using an available Bluetopia
software stack. This involved creating a BLE service, defining and implementing the GATT database,
characteristics, attributes, advertising, and connections. It also included connecting the endpoints
to the data store on the headset to control settings and report back status. I created and reviewed
a design using PlantUML and Confluence, implemented the feature in C, implemented a test mock that
helped me to debug the logic more quickly, and worked with our mobile apps developers to integrate
and test the functionality with iOS and Android peer applications.
Bluetooth Audio and BLE Subsystem
I took on the task of upgrading the Bluetooth solution for a series of headsets in development. The hardware was Cypress
20721 single-chip Bluetooth audio SoC. The application for this design required significant customization
to enable it to work as a peripheral chip in a larger multi-chip design. This included a new portable-host
library that would embed on a PIC32 MCU, a new chip control interface, and modifications of the 20721
on-chip firmware to tailor it to the needs of these particular products for Bluetooth audio as well
as BLE connectivity. This solution included a complete platform bring-up for the new tools and environment,
documented designs of the new host library and SoC application firmware, a stand-alone testing mock
that was capable of running the library on a Windows PC as well as on embedded hardware, and the
20721 application firmware. The design was fully implemented, integrated, and SIG qualified.
Bluetooth Profile Qualification
Part of the development and integration of the Bluetooth subsystem onto various products included
Bluetooth Pre-Qualification testing using the Bluetooth SIG PTS tester, setting up projects in
LaunchStudio, executing tests, collecting logs, debugging the implementation, publishing reports,
and working with BQTFs to generate the End Product Listings
Python Projects
Python has been my tool of choice for more than five years for applications including automation, production tools, Devops,
and process tooling. It is an elegant language, able to adapt to something as simple as a script
and as complex as a backend. Its ability to operate cross-platform and access REST interfaces and
physical IO is particularly useful for tooling and test automation. PyPI Python modules are available
for almost any service helping speed development. Some of the modules I have used include Request,
PyUsb, PySerial, Jira, Trello, GitPython, FtpUtil, OpenPyxl, GitHub3, XmlToDict. Examples of Python
tools I wrote are summarized in this section.
Multi-Threaded Gang Programmer
A multi-threaded gang-programming USB firmware update tool helps to mitigate delays in production line programming by allowing
a relatively large number of devices to be programmed in parallel. As each device attaches to the
USB bus, a worker thread is started to program that device while the main programmer waits for other
devices to enumerate. There's an arbitrarily large number of worker threads that can run, and so
the capacity of the programmer is limited by the PC's ability to service the USB bus. One challenge
to overcome in the design was that a single device being programmed could reset, and therefore re-enumerate
multiple times in the programming process. To handle this case, a worker thread has the ability to
lock the bus so during an interim enumeration, new devices can not enumerate until the known device
is back on the bus. The utilization of the PC resources is highly optimized in the case of gang programming,
because the programming process itself is inherently bursty allowing the additional devices to work
in the gaps.
Relay Control for Test Automation
Test automation is an important force multiplier for small and large teams seeking to optimize the resources available for
testing. But some challenges exist when automating functional testing of consumer hardware products.
Often use cases involve the user physically interacting with the device by pushing buttons, spinning
knobs, and getting feedback from LEDs. In response, I developed a test control framework that used
PySerial and PyUSB modules to define device control classes for manipulating the physical interface
of products. By leveraging additional Python application-specific modules to control video players,
audio players, wireless connections, and power, this framework was able to implement stress tests
that could be employed preemptively in build pipelines, or reactively such as to reproduce a reported
problem or to confirm a fix.
GitHub Actions Pipeline
YAML-based Devops pipelines for continuous integration, testing, and deployments have become more popular in the world of
software build automation over the past few years, often displacing older tools like Jenkins and
Bamboo. GitHub's particular flavor of YAML pipelines is implemented as GitHub Actions. There are
some benefits of GitHub's implementation, including its available secure storage of secrets, support
for local build/test machines, a third-party marketplace, GitHub's own REST API, and a very accessible
implementation. Indeed, one of the advantages of this type of system is that it is more open to customization
by the team, because pipelines can be implemented or customized without a strict dependence on an
administrative gatekeeper. When joining a company that had no CI or build automation in place, I
prototyped initial build pipelines to support compilation and storage of artifacts, initially for
Windows Xamarin products. Later, after onboarding a dedicated Devops engineer, I worked with the
engineer to develop key parts of the process that was employed across embedded, mobile, and desktop
projects for our software and firmware teams to use.
Auto-Generated Release Notes
Jira and Git are powerful tools, but on their own, they are not aware of each other. There may be an exception for Atlassian's
BitBucket, but in my situation, we were deploying from GitHub while tracking our work in Jira. To
help get the most out of our pipelines, I implemented a release notes script using the Jira and GitHub3
Python modules. The implementation of our deployment pipeline used a sequence of deploy branches,
with pull requests from one branch to another triggering pipeline jobs that would fulfil the deploy
steps for the environment. This release notes script would pull all of the commits from a deployment
pull request since the previous deployment. It would extract Jira keys from topic branch names in
the Git commits. Once the Jira keys were known, then additional information was pulled from Jira
including the description, author, dates, and labels, and this data was aggregated with the Git history
to produce release notes that were organized as a series of Jira descriptions and the associated
Git SHAs. The release notes data, organized by Jira instead of a more traditional git log listing,
is more useful to product owners and other stakeholders as well as to testers who often are tasked
with verification at the Jira ticket level.
JIRA Burndown Tool
You might be thinking that Jira already has a burndown report, but I was working with a team that was simultaneously engaged
on multiple projects in parallel. While we could track the team's burndown based on their progress
against the sprint planning, the builtin burndown report measured the health of the team rather than
the health of any particular project. I wrote a burndown tool using the JIRA REST interface to pull
the relevant data from the Jira database on a project-by-project basis. This allowed me to collect
and report on the burndown progress for specific projects even while the team was working on multiple
projects in parallel.
Trello Product Backlog Tools
The Trello backlog tools came out of a desire to build a backlog that could be used to visualize a long-term product roadmap.
In Trello, a release train was represented by a series of lists of high-level features. Features
were created as Trello Cards and were intended to align with high-level epics in the Jira backlog,
subject to triage, prioritization, and modification at backlog meetings before they were delivered
to engineering. Each list corresponded to a proposed feature bucket for a given list. In order to
normalize the format of the feature requests, a form was used to collect the data. I wrote Jira tools
that served as connectors between Jira and Trello using the respective REST APIs. Both Atlassian
tools have powerful and intuitive APIs with good Python support out-of-the-box, and the Python logic
was used to connect the tools in the ways necessary to implement the process.
Education and Training
I attended Case Western Reserve University, majoring in Computer Engineering, and achieving a Bachelors of Engineering in
1989. Later, after working several years as a software engineer at Motorola, I attended DePaul University
in Chicago, receiving my Masters Degree in Computer Science with an emphasis on data communications and
networking and additional coursework in human-computer interaction.
Case Western Reserve University
B.E. Computer Engineering, 1989
DePaul University
M.S. Computer Science Data Communications, 1996 GPA = 4.0/4.0
Online Training
Online training represents a commitment to continuous learning that is required in modern software
development, because tools, frameworks, languages, and processes are continuously changing and
improving. These are some classes I have taken.
Python Programming for Developers
Ultimate JavaScript Mastery Series
Complete React Native + Hooks
Ultimate Design Patterns
Xamarin Forms: Build Native Mobile Apps with C#
Ultimate Django
Complete SQL Mastery
Ultimate Git Course
iOS Essentials with Swift
An intense seven-day bootcamp in Asilomar, California focusing on Swift and iOS App Development.