TL;DR key recommendations:
– Once a project is completed, the team must ensure that the “What” and “Why” of each software item are properly documented.
– In the cases of parallel development of inter-dependent software modules set up a negotiation table to solve conflict between the development teams.
– Make sure that the development team is aware of the CMMI-ACQ or ISO12207 processes for negotiating with third parties.
– Make sure that testers are involved when negotiating with a third party for a potentially vulnerable software component. ￼
– Plan organization-wide process reviews to detect isolated processes and to promote information flows between processes.
– Planned special budget items to support long lasting corrections or corrections that are likely to benefit many modules. ￼
– Projects with strict deadlines are risky, and should be carefully monitored to avoid last minute unplanned activities.
– Team members should maintain a careful balance between the flows of information within formal development processes and informal human interactions.
– Team members should make sure that knowledge is appropriately distributed amongst them. For example, pair programming is a practice which can promote knowledge sharing.
– Any intrusion into the team dynamics by outsiders should be done very carefully.
I had to write bad code because sales and management usually dictate the timeline of the project.
As an example: sales promises new customer feature X in one month and we will lose money unless it’s implemented.
My choice is to either: 1) Complete it the right way in double the time or 2) use hacks and cut corners to get it done on time. Since non-technical people just see the output and not what’s going on underneath, they often times don’t see the difference and when they explain to the boss that they might lose money, it’s almost always option #2.