1. Embedded (safety and criitical systems)<p>2. Knowledge sharing within companies/organizations. Formal methods (primarily their absence). Effective use of simulations in design, development, and V&V efforts. Requirements traceability (this is mundane and seems bureaucratic, but it's critical here).<p>3. Yes, to everything.<p>For the first, break down information silos and project fiefdoms. Allow for greater flexibility for staff to move across project boundaries so knowledge can be shared more equitably, and people can see other teams work (learn both good and bad things here). Training. Make it a recurring event. Not the crap training many organizations do. Have a seminar series where people come in and present on something, not always directly related to work. Encourage people to write up their lessons learned, and perform and publish post mortems on projects. Take the approach of avoiding blame, focus on correctable errors and faults along the way (these are primarily process faults, not technical ones; where technical they're typically design and not implementation errors).<p>Formal methods and simulations are much easier to get started with today than ever. I'm not even talking about making a full-blown simulation of the final system, just high level "is this protocol sound" models. Presently working on radios. I don't need to implement a simulation of every detail of the protocol, I just need to know things like: If we add this new message, that must be sent so often, can it actually get broadcast at the correct frequency within the physical constraints of the radio? This turned out to be <i>NO</i> on one project I saw (not worked on), but not discovered until it was implemented (several man-months wasted). A message was supposed to be sent out every X time slots, containing N bytes of data. Each slot allowed you to send MAX size. Other messages also had to be sent out, say every X<i>4 slots with size M. N+M > MAX, meant something wasn't sent. Both were mandatory, by design the protocol couldn't function. Another similar issue, though requiring a more complete simulation/model, was that one of the processors handling some of the messages simply wasn't fast enough. It was required to (worst-case) process N messages within X microseconds, but could actually only process ~N</i>0.75 messages. Admittedly, this was worst case behavior, but by the system's design (protocol requirements, selected hardware, selected data bus, selected program design) it could not achieve the required performance.<p>The more complete the simulation, though, the better off you are. Technical solutions already exist, it's primarily an issue of finding good case studies or getting an amenable manager to sign off on trying it to demonstrate the cost savings (versus the typical approaches, which in my experience are often significantly late and errorful). Also being at the right stage in a project. Being at the maintenance end, constructing these models/simulations is harder than when you're taking on a novel project.<p>But, simulations also aid V&V efforts. If you can construct a full(er) simulation of the radio network, your V&V team can start creating test cases, procedures, and models and verifying that they're reasonable. From a protocol perspective, this is relatively easy on our radios, setting aside timing. So ignore time (as a strict concept) and instead focus on time slots. Create a simulation where each tick corresponds to one time slot, let computation run as long as needed. At the end, you'll see what <i>should</i> show up from the radios given some inputs. Run these through your data analysis tools to exercise them, and when you have functioning radios you can use these tools to create simulated network peers (pre-generated network data played back to the radio being tested).<p>For requirements traceability, just stop using Word and Excel. Use an actual requirements database. I know DOORS sucks, but it's infinitely better than Word and Excel.