The defining characteristic of junkyard coding is the shoehorning of code from an application not designed to be a module into your own code to use some part of it as one. Junkyard coding can also refer to the use of excessive numbers of dependencies, redundant dependencies, and the corrupting of otherwise good software by the inclusion of dependencies not up to the same quality standards. The result is bloated UniformlySlowCode that's difficult to install, troubleshoot, and maintain.
The RubeGoldbergMachine is a very similar anti-pattern / code smell, but the difference is that the RubeGoldbergMachine is too many separate programs working together in a haphazard way while JunkyardCoding is too many (or poorly specced, poorly chosen, bloated, etc.) dependencies/libraries/modules under one hood in the same application.
Junkyard coding often results from an excessive drive (usually by management) to avoid ReinventingTheWheel. It's always a good idea to avoid reinventing wheels if you can, but sometimes you have to.
It can also be caused by the DeathMarch or being forced by management to incorporate a BoatAnchor.
Sometimes this can't be avoided, since sometimes you must shoehorn something into an application to interoperate with a legacy database, protocol, etc. For example, you could use a portion of a Java program like a library if you must use its proprietary protocol but lack the source or a proper module. However, this is bad practice if it can be avoided.
The characteristics of junkyard coding are: