Over 15 years of experience building scalable high-performance applications, APIs, and backend systems and services. Led the architecture and development of high-transaction content management systems, publishing tools, and social networking platforms. Experienced thought leader with success leading engineering teams, and designing software and architectures which support evolving business needs. Committed to developing light-weight malleable software and skilled at leveraging Domain-Driven Design, separation of concerns, and inversion of control. These methodologies encourage the development of decoupled modular code which reflects the ubiquitous language of the subject domain, and agile iterative development allowing for quick pivots and easy integrations.

Sub-reference Type Representation Strategy Instead of nodes having an implicit __type__ field on them - they are related to their "type node" via the INSTANCE_OF relationship. Type nodes are then connected to the root node via a SUBREF relationship. This creates a fully connected graph (all nodes are accessible from the root). Since there is no implicit "type" parameter on nodes, Cypher queries that find relationships to a particular node type will need to be done differently. Here is an example of finding all SAVED Event types for a specific User as opposed to all SAVED Foo or Bar types:... Continue reading

For some time now I have been a bit perplexed about logging in Java. Not only does it seem overly complicated, but the community is fragmented around all the different frameworks, wrappers, and implementations. So I thought I would sit down and try to learn the history, understand the pros and ...

For some time now I have been a bit perplexed about logging in Java. Not only does it seem overly complicated, but the community is fragmented around all the different frameworks, wrappers, and implementations. So I thought I would sit down and try to learn the history, understand the pros and ...

If you're like me you really like the new Servlet 3.0 spec that allows for annotated servlet classes. This approach along with the new ServletContainerInitializer interface potentially allows for code-based application configuration and deployment without a application deployment descriptor (web.xml) file. But can you achieve ordering? You can. Continue reading

I like Dropbox. It is my own personal cloud storage. I use it for most of my documents, as well as many application data files. Today I found another use for it: Save PDF to Dropbox Web Receipts Folder. Continue reading

Rich - Thanks for your post! I enjoyed writing this one. So many people implement complicated directory structures for hashing - with dates, and timestamps, and user names, etc - find this simple approach fits most of the use cases. Thanks again! ~Michael

Most modern UNIX filesystems do not limit the number of files you can store in a single directory. However, stat operations such as listing files, following paths, or checking for the existence of a file will take longer as the number of entries in a directory increases. On some systems, I ha...

Absolutely. Checking a boolean twice is not very expensive overall. If you are passing a parameter that is expensive to evaluate (like object serialization) - then you still need to do the wrap. Thanks for pointing that out! :)

For some time now I have been a bit perplexed about logging in Java. Not only does it seem overly complicated, but the community is fragmented around all the different frameworks, wrappers, and implementations. So I thought I would sit down and try to learn the history, understand the pros and ...

For some time now I have been a bit perplexed about logging in Java. Not only does it seem overly complicated, but the community is fragmented around all the different frameworks, wrappers, and implementations. So I thought I would sit down and try to learn the history, understand the pros and cons of each framework, and determine my preferred logging ecosystem. Continue reading

I recently had some Subversion fun when I decided my organization needed to upgrade from Subversion 1.4 to 1.6. Since the release of 1.4 there have been monumental advances in disk storage and merging capabilities. We “branch for feature” off the trunk (which is also in development), and need to merge back into the trunk after the branch is released. Subversion 1.6 has what is called a “Reintegration Merge” which is used to prevent reflective merging indicative of this type of workflow.
I decided I did not want to simply upgrade the svn binaries and then update the repository since this would not get me the new storage optimizations. I opted instead to create a new 1.6 server and sync the old 1.4 repo to the new 1.6 repo using svnsync. This would allow me to keep all the revision history and revision properties, but it would also commit each revision into the new repo which would allow 1.6 to do its storage optimization.
The second part of my mission was to break off 3 projects into their own repository. Our code was all stored in one repository over on the 1.4 server, and I wanted to break that up and allow the different groups have their own repos. Continue reading

I found this really good article (and subsequent thread) about SVN "branching for feature" and merging back to the trunk for release. We have a trunk which is always the next patch version of the current released version. But we also branch the tagged current release for long running development on future features. This article describes the issues with merging trunk work into these development branches, and then merging the development branches back to the trunk. Continue reading

Most modern UNIX filesystems do not limit the number of files you can store in a single directory. However, stat operations such as listing files, following paths, or checking for the existence of a file will take longer as the number of entries in a directory increases. So how can one store a large number of files while maintaining a high level of performance during access? One solution is file name hashing. Continue reading