- Software engineer and architect with ~15 years of experience
- Everything from embedded to web-scale platforms including front-end web and mobile
- Worked in early stage to mature startups, government research, enterprise IT
- Co-Founded two startups and served as technical leader
- Graduate research in high performance computing systems and large-scale parallel streaming graph databases
- Loves to build things, write code, take on challenges (don’t ask me about ultramarathons unless you want me to talk your ear off)
email@example.com (205) 422-0909 916 Rosedale Road NE Atlanta, GA 30306
Hover over, click, or tap an element in the list to get more details about how and when I used a particular technology and how comfortable I am using it. I’ve also included some of my thoughts, which can change, but may give you an idea of how I approach architecting and writing software. Please note that this list ranges from technologies that I could use or apply without reference to technologies that I’ve used previously but could not be effective in (without refreshing my knowledge).
Programming Languages, Frameworks, and More
- Go I’ve been writing Go for almost 10 years as one of my primary programming languages at Documi, Nix, and Ionic. I have used it to write backend web services, command line tools, and other internal tooling. I find it to be at an excellent Pareto point balancing performance, productivity, readability, and maintainability. The language can be learned quickly by practitioners of other programming languages. It also has a small number of flexible built-in types which make integrating libraries easier and more efficient since Go APIs tend to use basic types instead of implementing disparate-but-similar type hierarchies that lead to needless copying or lots of adapter code. Lastly, I like the way Go favors composition and interfaces over more object-oriented inheritance hierarchies.
In my last two startups, I’ve written frontends in
Prior to that I’ve used it in a variety of personal and professional projects
historical baggage, but it is very flexible, has performant
implementations, a massive ecosystem, and very effective UI frameworks.
I’ve contributed to Documi’s Flutter-based mobile
applications in Dart. I also wrote the reader component making use of a PDF
rendering library, wrote a custom-written PDF parsing library with the ability
to rewrite the PDF in order to encrypt/decrypt individual pages and their
objects, wrote Documi’s Dart-based mobile library including implementations of
JSON Object Signing and Encryption, and wrote a native extension to use Crypto++
for cryptographic operations. As a language, I like the type and null-safety
(post 3.0) of Dart. The AOT compiled performance gives it a significant
- Lua Documi’s rules engine is an embedded Lua interpreter, and all rules were written in Lua. I’ve also used Lua in Redis, OpenResty, and as a scripting a glue language in other personal projects.
Most of my graduate school research was written
in C. Things I’ve written include the core of STINGER which was a
high-performance streaming graph analysis library and software suite running
on OpenMP on x86_64 and the Cray XMT, a configurable cache hierarchy
simulator that operates on Pin tool memory traces, embedded software for TVs
at Toshiba DPDC, personal projects like a raycaster, a GameBoy emulator, and
more. It’s one of my favorite languages. I like the simplicity of the
language from a conceptual perspective, how easy it is to reason about how
code will run in hardware, and its utility in extending
Most of my undergraduate and graduate
coursework used C++. I’ve implemented a number of parallel graph algorithms
and others in C++ and CUDA. I also used C++ extensively at GTRI on internal
research projects. At Ionic, I used the C++ SDK to create
Ionic-encrypted versions of applications like LimeChat, HexChat, and
Thunderbird. At Nix, I contributed to the Qt and C++-based mobile SDK.
Personally, I prefer to treat C++ as C with classes and use templates for
generic containers but avoid template metaprogramming unless
absolutely necessary for performance. Modern C++ can be fairly developer
friendly, but the language is large and requires familiarity with most of it
and its history to be able to pick up and understand most C++
- Java Our introductory undergraduate computer science classes started with Java. I was introduced to Android around 1.6 and immediately started experimenting with developing apps. In graduate school I used Java to implement algorithms on top of other graph libraries and databases for research and benchmarking purposes. I wrote wrappers for STINGER using SWIG initially and later JNI directly. I used Java in Nix for an integration with MuleSoft. I’m comfortable writing in Java, but tend to prefer a YAGNI/KISS style of architecture and naming to the more traditional enterprise pattern, interface, and class hierarchy heavy approach.
- Kotlin At Nix, we used Kotlin for our mobile application logic in a later pivot. I wrote a Kotlin library to communicate with our backend and to wrap and expose cryptographic operations. I don’t have extensive knowledge of the language, but could hack my way through it.
- Python My first real use of Python was a federated task management platform on AppEngine. I used it in graduate school for scripting and data analysis. I wrote ctypes wrappers for STINGER and at one point implemented a querying and visualization web interface served by Flask. Ionic acquired and used a data model as a service platform based on Tornado and MongoDB which I then tuned and optimized to eliminate multi-process bottlenecks. Overall, I think Python is a great choice for scripting, gluing lower-level libraries together, and prototyping; however, I wouldn’t recommend its use to build large systems. While I’m well aware of its successful application in a variety of use-cases, the lack of strong typing (although there are type hints), the size of the language (which only continues to grow), historical problems with packaging and distribution, poor performance (although there are many attempts to solve this - cython, Numba, Mojo, et al.), and easily abusable dynamic mechanisms within the language all lead to large codebases being difficult to maintain, reason about, tune, and collaborate on.
- C# I wrote a Metal Slug clone in C# in undergrad. I also wrote a few Office extension experiments at Ionic in C#. I do not have extensive knowledge of C#, but could hack my way through it.
- PHP I wrote websites in PHP in high school (poorly) and undergrad. The first version of Ionic was built on a LAMP stack. Most recently, I wrote a Magento module to integrate with Nix.
- Visual Basic Visual Basic 4-6 was the first programming language I wrote anything in as a kid. Having a familiarity with VB is what got me a summer job at MBUSI. I was supposed to replace a programmer on a VB.NET / ASP project. I ended up getting pulled on to other projects, but I did end up writing a few things in VB and VBA along the way.
- Scala I’ve implemented loading graph data into Spark and running a few algorithms. This was ten years ago. I don’t have extensive knowledge of Scala.
- PDF I wrote a Dart library capable of reading and writing PDFs to encrypt and decrypt individual pages and their referenced object trees.
- PostgreSQL Postgres was chosen at Ionic for the on-prem and cloud key server infrastructure. We designed a multi-datacenter active-active architecture using parallel replica sets of Postgres instances with at least a local primary and full-commit replica per data center and remote read-only replicas in other datacenters. An application-level partitioning and addressing scheme was employed to route requests and store data across replica sets and datacenters. We employed a similar design at Nix but partitioned by tenant. For Documi, We used database-level table partitioning and foreign data wrappers to store partitions on separate replicas. Postgres is a tool I would reach for again.
- Redis I’ve used Redis for streaming, queueing, caching, doing in-memory aggregation, locking, running Lua scripts, and more. I first used it at GTRI and most recently at both Nix and Documi. Redis is an excellent solution for these use cases and many others. While it likely shouldn’t be used in cases requiring strict durability, it excels at low latency and high throughput operations, can be clustered and partitioned, and does have configurable persistence.
- SQLite I’ve used SQLite in Android, iOS, in local tools, and in experiments as a graph database. It’s pervasive for a reason. It’s small, easy to integrate, easy to use, and works very well.
- MariaDB/MySQL I have some limited experience with MariaDB and MySQL. I am more comfortable with the built-in types and SQL dialect of PostgreSQL.
- Cassandra I lead a project to build the primary data storage for Ionic’s cloud infrastructure on top of the DataStax version of Cassandra. The performance and avilability requirements of the project along with requiring per-tenant selectable replication topologies led to the choice. The system we were replacing acted as a general document database built on top of MongoDB, so the replacement had to behave similarly. This required the development of custom secondary sorted and full text indexes that weren’t supported using the built-in indexes available in Cassandra at the time. Overall, I found Cassandra to be very resource intensive, difficult to tune, and limited from a feature perspective. I would really only use it again as a distributed key-value store that needs high write throughput.
- MongoDB I replaced a system that acted as a general document database built on top of MongoDB. This process required me to tune the overall system and its usage of MongoDB. I also used MongoDB at GTRI in a few smaller projects as a flexible backend for schema-less data. While at GTRI I attended a two-day MongoDB training, but that was several major versions ago. Overall, MongoDB is best used for rapid prototyping. In production, it could be used for unstructured data, but the performance, reliability, predictability, integrity, and maintainability of more traditional SQL databases make them a better choice for primary data storage in my opinion.
- Graph Databases I performed a survey of graph databases at the time I was working on STINGER to better understand other technologies in the commercial and open-source space. Overall, they provide a nice model for interacting with large graph data, but most tend to only be capable of egonet-centric queries and perform poorly on algorithms traversing significant portions or all of the graph. That’s to be expected given that most graph algorithms amount to pointer jumping and doing that efficiently on disk requires careful data preprocessing and layout (in-memory too for that matter). While the query language and models helped to get into a graph-centric frame of mind, they tend to limit the user to only that model while SQL databases with appropriate schemas are capable of similar egonet queries with a few joins while still retaining all of the full capability and flexibility of the relational data model.
- SQL I have used SQL in a variety of projects across a variety of implementations. I am by no means an expert, but I’m capable. Most recently, I’ve tended toward using a self-modified version of xo which is a code generation tool written in Go that captures a SQL database’s schema and then renders templates corresponding to the tables, indices, functions, and types found in the schema. This allows you to write a schema in SQL, use a migration tool to manage schema updates, then generate code so that you have a level of static schema safety guarantees but limited to only reflect queries that will operate efficiently on the indices and constraints that you have.
Build, Ops, Tools
- Docker I’ve been using Docker for years for various development environments, repeatable build / CI environments, on my home server, and in deployments. Generally, I try to make any non-trivial project capable of running locally with any database or other service dependencies inside of Docker containers for live local testing.
- Kubernetes Nix and Documi were both built on a handful of services running on a Kubernetes cluster. I wouldn’t consider myself an expert, but I created and maintained the configuration. Kubernetes provides a convenient abstraction for virtualizing resources for services, managing routing, interacting with autoscaling (especially used in combination with a managed offering that can add more VMs to the pool), and handling deployment and rollouts.
- Google Cloud I managed our Google Cloud Platform at Documi and Nix. We used GKE, Cloud SQL (managed Postgres), Cloud Memory Store (managed Redis), Cloud Run, Cloud Storage, and Container Registry. For a small group, I find GCP to be easier to manage than AWS. It has fewer service offerings and a less extensive IAM implementation , but the basics are covered. GCP’s managed offerings also tend to be very close to the open-source counterparts on which they are built.
- AWS I have personally used AWS for elastic computing for performance testing, lambda functions for personal projects, and SES for bidirectional email at Documi. At Ionic, our cloud infrastructure was built on AWS and our managed versions of our on-prem infrastructure also ran in AWS. I was not responsible for configuring or maintaining this infrastructure, but I did help with some of the architecture for the managed on-prem components. As a result, I worked with Aurora for our key server infrastructure.
- Windows, Linux, MacOS I’m probably most at home with the GNU/Linux variants of Unix tools on a command line interface, but I typically use all three major operating systems interchangeably and often at the same time. For example, I’m typing this in Vim running on a WSL2 virtual machine on a Windows desktop sitting next to my MacOS laptop with both connected to file storage on my Linux-based server. Additionally, one of the first things I did for Documi was implement JOSE in Dart using a Flutter test bench with Crypto++ for native implementation underneath across Windows, MacOS, Linux, Android, and iOS.
- Bash My main terminal program and most-used scripting language is probably Bash. I also have a few functions and aliases that I rely on frequently. The ability to quickly create pipelines and to operate directly on large numbers of files is hard to beat in productivity for me.
- Make While I’ve used many build systems, at the end of the day I find a well-written Makefile is the most convenient way to manage building, testing, packaging, and deploying software. The dependency files to target file via running arbitrary commands paradigm is so close to universal.
- Vim I’ve been using Vim for years to write almost all of my code and most of the text I write on a computer (like what you’re reading now). I also use IDEs where needed, where appropriate, or where they offer an obvious advantage for a particular framework, but I like the customizable nature, simplicity, and flexibility of Vim.
- Git I’m not a git master, but I’ve used it for a decade to manage revision control over nearly every project I do.
- CI/CD Pipelines I’ve managed the CI/CD pipelines at Documi and Nix using Drone-CI and Travis-CI. Both were configured to run build, test, packaging, and continuous deployment to production environments.
Documi, Inc., Atlanta, GA
Co-Founder, CTO September 2021 - July 2023
- Developed end-to-end encrypted document distribution and telemetry platform capable of real-time streaming and rule evaluation/reevaluation via a dynamic rules engine and application of rules at the page level.
- Created custom multiparty key management and distribution infrastructure with dynamic updates, efficient access, and forward secrecy
- Wrote client libraries for mobile and web applications
- Built web application with integrated document viewer, rules editor, telemetry views, user and identity management, chat and comment interfaces
- Shared responsibilities of running and leading the company with co-founder
- A little bit of everything
Nix Software, Atlanta, GA
Co-Founder, Head of Engineering September 2018 - August 2021
- Lead design and build of a consumer data protection management platform for GDPR / CCPA compliance with fully automated data rights management
- Created integrations for Magento, Salesforce, HubSpot, MuleSoft
- Designed and built a real-time encryption key management and distribution service including all backend and client libraries.
- Documented interfaces, APIs, usage, created examples
- Directly involved in sales and marketing with CEO / CMO
- Produced demo and marketing videos
- Worked customers to implement and refine products
- A little bit of everything
Ionic Security Inc., Atlanta, GA
Platform Architect, September 2017 – September 2018
- Designed and lead development of document store on top of Cassandra that included creating, maintaining, querying a custom implementation of secondary indices
- Re-designed system architecture to reduce minimum footprint from tens of servers to a scalable system that could run on a single node or scale out horizontally
Senior Engineer, May 2014 – September 2017
- Designed and developed high-performance multi-datacenter key management infrastructure capable of generating, encrypting, and storing ~10,000 keys per second
- Developed cloud or on-prem authentication infrastructure with support for SAML, OAuth, Email, cross-tenant federation
- Performance tuned Python and MongoDB data infrastructure to extends its life until a replacement could be deployed
- Designed key addressing scheme and system routing
- Built a user and group management and authentication service on top of OpenLDAP
Innovative Computing, CTISL, Georgia Tech Research Institute
Research Scientist, August 2012 – May 2014
- Extended novel STINGER dynamic graph technology to analyze large streaming semantic and temporal datasets under DARPA ADAMS program.
- Built client-server architecture, templated parsing tools, integrated analytics, and web-based visualizations and front-ends for streaming data analysis problems.
- Developed tools for analysis, exploration, and representation of XDL-level FPGA configuration.
High Performance Computing Lab, Georgia Institute of Technology
Research Assistant, August 2010 – August 2012
- Developed large-scale high-performance parallel streaming graph applications for multi-core and massively multithreaded architectures
- Conducted research in application-driven design for future architectures under the DARPA UHPC program
Mercedes-Benz U.S. International, I.T. Dept., Tuscaloosa, AL
Client Support Team, Summer 2006, 2007, 2008 & 2010
- Created inventory management database system
- Developed automated solutions to hardware and software incompatibility issues
- Worked on a large-scale deployment of Daimler-Chrysler’s corporate standard Windows operating environment to more than 1,200 computers
Toshiba Digital Products Development Center, Nashville, TN
Software Development Intern, Spring & Summer 2009
- Developed software for Linux-based televisions
- Implemented new features to match specifications
- Resolved software bugs and optimized low-level code
Process Automation and Simulation Services, Inc., Birmingham, AL
IT Specialist, Summer 2007
- Configured and installed primary server for VPN, file, web and email hosting services
- Used virtualization technology for cost-effectiveness, security, and resilience
Georgia Institute of Technology, Atlanta, GA
Master of Science, Computer Engineering, August 2012
Vanderbilt University, Nashville, TN
Bachelor of Engineering, Computer Engineering, May 2010
GPA 3.92, summa cum laude
Systems and Methods for Requiring Cryptographic Data Protection as a Precondition of System Access. U.S. Patent 11210412. Filed Feb. 1, 2018, Issued Dec. 28, 2021.
Systems and Methods for Encryption and Provision of Information Security using Platform Services. U.S. Patent 10020936. Filed April 3, 2017, Issued July 10, 2018.
Systems and Methods for Encryption and Provision of Information Security using Platform Services. U.S. Patent 9614670. Filed Feb. 6, 2016, Issued April 4, 2017.
R. C. McColl, D. Ediger, and D.A. Bader. “Many-Core Memory Hierarchies and Parallel Graph Analysis,” Poster Session, 15th SIAM Conference on Parallel Processing for Scientific Computing (PP12), Savannah, GA, February 15-17, 2012.
O. Green, R. McColl and D.A. Bader, “GPU Merge Path – A GPU Merging Algorithm,” Conference Presentation with Proceedings, 26th ACM International Conference on Supercomputing (ICS 2012),San Servolo Island, Venice, Italy, June 25-29, 2012.
O. Green, R. McColl and D.A. Bader, “A Fast Algorithm for Streaming Betweenness Centrality,” Conference Presentation with Proceedings, 2012 ASE/IEEE International Conference on Social Computing, Amsterdam, The Netherlands, September 3-5, 2012.
D. Ediger, R. McColl, J. Riedy and D.A. Bader, “STINGER: High Performance Data Structure for Streaming Graphs,” Conference Presentation, The 16th Annual IEEE High Performance Extreme Computing Workshop (HPEC), Lexington, MA, September 10-12, 2012.
T. Senator, D.A. Bader, et al., “Detecting Insider Threats in a Real Corporate Database of Computer Usage Activities,” 19th ACM SIGKDD Conference on Knowledge Discovery and Data Mining (KDD), Chicago, IL, August 11-14, 2013. (726 papers submitted: 17.4% acceptance rate)
J. Fairbanks, D. Ediger, R. McColl, D.A. Bader and E. Gilbert, “A Statistical Framework for Streaming Graph Analysis,” IEEE/ACM International Conference on Advances in Social Networks Analysis and Modeling (ASONAM), Niagara Falls, Canada, August 25-28, 2013.
R. McColl, O. Green, and D.A. Bader “A New Parallel Algorithm for Connected Components in Dynamic Graphs,” The 20th Annual IEEE International Conference on High Performance Computing (HiPC), Hyderabad, India, December 18-21, 2013. (196 papers submitted: 25.0% acceptance rate)
R. McColl, D. Edgier, J. Poovey, D. Campbell, and D.A. Bader “A Brief Study of Open Source Graph Databases,” ArXiv e-prints. cs.DB 1309.2675. September, 2013.
R. McColl, D. Ediger, J. Poovey, D. Campbell, and D.A. Bader “A Performance Evaluation of Open Source Graph Databases,” The 1st Workshop on Parallel Programming for Analytics Applications (PPAA 2014) held in conjunction with the 19th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming (PPoPP 2014), Orlando, Florida, February 16, 2014.
D. Ediger, R. McColl, J. Poovey, and D. Campbell “Scalable Infrastructures for Data in Motion,” The 1st International Workshop on Scalable Computing for Real-Time Big Data Applications (SCRAMBL ’14) held in conjunction with the 14th IEEE/ACM International Symposium on Cluster, Cloud and Grid Computing (CCGrid 2014), Chicago, Illinois, May 26, 2014.
D. Appling, E. Briscoe, D. Ediger, J. Poovey, and R. McColl “Deriving Disaster-Related Information from Social Media,” The 2014 ACM KDD Workshop on Learning about Emergencies from Social Information (LESI), New York, New York, August 24, 2014.
D. Ediger, S. Appling, E. Briscoe, R. McColl, and J.Poovey “Real-Time Streaming Intelligence: Integrating Graph and NLP Analytics,” The 18th Annual High IEEE Performance Extreme Computing Workshop (HPEC), Lexington, MA, September 9-11, 2014.