About me
I have over 14 years’ experience as a software engineer and a data analyst. Prior to that, I completed two Masters’ degrees: an MS in Artificial Intelligence, and an MA in Philosophy. While in graduate school, I worked as a teaching associate, and that experience taught me that software development has as much to do with teaching as it does with getting the computer to run your code. As a result, I emphasize legible, maintainable code, easy-to-use APIs, and clear documentation.
I have used many different programming languages, including Python, Java, C#, Javascript, PHP, and Go. I’m very quick to pick up a new framework or programming language. More than once, I’ve been hired for a role that involves programming in a language I’ve never used before, and was able to contribute production-ready code in a matter of days. I’ve taken it upon myself to learn different programming paradigms, such as functional programming (F#, OCaml) and logic programming (Prolog). I truly believe the mental exercise of learning to program in a language that works very differently than the ones you’re used to makes you a better programmer even in traditional object-oriented languages.
Programming isn’t just my job. It’s also my hobby. Where others might work crosswords or sudoku, I sometimes write simple programs for no reason other than the mental challenge and the satisfaction of building something new. Such projects include a demonstration of heap sort, an implimentation of the riemersma dithering algorithm, and a text mode Tetris clone.
One thing that sets me apart from other developers, especially today, is that I do not use LLM coding assistants of any kind. I object to them on ethical grounds because of their environmental impact and disregard for consent when ingesting training data. But I also strongly believe that reliance on LLMs make you a worse developer. It doesn’t matter if you can type a couple of prompts and get a thousand lines of code if you don’t understand how the code works, or what it does. If I’m working with an unfamiliar language or library, it is my job to learn how to use it well, so that I can write code and know that it does what I intend. Plus, it’s worth taking more time up front to write the code if the result is easier to understand and more maintainable. The true bottleneck in software development isn’t how fast you can produce new code; it’s how easily you can use, extend, and refactor the code once it’s written. Only the deliberate process of planning a program in your head and translating it into working code can produce genuine quality software.
Experience
Senior Software Developer II
2024 - Present · Waystar
- At Waystar, I designed, built, and maintained ETL pipelines supporting our data analytics platform.
- I also implemented integrations with third-party partners for ingesting payment data from a variety of medical practice management software.
Data Analyst
2018 - 2023 · Doximity
- On the Careers team, I helped administer the weekly Jobs Digest, matching job candidates to employers based on stated preferences as well as education, employment history, and activity on Doximity’s social network.
- As part of the Network Data team, I helped design and implement a framework for training and deploying machine learning models to recommend personalized content for users’ feeds.
- As a member of the cross-product Data Modeling team, I helped administer our Snowflake data warehouse, reviewing pull requests to ensure they conformed to dimensional modeling best practices.
Software Engineer
2016 - 2017 · BetterCloud
- On the Asset Ingestion team, I built RESTful microservices in Java for ingesting data from commercial APIs including Dropbox, Slack, and Google Drive.
- I also developed a custom Spring Boot Initializer server for creating new products with company-internal dependencies.
Software Developer
2014 - 2016 · athenahealth
- I wrote complex SQL Server queries for extracting, transforming, and analyzing data from a variety of practice management software.
- I helped build the Athena Device Manager application for interfacing with various medical devices and relaying data to our web application. I also developed several custom device integrations for this application.
Software Engineer (contract)
2013 · Actuatics
- I developed software for parsing transcripts of physicians’ voice notes and tagging them with ICD-9 and CPT procedure codes.
Software Engineer
2012 - 2013 · Veloxiti (formerly Applied Systems Intelligence)
- I worked on the Warfighter Associate application, developing a natural language processing pipeline for parsing battlefield text communications and matching to GIS location data to alert warfighters to potential threats.
Graduate Research Assistant
2008 - 2012 · The University of Georgia
- I proofread the book Persistence and Spacetime by Dr. Yuri Balashov in preparation for publication.
- I worked on the ARC Project under the direction of Dr. Stefaan Van Liefferinge to build a Prolog knowledge base of architectural features of Gothic cathedrals.
Teaching Associate
2005 - 2007 · University of South Florida
- I taught Critical Thinking and Introduction to Philosophy, introducing students to philosophical argumentation, formal logic, and common fallacies.
Education
Master of Science, Artificial Intelligence
2012 · The University of Georgia
Thesis: Syntactic Stylometry: Using Sentence Structure for Authorship Attribution
Master of Arts, Philosophy
2005 · Louisiana State University
Thesis: Martin Heidegger's Phenomenology and the Science of Mind
Bachelor of Arts, Philosophy
2003 · Mississippi State University
Publications
Theses
2012; Hollingsworth, Charles; Syntactic Stylometry: Using Sentence Structure for Authorship Attribution; Thesis, Master of Science, The University of Georgia
2005; Hollingsworth, Charles; Martin Heidegger’s Phenomenology and the Science of Mind; Thesis, Master of Philosophy, Louisiana State University
Proceedings
2012; Hollingsworth, Charles; “Using Dependency-Based Annotations for Authorship Identification”; Text, Speech and Dialogue: 15th International Conference, TSD 2012, Brno, Czech Republic, September 3-7, 2012, Proceedings
2011; Hollingsworth, Charles; Van Liefferinge, Stefaan; Smith, Rebecca A.; Covington, Michael A.; Potter, Walter D.; “The ARC Project: Creating Logical Models of Gothic Cathedrals Using Natural Language Processing”; LaTeCH ‘11: Proceedings of the 5th ACL-HLT Workshop on Language Technology for Cultural Heritage, Social Sciences, and Humanities
January 8, 2011; Hollingsworth, Charles; “Syntactic Stylometry: A Dependency Grammar Approach to Forensic Linguistics”; Poster presentation, Linguistics Society of America, Pittsburgh, Pennsylvania
Projects
Geodesic calculator
My first foray into Pyscript. Draws a geodesic dome or sphere and calculates the number and lengths of struts needed to build it.
stylometry-airflow
This is a simple Airflow pipeline for scraping an RSS feed, extracting the text, and running the text through the Stanford Dependency Parser. It’s an automated version of what I did by hand when working on my MS thesis. Up until now, all of my work involving Airflow pipelines has been for work, behind corporate firewalls where I can’t show it off. This is an attempt to remedy that.
riemersma
This is a simple program implementing riemersma dithering in Python. When I first learned about this method, it was like a nerd-snipe directed specifically at me: it combines retro-style computer graphics with fractals and recursion.
fomosynth
Not quite ready for prime time, this project is hard-coded to work with my particular MIDI hardware and will likely need manual tweaking to get it to work. It’s a simple FM synthesizer (think the Yamaha DX7 or any other mainstream synth in the mid-to-late-’80s) implemented in Python and PortAudio.
heapsorter
Just a quick little script I wrote to demonstrate heapsort. Uses console colors to illustrate the state of the heap from step to step.
euclidym
Code to generate Euclidean rhythms in F#. I think I originally had the intention of turning this into a full web-app in Fable but as it is it’s just an HTML file and a program that spits out base64-encoded MIDI that you can then manually paste into the HTML.
Joy
Another started-and-abandoned project. I wanted to implement an interpreter (or maybe even compiler) for the Joy programming language in F#. I quickly got in over my head. I definitely plan to return to it someday, though, just for the experience of finally implementing a programming language interpreter (and bringing a fun language back to life).
nimblewill
This is a program that plays the games of Hex and Y using Monte Carlo tree search. It’s mainly a demonstration program for my hexea Python library.
mast2opml
Want to follow people on Mastodon but hate social media? Now you can export your Mastodon follow list and turn it into a set of RSS feeds that you can read from the comfort of your favorite feed reader.
mandy
Text-mode (curses) Mandelbrot set viewers I wrote in Python and Ruby.
grammar-inducer
A class project I wrote for my CSI/LING 8570 class (Natural Language Processing) while in graduate school at UGA. Attempts to induce a dependency grammar given a corpus in an unknown language. Probably not my prettiest Python code, and may only work in Python 2.
2squares
Simple “game” I wrote while learning Javascript. Two players see two squares on their screens. Each player can move one square around. Not much more to it than that.
tris
Text-mode (curses) Tetris clone written in Python.
hexea
Python library for representing game states in the related games of Hex and Y, and generating random playouts. Mainly intended as a building block for writing Hex-playing algorithms. My first foray into writing C++ extensions in Python! It wasn’t fun! Except it kind of was!
Interests
Permacomputing
Do you really need a new smartphone every two years? Is your brand-new Macbook Pro really that much better than a 2013 ThinkPad for the things you do every day? Does everything have to be an app that’s constantly online, sending a never-ending stream of your data to servers you don’t control? When the neutron bombs fall and the Internet is no more, will you still be able to use your computer? Permacomputing explores the use of hardware that lasts, software that’s offline-first and doesn’t need to update every week, and being in charge of your own data. If your tech stack can’t survive the zombie apocalypse, what good is it?
Retrocomputing
I grew up in the ’80s, and my father was a programmer (back when they still called them that, not “coders” or “software engineers”). So instead of a Commodore 64 or Apple II, we had a Dynabyte 5100 and a Compucolor II. That’s probably why I’m still drawn to collecting old technology and making it do new things. CP/M is not dead!