title: What can firmware engineers learn from software engineers?
body: <p>Judging from my knowledge of the history of firmware engineering tools, practices etc.  It has consistently lagged behind the software engineering field by several years.  For example, as far as I can tell there is still a fair amount of debate in the firmware world as to whether C++ is actually worth using for our applications, and some C++ compilers are noticeably absent (microchip?!?).  I imagine that in large part this is due to the differences in requirements between firmware and software.  Again, judging from history, it seems its only a matter of time before the properly vetted tools and techniques make it into the firmware world.</p>
  
  <p>What methods, tools, best practices etc that modern software engineers use regularly, could firmware engineers also leverage to improve their craft?</p>
  
  <p>Specifically I'm thinking along the following axes (but don't let them limit you):</p>
  
  <ul>
  <li>Improving code cleanliness/maintainability</li>
  <li>Reducing defect introduction and improving detection</li>
  <li>Improving documentation</li>
  <li>Requirements management</li>
  <li>Improving reusability</li>
  </ul>
  
  <p>I'd also love to see embedded shops answer or comment on the answers to provide feedback about theoretical feasibility or, better yet, personal experiences.</p>
  
  <p><strong>UPDATE</strong><br>
  I'm especially interested in jumping ahead of the curve a little bit.  So relatively new stuff that has been vetted reasonably well (works well for most people), like C++, TDD, etc.  What do you use all the time and love?</p>
  
  <p><strong>UPDATE 2</strong><br>
  I'm getting a lot of good general programming advice in the answers so far, which is great, but I'm really looking for more unconventional approaches that have proved successful for people.  I'm trying to tease out the Agile practitioners, the TDDers, and the rest of you who have tried stuff and seen it pay off in spades or fail horribly.  As a software engineer has there been a tool or practice that you've adopted in the past several years that has had a remarkably positive or negative impact?</p>