Software Development

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.