Summary
Module effects randomization is currently commented out due to issues, such as no viable productivity modules, modules with no effects/only negative effects, and tiers of modules not necessarily getting better. I used to use a system that just changed numbers, which was overhauled by Nifyr to swap effects around as well. I think the numerical randomization system would be workable, but would ideally like a solution that swaps effects as well (but in a better way).
Action Items
First, I'd like to return to the old numerical randomization, since having the effects not randomized at all looks strange. Then, we can work on outlining and implementing a new effect swapping method. Trying to balance it is the hard part.
Extra Considerations
The last way had balancing code that assigned points to module effects based off their effects and then would attempt to keep a similar point level, but it was not very flexible and did not accurately represent or preserve how good a module was. I would prefer no point system in general, since the "goodness" of a module is complex and not just a sum of its parts.
Rather, I think a method that just occasionally switches effects, staying on the side of caution, and ensures that all module effects are accessible would be best. For example, some sort of good productivity module should be available in any vanilla run.