Why module packaging matters
On IBM i, the compilation unit is only the starting point. The way modules are combined into bound programs or service programs determines whether shared logic is easy to reuse, easy to version, and easy to test.
If the team cannot explain how a program was bound, it will also struggle to explain why a dependency change broke production later.

At a glance
A clean packaging model makes it obvious which object owns logic, which object exports it, and where dependency resolution happens.
| Concept | What it means | What to watch |
|---|---|---|
| Module | A compiled unit of logic | Keep it focused so its role is clear. |
| Bound program | A program made from one or more modules | Review the compile options and object dependencies. |
| Service program | Reusable exported procedures | Treat the exported interface as an API. |
| Binding directory | A lookup list for resolving modules and service programs | Version and document it so the team knows what gets linked. |
Why this matters for daily work
Packaging is not just a build step. It shapes maintenance. If a module is reused in several programs, the team needs to know whether a change is safe across every consumer or whether it requires a new interface version and a staged rollout.
Core concepts
| Concept | Practical meaning | Review point |
|---|---|---|
| Module boundary | A module should represent a meaningful slice of logic, not an oversized copy of the whole application. | Keep ownership clear. |
| Bound program | A bound program is helpful when several modules are intentionally linked for one job flow or service. | Confirm the compile set. |
| Service program | This is the best fit when the same logic needs to be called by more than one application or request path. | Treat exported procedures as contracts. |
| Binding directory | A binding directory reduces repeated compile-time wiring, but only if it is reviewed like any other dependency list. | Keep it versioned and visible. |

Practical example
A pricing engine can live in one service program, a validation module can remain separate, and a batch report can bind to both without copying the logic. If the pricing signature changes, only the consumers that use it need to be retested and republished.
Implementation checklist
- Identify each module’s responsibility before compiling anything into a program.
- Document every exported procedure or symbol that other objects consume.
- Keep binding directories explicit and versioned with the application source.
- Review signature changes before merging the build to the release branch.
- Retest every consumer that binds to the changed module or service program.
Dependency management should be visible in source control, not hidden inside a one-time compile command.
Common mistakes
- Binding everything together without a clean ownership model.
- Changing exported signatures without warning the callers.
- Letting a binding directory become an undocumented dependency pile.
- Assuming the compile step itself is the architecture instead of the packaging step.