“Probably the best thing to do is try and reorganize the project some,” Tim, “Alien”’s new boss said. “It’s a bit of a mess, so a little refactoring will help you understand how the code all fits together.”
“Alien” grabbed the code from git, and started walking through the code. As promised, it was a bit of a mess, but partially that mess came from their business needs. There was a bunch of common functionality in a Common
module, but for each region they did business in- Asia, North America, Europe, etc.- there was a region specific deployable, each in its own module. Each region had its own build target that would include the Common
module as part of the build process.
The region-specific modules were vaguely organized into sub-modules, and that’s where “Alien” settled in to start reorganizing. Since Asia was the largest, most complicated module, they started there, on a sub-module called InventoryManagement
. THey moved some files around, set up the module and sub-modules in Maven, and then rebuilt.
The Common
library failed to build. This gave “Alien” some pause, as they hadn’t touched anything pertaining to the Common
project. Specifically, Common
failed to build because it was looking for some files in the Asia.InventoryManagement
sub-module. Cue the dive into the error trace and the vagaries of the build process. Was there a dependency between Common
and Asia
that had gone unnoticed? No. Was there a build-order issue? No. Was Maven just being… well, Maven? Yes, but that wasn’t the problem.
After hunting around through all the obvious places, “Alien” eventually ran an ls -al
.
~/messy-app/base/Common/src/com/mycompany > ls -al
lrwxrwxrwx 1 alien alien 39 Jan 4 19:10 InventoryManagement -> ../../../../../Asia/InventoryManagement/src/com/mycompany/IM/
drwxr-x--- 3 alien alien 4096 Jan 4 19:10 core/
Yes, that is a symbolic link. A long-ago predecessor discovered that the Asia.InventoryManagement
sub-module contained some code that was useful across all modules. Acutally moving that code into Common
would have involved refactoring Asia
, which was the largest, most complicated module. Presumably, that sounded like work, so instead they just added a sym-link. The files actually lived in Asia
, but were compiled into Common
.
“Alien” writes, “This is the first time in my over–20-year working life I see people reuse source code like this.”
They fixed this, and then went hunting, only to find a dozen more examples of this kind of code “reuse”.