<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Blaine Osepchuk</title>
    <description>The latest articles on Forem by Blaine Osepchuk (@bosepchuk).</description>
    <link>https://forem.com/bosepchuk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F21001%2F02beb73a-c476-4d04-a7d3-5564f4d6f85d.jpeg</url>
      <title>Forem: Blaine Osepchuk</title>
      <link>https://forem.com/bosepchuk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/bosepchuk"/>
    <language>en</language>
    <item>
      <title>How to be more successful at software maintenance</title>
      <dc:creator>Blaine Osepchuk</dc:creator>
      <pubDate>Wed, 18 Nov 2020 15:41:17 +0000</pubDate>
      <link>https://forem.com/bosepchuk/how-to-be-more-successful-at-software-maintenance-1dbo</link>
      <guid>https://forem.com/bosepchuk/how-to-be-more-successful-at-software-maintenance-1dbo</guid>
      <description>&lt;p&gt;In this post I want to explore the kind of software maintenance that happens after active maintenance ends. This is the stage of the software life cycle where the software has been in production for some time and the initial wave of bug fixes and enhancement requests ends. It's also at this point that managers may cut the number of developers assigned to the project and turn their attention elsewhere.&lt;/p&gt;

&lt;p&gt;Keeping this kind of project running safely, securely, &lt;strong&gt;&lt;em&gt;and profitability&lt;/em&gt;&lt;/strong&gt; as the years tick by--even if you're not adding or changing functionality--is especially challenging.&lt;/p&gt;

&lt;p&gt;I've spent more than a decade in this situation. And I'd like share some of my observations and advice about maintaining this kind of software with you.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 8 laws of software maintenance
&lt;/h3&gt;

&lt;p&gt;If your software lives long enough you'll experience one or more of the following:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. You'll have trouble getting enough resources to maintain your project
&lt;/h4&gt;

&lt;p&gt;Keeping old software running isn't sexy. Managers are more interested in acquiring new functionality than maintaining older systems. And, very few programmers want to spend their careers doing maintenance so both talent and money may be in short supply.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Your hardware and software dependencies will become out-of-date
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TzQoOIyv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pbfhi8m9o9jo2colkwzj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TzQoOIyv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pbfhi8m9o9jo2colkwzj.jpg" alt="old car"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The languages, frameworks, libraries, APIs, development tools, build systems, and hardware used by your project are constantly shifting under your feet. Some stacks are shifting faster than others but nothing is standing still. And the more dependencies you have, the harder your project will be to maintain.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Your code base will be a mess
&lt;/h4&gt;

&lt;p&gt;I can say this with a fair bit of confidence because most code bases are a mess. But very old code bases can be especially problematic. They might have been developed without unit tests, documentation, static analysis, coding standards, style guides, code reviews, or modern development methods. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KXIwtjxq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oakn1gtsuainl6igtx6o.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KXIwtjxq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oakn1gtsuainl6igtx6o.jpg" alt="firefighters fighting a fire"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Very old code bases have frequently been worked on by several programmers with different programming styles over time. And if your software has been underfunded or developed with speed as the top priority, it probably contains heaps of low quality code.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Your memory will fade
&lt;/h4&gt;

&lt;p&gt;Your understanding the requirements, design decisions, and how your code works degrades rapidly after active development stops. People forget the details or take valuable knowledge with them when they move on to other projects. And your documentation and test coverage will almost certainly be inadequate to make up for that missing knowledge.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. You'll lose something important
&lt;/h4&gt;

&lt;p&gt;Information, software, or hardware critical maintaining, building, testing, documenting, or deploying your software may be lost. Think config files, compilers, compiler switches, hardware configurations, encryption keys, source code for dependencies, drivers, backup scripts, development environments, test environments, etc.&lt;/p&gt;

&lt;p&gt;Losing any single critical component of your project could mean that it cannot continue to operate without heroic effort on your part. And some problems--like losing the contents of your database--can leave you with no choice but to shutdown your project.&lt;/p&gt;

&lt;h4&gt;
  
  
  6. You'll need to change your software
&lt;/h4&gt;

&lt;p&gt;You may not want to change it but, if your software lives long enough, you'll likely discover a good reason to change it.&lt;/p&gt;

&lt;p&gt;Reasons include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;new requirements&lt;/li&gt;
&lt;li&gt;defects&lt;/li&gt;
&lt;li&gt;obsolete dependencies&lt;/li&gt;
&lt;li&gt;security vulnerabilities&lt;/li&gt;
&lt;li&gt;new legislation or regulations (privacy, PCI DSS, etc.)&lt;/li&gt;
&lt;li&gt;hardware failures&lt;/li&gt;
&lt;li&gt;hardware obsolescence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Always assume you'll have to make a change at some point in the future no matter what anybody tells you.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  7. Maintenance is difficult and expensive
&lt;/h4&gt;

&lt;p&gt;This is the stage of your project where your chickens come home to roost. The decisions you and your predecessors made earlier in the software development life cycle will determine how painful and expensive keeping this system running will be. But, no matter how much care and foresight everyone exercised, maintaining old software is almost always difficult and expensive.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mE5JWvn9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xpf1je6n0ij3h27bmnow.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mE5JWvn9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xpf1je6n0ij3h27bmnow.jpg" alt="poorly maintained house"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cleaning up the code base to make it easier to maintain (aka refactoring) is tempting to most programmers, but it is often a terrible investment.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Large sums of money are wasted on ill-advised code cleanup projects that will never be paid back by faster future development. For example, I currently maintain tens of thousands of lines of code that haven't been meaningfully modified in years and may never be modified again. So any refactoring or cleanup I do on that code is almost certainly wasted. It doesn't matter how ugly I think that code is.&lt;/p&gt;

&lt;p&gt;You might be able to make economically advantageous, highly targeted changes if you look hard enough. But you are largely stuck with whatever you have at this point.&lt;/p&gt;

&lt;h4&gt;
  
  
  8. Your software will stay in production much longer than anybody anticipated
&lt;/h4&gt;

&lt;p&gt;This is certainly not true of all software but if you restrict yourself to the types of projects we are discussing in this post (software in the late stages of maintenance) you'll find that this type of software tends to be hard to kill for various reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;replacing it never gets to the top of anybody's to-do list (regardless of what anybody says)&lt;/li&gt;
&lt;li&gt;it's just too expensive to replace&lt;/li&gt;
&lt;li&gt;the replacement project is late or fails to meet user needs&lt;/li&gt;
&lt;li&gt;the replacement project never delivers working software (because the project failed or was cancelled)&lt;/li&gt;
&lt;li&gt;your users can't or won't upgrade (for various reasons)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to make software maintenance better
&lt;/h3&gt;

&lt;p&gt;Like I said earlier, keeping this kind of project running safely, securely, &lt;strong&gt;&lt;em&gt;and profitability&lt;/em&gt;&lt;/strong&gt; as the years tick by--even if you're not adding or changing functionality--is especially challenging.&lt;/p&gt;

&lt;p&gt;Your biggest risks are that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you waste your maintenance budget on low value activities&lt;/li&gt;
&lt;li&gt;an unexcepted event cripples the value of your project and/or brings it to a premature end&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are no one-size-fits-all solutions to this kind of software maintenance but there are some things you can do to make your life better. Your first step is to do some analysis.&lt;/p&gt;

&lt;h4&gt;
  
  
  How and when will you retire this software?
&lt;/h4&gt;

&lt;p&gt;What's the retirement plan for your software? Is it expected to live for another year? 5? 10? 50? Do you plan to develop a replacement product and migrate your users to it? Does this software need to be changed to enable the migration? How realistic is the delivery date? Or will you retire the software without replacement? Or do something else?&lt;/p&gt;

&lt;h4&gt;
  
  
  What do your stakeholders want from this software between now and the time you retire it?
&lt;/h4&gt;

&lt;p&gt;Don't assume you know what's important to them. Ask them. You might be surprised by what they say.&lt;/p&gt;

&lt;p&gt;I did just that with the owners of a project I had been maintaining for over 10 years. I thought I knew their preferences very well. But I setup a meeting to ask them (just to be safe). I knew they didn't care about technical debt or code quality but I was surprised by their views on security, up-time, disaster recovery, and several other issues.&lt;/p&gt;

&lt;h4&gt;
  
  
  What is the value of your software?
&lt;/h4&gt;

&lt;p&gt;How much money will your software make (or save) you each month or year until its planned retirement? There are several ways to do this but, if you are looking for a recommendation, I suggest you start with a &lt;a href="https://en.wikipedia.org/wiki/Net_present_value"&gt;net present value&lt;/a&gt; analysis.&lt;/p&gt;

&lt;p&gt;You should also account for non-monetary factors in the value of your software. For example, if you promised your biggest customers that you would support the software for another 5 years, it would be wise to take that into account in your analysis.&lt;/p&gt;

&lt;p&gt;You may want to get the business types involved in this analysis to help you figure things out.&lt;/p&gt;

&lt;h4&gt;
  
  
  What will it cost to keep your software in production until its planned retirement date?
&lt;/h4&gt;

&lt;p&gt;What does it cost now? Is it reasonable to project that number into the future with some sort of inflation factor? What unavoidable maintenance tasks will you have to perform? For example, you might expect to migrate to new servers every 5-7 years and migrate your code to a new version of your language every x years. There are also one-off concerns like the &lt;a href="https://en.wikipedia.org/wiki/Year_2038_problem"&gt;year 2038 problem&lt;/a&gt;. Or maybe you know you'll need to replace one of your dependencies because its end of life date has been announced.&lt;/p&gt;

&lt;p&gt;There are also costs that are harder to pin down. For example, is your project written in a language that is no longer popular? How will you find people with the skills to maintain it all the way to its retirement? Are you on old hardware? How will you keep that running? Or what's the probability that you have a security breach that costs you money or damages your reputation?&lt;/p&gt;

&lt;p&gt;It's natural for people to underestimate how much effort it takes to keep software running. So any analysis you do will be more realistic than just throwing a number out there.&lt;/p&gt;

&lt;h4&gt;
  
  
  How risky is your "maintenance debt"?
&lt;/h4&gt;

&lt;p&gt;Maintenance debt is a relatively new term. It is described in &lt;a href="https://www.researchgate.net/publication/335983023_Delaying_Maintenance_Can_Prove_Fatal"&gt;this paper&lt;/a&gt; as follows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We introduce the term "maintenance debt" for maintenance needs generated by an implementation’s dependence on external IT factors such as libraries, platforms and tools, that have become obsolescent. The application continues to run, and the IT department forgets this theoretical liability, focussing on more urgent requirements and problems elsewhere.&lt;/p&gt;

&lt;p&gt;Such debt accumulates over time, silently eating away at the value of the software asset. Eventually something happens that makes system change unavoidable. The owner may then discover that the system can no longer be modified--it is literally unmaintainable. Less dramatically, it may take too long, or cost too much, for maintenance to solve the business problem, and an alternative solution must be found. The software has suddenly crashed to £0 value.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Is it worth keeping your software in production until its planned retirement date?
&lt;/h4&gt;

&lt;p&gt;It might become clear to you that your planned retirement date is uneconomical. Maybe you need to move your retirement date up? Or reduce your maintenance budget? Or increase how much you charge your users?&lt;/p&gt;

&lt;p&gt;Perhaps you can purchase off-the-shelf software that largely does what your software does for a fraction of the cost and migrate to that.&lt;/p&gt;

&lt;p&gt;Or maybe you realize that your software is extremely valuable and it makes sense to devote more resources to its maintenance to make it even more valuable and/or push back the retirement date.&lt;/p&gt;

&lt;p&gt;Yet another option is that your software is a money pit and you need to figure out if you should &lt;a href="https://smallbusinessprogramming.com/software-rewrite-vs-refactor-debate-8-things-you-need-to-know/"&gt;rewrite or refactor&lt;/a&gt; it. Or perhaps the best thing to do is shutdown the project immediately without having a replacement (as Google is fond of doing) and work on something completely different.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The important thing is to do the analysis&lt;/strong&gt;. The business types respond to data. And, even if there's quite a large level of uncertainly in your estimates of cost and value, it's a good starting point to having an intelligent conversation about the best way to maximize the profitability of your software.&lt;/p&gt;

&lt;h4&gt;
  
  
  It's all about risk management
&lt;/h4&gt;

&lt;p&gt;If you've made it to this point and you've discovered your software is worth maintaining in some way, you'll have to decide how you are going to spend your maintenance budget.&lt;/p&gt;

&lt;p&gt;You'll need to assign some of it to your "must-do" maintenance tasks. Then you can take whatever's left and use it to reduce the risk that something bad happens to your software.&lt;/p&gt;

&lt;p&gt;For example, if you are worried about a hardware failure, maybe you work on your backup, replication, or redundancy. If you are worried about key people leaving the project, then you might focus on employee retention, letting your developers work on their software pain points, and documenting the system.&lt;/p&gt;

&lt;p&gt;My point is that &lt;strong&gt;it's unlikely that you'll have enough resources to do everything you might want to do to maintain your software so you'll need to prioritize your efforts&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional things you can do
&lt;/h3&gt;

&lt;p&gt;In addition to everything I described above, I think it's wise to do the following two steps periodically.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Revisit your analysis from time to time
&lt;/h4&gt;

&lt;p&gt;The value of your software will change over time--often in unanticipated ways--so it's wise to redo your analysis periodically and make adjustments to your maintenance plans as necessary.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Build and deploy, even if you have no changes
&lt;/h4&gt;

&lt;p&gt;You might consider updating your dependencies to recent compatible versions, building, testing, and deploying periodically. Even if you have no changes to integrate it's worth something to demonstrate that you can still do it successfully. It's also a good opportunity to look at your hardware and documentation to evaluate how well it's meeting your needs.&lt;/p&gt;

&lt;p&gt;How often you build and deploy is up to you but every six months or so seems reasonable to me.&lt;/p&gt;

&lt;p&gt;The scenario you want to avoid is that you need to make some small change and discover that its impossible or nearly impossible because you don't have a critical piece of information, software, or hardware required to complete the process. At that point all your options are bad (and probably expensive).&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrapping up
&lt;/h3&gt;

&lt;p&gt;If you find yourself responsible for maintaining a software system after active maintenance ends I recommend you &lt;strong&gt;focus on striking a good balance between squeezing as much profit out of it as you can and taking steps to reduce the most serious risks of something catastrophic occurring&lt;/strong&gt; to the system.&lt;/p&gt;

&lt;p&gt;Following the steps outlined in this post will help get you going on the right path. And, remember, it's your stakeholders who decide what makes your software valuable, not you. Good luck!&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional resources:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Software-Engineering-Google-Lessons-Programming/dp/1492082791/"&gt;Software Engineering at Google&lt;/a&gt; (book)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052/"&gt;Working Effectively with Legacy Code&lt;/a&gt; (book)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.theverge.com/2020/4/14/21219561/coronavirus-pandemic-unemployment-systems-cobol-legacy-software-infrastructure"&gt;Why governments can't migrate away from cobol&lt;/a&gt; (article)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.researchgate.net/publication/335983023_Delaying_Maintenance_Can_Prove_Fatal"&gt;Maintenance Debt&lt;/a&gt; (research paper)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Have a comment, question or a story to share? Let me have it in the comments.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Enjoy this post? Please "like" it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>codequality</category>
      <category>technicaldebt</category>
      <category>softwareengineering</category>
      <category>refactoring</category>
    </item>
    <item>
      <title>Safety-Critical Software: 15 things every developer should know</title>
      <dc:creator>Blaine Osepchuk</dc:creator>
      <pubDate>Sun, 01 Mar 2020 20:29:37 +0000</pubDate>
      <link>https://forem.com/bosepchuk/safety-critical-software-15-things-every-developer-should-know-1kdh</link>
      <guid>https://forem.com/bosepchuk/safety-critical-software-15-things-every-developer-should-know-1kdh</guid>
      <description>&lt;p&gt;Despite being all around us, safety-critical software isn't on the average developer's radar. But recent failures of safety-critical software systems have brought one of these companies and their software development practices to the attention of the public. I am, of course, referring to &lt;a href="https://en.wikipedia.org/wiki/Boeing_737_MAX_groundings"&gt;Boeing's two 737 Max crashes, the subsequent grounding of all 737 Max aircraft&lt;/a&gt;, and its &lt;a href="https://blogs.nasa.gov/commercialcrew/2020/02/07/nasa-shares-initial-findings-from-boeing-starliner-orbital-flight-test-investigation/"&gt;failed Starliner test flight&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;How could such a distinguished company get it so wrong? Weren't the safety standards and certification process for safety-critical systems supposed to prevent this kind of thing from happening? Where was the FAA when the Max was being certified? These questions raised my curiosity to the point that I decided to discover what this specialized field of software development is all about.&lt;/p&gt;

&lt;p&gt;In this post I'm going to share what I learned about safety-critical software development and how a little knowledge of it might be useful to "normal" programmers like you and me.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. What is a safety-critical system?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Safety-critical systems are those systems whose failure could result in loss of life, significant property damage, or damage to the environment.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Aircraft, cars, weapons systems, medical devices, and nuclear power plants are the traditional examples of safety-critical software systems. &lt;/p&gt;

&lt;p&gt;But there are other kinds of safety-critical systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;code libraries, compilers, simulators, test rigs, requirements traceability tools, and other tools used to manage and build the kinds of systems we traditionally think of as safety-critical systems are safety-critical themselves&lt;/li&gt;
&lt;li&gt;software that provides data used to make decisions in safety-critical systems is likely safety-critical. For example, an app that calculates how much fuel to load onto a commercial jet is safety critical because an incorrect result from that app may lead to a life threatening situation&lt;/li&gt;
&lt;li&gt;other software running on the same system as safety-critical software may also be classified as safety-critical if it might adversely affect the safety functions of the safety-critical system (by blocking I/O, interrupts, or CPU, using up RAM, overwriting memory, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. What do safety-critical software projects look like?
&lt;/h3&gt;

&lt;p&gt;Safety-critical software development is a very specialized, expensive, methodical, slow, process-driven field of software development. &lt;/p&gt;

&lt;h4&gt;
  
  
  Safety-critical software systems are often embedded, distributed systems
&lt;/h4&gt;

&lt;p&gt;Typically, the software monitors its environments with various kinds of sensors and manipulates that environment by controlling actuators such as valves, hydraulics, solenoids, motors, etc. with or without the assistance of human operators.&lt;/p&gt;

&lt;p&gt;These systems are usually embedded because they often have timing deadlines that can't be missed. Plus, the creators of these systems are responsible every aspect of the hardware, software, and electronics in the system, whether they created it or not. So the more stuff they put in the system, the more difficult and expensive it is for the company get it certified. &lt;/p&gt;

&lt;p&gt;Safety-critical software systems are often distributed systems because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;they are often large&lt;/li&gt;
&lt;li&gt;subsystems may be developed by different teams or companies&lt;/li&gt;
&lt;li&gt;many of these systems require redundancy and/or the separation of safety-critical code from non-safety critical code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All these factors push the system design towards multiple cooperating processors/subsystems.&lt;/p&gt;

&lt;h4&gt;
  
  
  There's more safety-critical software than you realize
&lt;/h4&gt;

&lt;p&gt;There's a lot of this software being created. But it doesn't get nearly as much attention as consumer-focused software. For example, just about every story in &lt;a href="https://www.militaryaerospace.com/"&gt;Military &amp;amp; Aerospace Electronics&lt;/a&gt; discusses systems that contain safety-critical software.&lt;/p&gt;

&lt;h4&gt;
  
  
  It's difficult and expensive to create safety-critical software
&lt;/h4&gt;

&lt;p&gt;It takes lots of resources and money to assemble the cross-functional expertise to develop, certify, sell, and support such complicated and expensive systems. So, while a few small companies might produce small safety-critical software systems, it's more common for these systems to be produced by larger companies. &lt;/p&gt;

&lt;h3&gt;
  
  
  3. Safety-critical software is almost certainly the most dependable software in the world at any given size and complexity
&lt;/h3&gt;

&lt;p&gt;Software developed and certified as safety-critical is almost certainly the most dependable software in the world. The allowable failure rate for the most critical systems is absurdly low. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nhf4UB7y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tvywjlrbw8nau4ufwyml.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nhf4UB7y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tvywjlrbw8nau4ufwyml.PNG" alt="failure probabilities per hour by SIL"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And these numbers are for the whole system (hardware and software combined). So the allowable failure rate for &lt;strong&gt;&lt;em&gt;software&lt;/em&gt;&lt;/strong&gt; at any given SIL level is even lower!&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://en.wikipedia.org/wiki/Safety_integrity_level"&gt;SIL 4&lt;/a&gt; (roughly equivalent to NASA's "maximum" category) we are talking about less than one failure per billion hours of continuous operation. &lt;em&gt;That's 114,000 years!!!&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;To put that in perspective, if your smart phone were built to that standard its unlikely that you or any of your friends and family would have ever experienced a dangerous failure (dead phone, broken camera, random reboot, malware, data leakage, data loss, loss of connectivity, etc.), nor would you expect to encounter one for the entire span of your life! That's an incredibly high bar. And it just shows you how different this kind of product and software development is from the kind you and I do on a daily basis.&lt;/p&gt;

&lt;p&gt;Here's &lt;strong&gt;&lt;em&gt;my impression&lt;/em&gt;&lt;/strong&gt; of where safety-critical software is supposed to fit in the software quality landscape:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3N646MX5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qn2l5g0pamnknjpqct6m.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3N646MX5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qn2l5g0pamnknjpqct6m.PNG" alt="chart of the software quality landscape"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Safety-critical software is designed, built, and tested to ensure it has ultra-low defect rates and ultra-high dependability.&lt;/p&gt;

&lt;h4&gt;
  
  
  Nothing beats the space shuttle software's quality
&lt;/h4&gt;

&lt;p&gt;The shuttle software is probably &lt;a href="https://www.fastcompany.com/28121/they-write-right-stuff"&gt;NASA's best example of software done right&lt;/a&gt;. At the time the article (linked above) was written, the shuttle software was 420 KLOC and had just one error in each of the last three versions. That's orders of magnitude fewer defects than your average software project. Read this article if you want to know what it takes to write the lowest defect software in the world.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The focus is on safety, not features or speed
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;(For the remainder of this post, I'm going to use the &lt;a href="https://standards.nasa.gov/standard/nasa/nasa-gb-871913"&gt;NASA Software Safety Guidebook&lt;/a&gt; as an example safety standard.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In most companies, software developers are primarily concerned with getting the software to "work", then going faster, shipping more features, and delivering more value. But software developers involved in the creation of safety-critical systems must be concerned &lt;strong&gt;&lt;em&gt;primarily with creating safe systems&lt;/em&gt;&lt;/strong&gt;. And that is a very different task. &lt;/p&gt;

&lt;p&gt;They must find all the realistic ways the system could create harm. And then develop ways to mitigate that harm. They also need to make sure the system, as built, functions as specified. They must convince themselves and their auditors that they've done an adequate job of building a safe system before their product can be certified. &lt;/p&gt;

&lt;p&gt;We're way beyond unit testing, code reviews, and filling out some forms. We're talking about painstaking checking and re-checking, mandated processes, multiple rounds of analyses, and piles of documentation.&lt;/p&gt;

&lt;h4&gt;
  
  
  Build it as if you know you are going to be sued
&lt;/h4&gt;

&lt;p&gt;The image that came to my mind as I read through the &lt;a href="https://standards.nasa.gov/standard/nasa/nasa-gb-871913"&gt;NASA Software Safety Guidebook&lt;/a&gt; is that you have to jump through all these hoops as if you are preparing for a future court case where your product has killed a number of people. And your company and you personally are being sued for tens of millions of dollars. You need to be able to place your hand on a bible and swear that you and everyone working on your project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;was properly trained&lt;/li&gt;
&lt;li&gt;followed best practices set out in the safety standard you followed&lt;/li&gt;
&lt;li&gt;minimized the risks of harm associated with your product as far as practicable&lt;/li&gt;
&lt;li&gt;earnestly worked to get your product certified as meeting your chosen safety standard by a competent certification body&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then you need to be able to point to a stack of boxes full of your documentation as proof that what you're saying is true, knowing that the plaintiffs' experts and lawyers are going to try to tear you apart. &lt;/p&gt;

&lt;p&gt;If you feel like you might not win that hypothetical court case, then your product should not be released.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Safety and hazard mitigation requirements will dramatically increase the complexity of your product (and there will be a ton of them)
&lt;/h3&gt;

&lt;p&gt;In addition to software engineering tasks associated with creating software for a normal product, you are going to have a lot of extra requirements related to safety and hazard mitigation. And, as we all know, as requirements interact code volume and complexity skyrocket. For example, we know that doubling the number of requirements will more than double effort required to complete most projects.&lt;/p&gt;

&lt;p&gt;Plus, safety and hazard mitigation requirements are often difficult to implement both because they aren't "normal" things software developers do but also because they are inherently difficult. Let's look at an example.&lt;/p&gt;

&lt;h4&gt;
  
  
  Fail-safe design
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Your system must fail safely&lt;/strong&gt;. That's one of the fundamental principles of safety critical systems design. This means that under any reasonable scenario where the system is being used in accordance with the operating instructions, it must not cause a dangerous situation if something goes wrong. &lt;/p&gt;

&lt;p&gt;For many systems that means stopping all actuators and reporting an error. For example, the blade in my food processor will stop immediately if I remove the lid while it is spinning. That's a simple case but for other systems, just figuring out how to fail safely is really difficult. &lt;/p&gt;

&lt;h4&gt;
  
  
  Heart bypass machine example
&lt;/h4&gt;

&lt;p&gt;What does fail safely mean in the context of a heart bypass machine? The system can't just turn itself off if the power goes out because that will kill the patient. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LjSFy9-g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xi9tmxj8gtuwy7fr11dc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LjSFy9-g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xi9tmxj8gtuwy7fr11dc.jpg" alt="surgery in the dark"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Battery backup?
&lt;/h5&gt;

&lt;p&gt;So maybe it needs a battery backup to keep it going until the hospital's generator can kick in. And a charging sub-system to keep the battery charged. And a battery health monitoring subsystem to alert the maintainers of the system that the battery won't hold a charge any more. And there should probably be a condition in the code that will not let you start the bypass machine if the battery is defective. Or missing. Or discharged. And some kind of change to the display so the operator can be made aware of status of the machine's power. &lt;/p&gt;

&lt;p&gt;By the way, adding a lithium ion battery to a safety-critical system isn't as straightforward as you would think. Even after extensive testing, Boeing's 787 still had battery problems in the field, which required an &lt;a href="https://www.mlit.go.jp/jtsb/eng-air_report/JA804A.pdf"&gt;extensive investigation and changes to the design of the system&lt;/a&gt;.&lt;/p&gt;

&lt;h5&gt;
  
  
  Multiple backups?
&lt;/h5&gt;

&lt;p&gt;Actually, after looking more closely at the requirements, a battery backup alone isn't enough because this system is required to continue to operate with two failures. So maybe we need two independent battery systems? Hmm... do we need to source each system from a different supplier so that a fault in one battery system doesn't bring them both down at the same time? &lt;/p&gt;

&lt;p&gt;Or maybe we should install a hand-crank for the nurse to turn a dynamo, which can power the heart bypass machine if the power fails and the battery fails or is exhausted? And we'll need a subsystem to ensure the dynamo works and generates enough power to run the bypass machine. But even a new dynamo won't produce enough power to run all the machine's functions. So maybe we need a low-power mode where the machine runs essential functions only? Or maybe we need to redesign the whole system to use less power? And so on.  &lt;/p&gt;

&lt;p&gt;So that one safety requirement ("patient must not die if power goes out") ballooned into several explicit requirements and a bunch of questions.&lt;/p&gt;

&lt;h5&gt;
  
  
  Other failure modes to consider?
&lt;/h5&gt;

&lt;p&gt;And that's just one failure mode. We need to cover &lt;strong&gt;&lt;em&gt;all&lt;/em&gt;&lt;/strong&gt; of the realistic failure modes. What about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fluctuating power? &lt;/li&gt;
&lt;li&gt;dead power supply? &lt;/li&gt;
&lt;li&gt;damaged RAM? &lt;/li&gt;
&lt;li&gt;memory corruption errors? &lt;/li&gt;
&lt;li&gt;an exception coming out of nowhere? &lt;/li&gt;
&lt;li&gt;sensor failure? &lt;/li&gt;
&lt;li&gt;sensor disagreement?&lt;/li&gt;
&lt;li&gt;hard drive failure? &lt;/li&gt;
&lt;li&gt;a random hard shutdown during a surgery?
&lt;/li&gt;
&lt;li&gt;pump failure? &lt;/li&gt;
&lt;li&gt;display failure? &lt;/li&gt;
&lt;li&gt;the case where the operator attempts to input settings appropriate for an elephant instead of a human? &lt;/li&gt;
&lt;li&gt;the case where the operator accidentally turns the machine off? &lt;/li&gt;
&lt;li&gt;a blown capacitor on one of the circuit boards?&lt;/li&gt;
&lt;li&gt;and... and... and...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's pretty easy to see how the number of safety requirements could easily dwarf the functional requirements in a safety-critical system. And that the implementation of those requirements would drastically increase the complexity of your system for both hardware and software.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Some systems are so dangerous that their construction is prohibited
&lt;/h3&gt;

&lt;p&gt;I was surprised to learn that NASA won't let you build anything you want as long as you take appropriate precautions and get it certified (pages 27 - 28).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NASA prohibits the construction of the following kinds of systems no matter how many software precautions you are willing to take:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;systems with &lt;strong&gt;&lt;em&gt;catastrophic&lt;/em&gt;&lt;/strong&gt; hazards whose occurrence is &lt;strong&gt;&lt;em&gt;likely&lt;/em&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;em&gt;probable&lt;/em&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;systems with &lt;strong&gt;&lt;em&gt;critical&lt;/em&gt;&lt;/strong&gt; hazards whose occurrence is &lt;strong&gt;&lt;em&gt;likely&lt;/em&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;catastrophic&lt;/em&gt;&lt;/strong&gt; is defined as: loss of human life or permanent disability; loss of entire system; loss of ground facility; severe environmental damage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;critical&lt;/em&gt;&lt;/strong&gt; is defined as: severe injury or temporary disability; major system or environmental damage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;likely&lt;/em&gt;&lt;/strong&gt; is defined as: the event will occur frequently, such as greater than 1 out of 10 times&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;probable&lt;/em&gt;&lt;/strong&gt; is defined as: the event will occur several times in the life of an item&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  A prohibited system example
&lt;/h4&gt;

&lt;p&gt;A spacecraft propulsion system that will blow up the spacecraft unless a computer continuously makes adjustments to keep the system stable would almost certainly be rejected by NASA as too dangerous. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QJ8oOynV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cgne5980z4b0oz3kiv64.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QJ8oOynV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cgne5980z4b0oz3kiv64.jpg" alt="challenger shuttle explosion"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even if the system designers believe the software reduces the risk of killing the crew down to 1 incident per 5,000 flight years, the system would likely be classified as "prohibited" because NASA knows that software is never perfect.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Safety-critical software is about as far from agile as you can get
&lt;/h3&gt;

&lt;p&gt;While there's some talk of &lt;a href="https://www.amazon.com/Agile-Methods-Safety-Critical-Systems-Examples-ebook/dp/B07DTY8LT6/"&gt;using agile methods for safety-critical software development&lt;/a&gt; to improve speed and drive down costs, I don't think it's very realistic to think that agile will get very far in safety-critical circles. The Agile Manifesto defines &lt;a href="https://en.wikipedia.org/wiki/Agile_software_development#Agile_software_development_values"&gt;4 development values and 12 development principles&lt;/a&gt; and most of them are in direct opposition to the requirements of safety-critical software development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Welcome changing requirements, even late in development"&lt;/strong&gt; seems to be a particularly problematic agile principle in the context of safety-critical software development. A single changed requirement could trigger a complete re-analysis of your entire project. If the change introduces a new hazard, it will have to investigated, analyzed, and possibly mitigated. The mitigation may result in multiple design changes. Design changes (hardware and/or software) may result in changes to the documents, safety manual, user manual, operator training requirements, test cases, test environments, simulators, test equipment, and code. Code changes require targeted retesting around the change. Plus, all your safety-related tests are supposed to be re-run for every code change. And, finally, you'll have to get your product recertified.&lt;/p&gt;

&lt;p&gt;And that's the easy case. Imagine what would happen if your requirements change pushes your software to a higher safety level (say "minimum" to "moderate" for a NASA project or SIL 2 to SIL 3 for a IEC 61508 project)? Now you have to re-execute your project using the prescribed processes appropriate to your new safety level!&lt;/p&gt;

&lt;h4&gt;
  
  
  Waterfall or spiral development models dominate the industry
&lt;/h4&gt;

&lt;p&gt;Most safety-critical software appears to be developed using the waterfall or spiral development models. NASA specifically recommends against using agile methods for the safety-critical elements of your software (page 87).&lt;/p&gt;

&lt;p&gt;I've seen lots of examples where the &lt;a href="https://en.wikipedia.org/wiki/V-Model_(software_development)"&gt;V-model&lt;/a&gt; is mentioned as a specialized version of waterfall appropriate for safety-critical software development. In the V-model, the steps on the same horizontal level are loosely related. So, for example, you should be thinking about unit and integration tests when you are doing detailed design. Some sources even recommend writing the unit and integration tests during detailed design (before coding begins).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QaPecBkU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mcoh9bbg6hybouy9zygm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QaPecBkU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mcoh9bbg6hybouy9zygm.png" alt="V software development model"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  8. "Normal" software is sometimes used for safety-critical purposes
&lt;/h3&gt;

&lt;p&gt;There's considerable controversy about what should be considered safety-critical. If a doctor uses a calculator app on her smartphone to calculate an IV drug dose for a patient on a very dangerous drug is the app safety-critical? What about the math library used by the calculator? What about the phone's OS and the all the other software on the phone? The answer is unclear.&lt;/p&gt;

&lt;p&gt;Should doctors be forced to use certified calculators to determine IV drug dosages? Are calculators certified for safety-critical applications even available? I know this sounds like nitpicking; it's obvious that calculators work correctly, right? Actually, no. Harold Thimbleby has made the study of medical mistakes involving technology his life's work. And I found this &lt;a href="https://youtu.be/_XJbwN6EZ4I?t=1000"&gt;video of him demonstrating numerous errors in the functioning of regular calculators&lt;/a&gt; deeply unsettling. It's not just one or two calculators that have errors. He calls them all "crap."&lt;/p&gt;

&lt;p&gt;But it's not just calculators that we have to worry about. How many spreadsheets out there contain safety-critical data and calculations? &lt;/p&gt;

&lt;p&gt;Looking in from the outside, authorities don't seem too concerned about the use of normal software for safety-critical functions. However, as a "regular" developer you might want to be aware that your software could potentially be used this way. Unless you are encouraging this use of your software, you are probably in the clear from a legal liability point of view but the ethics of it might be another story.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Insecure software cannot be considered safe
&lt;/h3&gt;

&lt;p&gt;Many people criticize the safety standards for doing a poor job of addressing security (see the criticisms section below). So it shouldn't surprise you to learn that security researchers have found glaring security vulnerabilities in many classes of safety-critical products.&lt;/p&gt;

&lt;p&gt;Because your entire safety case relies on your software behaving exactly as specified, you have a major problem if someone can make your system misbehave.  &lt;/p&gt;

&lt;h3&gt;
  
  
  10. There are no silver bullets
&lt;/h3&gt;

&lt;p&gt;I was hoping that my investigation into safety-critical software development would introduce me to some secrets of fast, high quality software development beyond what I've already &lt;a href="https://smallbusinessprogramming.com/the-one-chart-every-developer-must-understand/"&gt;discovered&lt;/a&gt;. I was looking for some tools or techniques to give me an edge in my day job. But I found nothing useful.&lt;/p&gt;

&lt;p&gt;Safety-critical software development succeeds, for the most part, by throwing large quantities of money and people at the problem of quality. I think there's definitely an element of "do it right the first time" that's applicable to all software development efforts where high quality is desirable but there's nothing magical happening here. For the most part it's process, process, and more process.&lt;/p&gt;

&lt;p&gt;The closest thing I found to "magic" is &lt;a href="https://www.adacore.com/qgen"&gt;automatic code generation from simulation models&lt;/a&gt; and &lt;a href="https://www.us-cert.gov/bsi/articles/knowledge/sdlc-process/correctness-by-construction"&gt;correctness by construction techniques&lt;/a&gt;. But neither of these approaches are going to benefit the average developer working on a non-safety-critical project. &lt;/p&gt;

&lt;h3&gt;
  
  
  11. How developing safety-critical software systems is supposed to work
&lt;/h3&gt;

&lt;p&gt;There are a bunch of safety standards out there. If you are developing your own system, the standard you use may be dictated by your industry. Or, under certain circumstances, you can choose the standard you intend to meet. Then you assemble a competent team, build your product, and attempt to get your product certified by a certification body or you might chose to self-declare that your product meets the standard, if that's an option in your industry.&lt;/p&gt;

&lt;p&gt;If you're building a product for someone else they may dictate the standard you must meet as part of your contract. If your customer is NASA then you are expected to follow the &lt;a href="https://standards.nasa.gov/standard/nasa/nasa-gb-871913"&gt;NASA Software Safety Guidebook&lt;/a&gt; for software development (and possibly some others, depending on the nature of your system).&lt;/p&gt;

&lt;h4&gt;
  
  
  Determining your safety level
&lt;/h4&gt;

&lt;p&gt;The rules are very complicated but the basic idea is that you have to evaluate how dangerous your product is, the probability that the danger might occur, and the extent to which your software is expected to mitigate that danger (as opposed to hardware controls or human intervention). &lt;/p&gt;

&lt;p&gt;Software that ensures a consumer pressure cooker doesn't over-pressure and explode would be certified to a lower level than the software that autonomously controls the safety functions of a nuclear power plant. So you'd have to follow a more rigorous process and do more work to certify the software for the nuclear power plant.&lt;/p&gt;

&lt;p&gt;NASA has 4 levels of certification for safety-critical software: "full", "moderate", "minimum", and "none" (page 28). The &lt;a href="https://standards.nasa.gov/standard/nasa/nasa-gb-871913"&gt;NASA Software Safety Guidebook&lt;/a&gt; will help you figure out which level your proposed system is at. &lt;/p&gt;

&lt;p&gt;It's also possible to have a mixed level system. For example one sub-system might be at the "full" level but another sub-system might be at the "minimum" level.&lt;/p&gt;

&lt;h4&gt;
  
  
  Adopting the required processes, analyses, and documentation
&lt;/h4&gt;

&lt;p&gt;Once you know what level(s) your product is at, you can look up which processes, analyses, and documentation, you need to follow, perform, and create to achieve that level. Each development phase has a table that tells you what you need to do (other standards have similar tables).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(I think these tables are interesting enough that I included the tables for each phase of the development from the &lt;a href="https://standards.nasa.gov/standard/nasa/nasa-gb-871913"&gt;NASA Software Safety Guidebook&lt;/a&gt; below. But you don't have to read them to understand the remainder of this post.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Conception (the stage before requirements where you are defining what kind of system you need) (page 102):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CuekQfoc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9t22dtbja3veeb9jmjm0.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CuekQfoc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9t22dtbja3veeb9jmjm0.PNG" alt="conception phase"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Requirements (page 107):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--56SA4bJH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zxqa1t3ppzh6co0xlsvq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--56SA4bJH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zxqa1t3ppzh6co0xlsvq.PNG" alt="requirements phase"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Design (page 136):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e6TAm539--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l73ajrqofloh6ewydfc3.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e6TAm539--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l73ajrqofloh6ewydfc3.PNG" alt="design phase"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Implementation (coding) (page 167):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n358izzj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hwrx5jd9jdc7w2yf7dbs.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n358izzj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hwrx5jd9jdc7w2yf7dbs.PNG" alt="implmentation phase"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Testing overview (page 181):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0NxkLXHL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wqf4suhy92j4gg0jgl1b.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0NxkLXHL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wqf4suhy92j4gg0jgl1b.PNG" alt="testing overview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unit or integration testing (pages 181 - 182):&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1nAYJZiM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jmyolzo1h1e8b2neuwtm.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1nAYJZiM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jmyolzo1h1e8b2neuwtm.PNG" alt="unit testing phase"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;System testing (page 182):&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h4ny5Izo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/grm7i7vm2gsvm6oj97o6.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h4ny5Izo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/grm7i7vm2gsvm6oj97o6.PNG" alt="system testing phase"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Operations and maintenance (page 199):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pIhAiWuQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pht860kwfqw6r4bunmb9.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pIhAiWuQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pht860kwfqw6r4bunmb9.PNG" alt="operations and maintenance phase"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, even at the "minimal" safety level NASA wants you to do many, many things that most software projects never do. &lt;/p&gt;

&lt;h4&gt;
  
  
  You are expected to go to extreme lengths to ensure your software is safe
&lt;/h4&gt;

&lt;p&gt;Let's take a closer look at the dynamic testing table to illustrate my point. Even if you already routinely unit test your code for non-safety critical projects, I bet you aren't that thorough. Maybe you skip things that are particularly difficult to test and either not test them at all or "sort of" test them manually? Well, that's not good enough for safety-critical software. And getting to "good enough" might take more time than all the easy testing combined.&lt;/p&gt;

&lt;h5&gt;
  
  
  NASA wants to see the following tested for the "minimal" safety level:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;typical sensor values&lt;/li&gt;
&lt;li&gt;extreme values of inputs&lt;/li&gt;
&lt;li&gt;all modes of each sensor&lt;/li&gt;
&lt;li&gt;every statement, branch, and path executed&lt;/li&gt;
&lt;li&gt;every predicate term tested&lt;/li&gt;
&lt;li&gt;every loop executed 0, 1, many, max -1, max, and max + 1 times &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It doesn't take much imagination on your part to realize a few things are going to happen if you attempt to follow these testing requirements to the letter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you need to write all production code for testability, which will negatively impact other properties of your code&lt;/li&gt;
&lt;li&gt;the volume of your test code is going to be larger than the volume of your production code (probably by a wide margin)&lt;/li&gt;
&lt;li&gt;it's going to be difficult for you to write your test cases in such a way that you can track each of them back to the dynamic testing category it covers as well as the specific requirement it satisfies&lt;/li&gt;
&lt;li&gt;it's going to be even more difficult for you to know that you've created enough test cases to satisfy the dynamic testing requirements for every subroutine in your code base&lt;/li&gt;
&lt;li&gt;because you are testing so deeply in your system (not just the public API like most unit testers recommend for non-safety-critical systems), you are going to find it nearly impossible to refactor your code without causing chaos in your test suite&lt;/li&gt;
&lt;li&gt;if QA discovers a problem with your product, it's going to be a nightmare to modify your code and test cases without making any mistakes &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Getting your product certified
&lt;/h4&gt;

&lt;p&gt;There are two ways to go here. &lt;/p&gt;

&lt;h5&gt;
  
  
  Self declare you meet a standard
&lt;/h5&gt;

&lt;p&gt;In some industries you can simply declare that your product meets all the requirements of some standard, possibly with the assistance of an independent company to confirm the declaration. &lt;/p&gt;

&lt;p&gt;While this might seem like an easier route to certification, your customers might not accept it. Plus, I'm not actually clear on when or under what circumstances you can self-declare that your product meets a certain standard. NASA doesn't allow it. And, based on what I've read, it seems unlikely that the FAA and the FDA allow it either. But other industries might be different? Please leave comment on this post if you know how self-declaration works.&lt;/p&gt;

&lt;h5&gt;
  
  
  Have your product certified by a certification body
&lt;/h5&gt;

&lt;p&gt;The other way to go is to hire a certification body to independently evaluate your product and issue a certification if your product meets the standard you seek. This is the more rigorous of the two routes.&lt;/p&gt;

&lt;p&gt;If you are going to work with an external company to help certify your product, they should be brought into the development process as early in your project life cycle as possible. It is not uncommon for an entire product to be developed and then fail to receive certification because of a mistake made very early in the development process. Adding missing requirements, processes, or documentation to a product after it has been constructed can be virtually impossible.&lt;/p&gt;

&lt;p&gt;Certification is not guaranteed. Only 25% of companies seeking certification received it in &lt;a href="https://pdfs.semanticscholar.org/8584/9e722ed377b2e173a0e5f9d12ed3f3f8e02e.pdf"&gt;this paper&lt;/a&gt;. I'm sure the rigor of certification varies from industry to industry and SIL to SIL but, as far as I can tell, it's a serious process everywhere.&lt;/p&gt;

&lt;h5&gt;
  
  
  Independent Verification and Validation
&lt;/h5&gt;

&lt;p&gt;If you are working on a NASA project that is particularly high risk or high value, NASA may assign an Independent Verification and Validation (IV&amp;amp;V) team to your project (page 102). This team is tasked with ensuring that your project is on track to deliver the quality and functionality required for a safe and successful system/mission. The work the IV&amp;amp;V team does is over and above all the work you are expected to do for the project, not a replacement for it. The IV&amp;amp;V team can also act as a resource to answer your questions and help you tailor your effort appropriately to the risks of your project.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tracking your product in operation
&lt;/h4&gt;

&lt;p&gt;You are responsible to tracking usage and defects in your product as it operates in the field. The scope of this activity varies depending on the kind of product you are creating but the goal is to gather data to show how dependable your system is in actual use. &lt;/p&gt;

&lt;p&gt;For example, &lt;a href="http://www.forbes.com/sites/johngoglia/2014/03/13/aircraft-engine-monitoring-how-it-works-and-how-it-could-help-malaysia-air-370-crash-investigtors/"&gt;Rolls-Royce jet engines use satellite communications to "phone home" with engine telemetry&lt;/a&gt;. Rolls-Royce collects data on the number of hours of use, along all kinds of performance, fault, and failure data for their engines. You probably can't get better tracking than that. &lt;/p&gt;

&lt;p&gt;On other other end of the spectrum, something like an airbag in a car might rely on estimates of deploy events and consumer reports of malfunctions. This is much lower quality tracking data than Rolls-Royce collects but it's still better than nothing.&lt;/p&gt;

&lt;h3&gt;
  
  
  13. How developing safety-critical software systems actually works
&lt;/h3&gt;

&lt;p&gt;I've described how safety-critical software systems are supposed to be built. But the reality of the situation appears to be quite different. It didn't take me long to realize that some companies approach safety-critical software development with little regard for the standards or the seriousness of what could happen if their systems fail.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Barr Group's 2017 Embedded Safety &amp;amp; Security Survey
&lt;/h4&gt;

&lt;p&gt;The Barr Group surveyed embedded developers around the world and found a shocking lack of best practices on safety-critical projects.&lt;/p&gt;

&lt;p&gt;28% of all respondents work on safety-critical projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rNMMKz-G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9mmrqu46huf01x8b1ym1.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rNMMKz-G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9mmrqu46huf01x8b1ym1.PNG" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Only 67% of the safety-critical subset meet a safety standard!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0FOceZHU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pyke7qsmscmrpe8suaqv.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0FOceZHU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pyke7qsmscmrpe8suaqv.PNG" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Coding standards, code reviews, and static analysis are all mandatory at my e-commerce job because they are cost-effective, proven ways to improve quality. But a significant portion of the safety-critical subset don't do them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iI-mM6dU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/k0hfxgpx1s7v3q327mau.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iI-mM6dU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/k0hfxgpx1s7v3q327mau.PNG" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And it just gets worse. Only 59% of the safety-critical subset do regression testing! Less than 100% do system level testing!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--W-1L2FQL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3o2pqjylod90oxu3rini.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W-1L2FQL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3o2pqjylod90oxu3rini.PNG" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These numbers are hurting my brain! &lt;/p&gt;

&lt;p&gt;And there's much more to be concerned about in this survey. I encourage you to watch the CEO of the Barr Group go over the survey findings in this &lt;a href="https://youtu.be/EMrgTOoRARE?t=1"&gt;YouTube talk&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Anyway, if you look at these results and compare them to all those tables I reproduced from the &lt;a href="https://standards.nasa.gov/standard/nasa/nasa-gb-871913"&gt;NASA Software Safety Guidebook&lt;/a&gt;, its pretty easy to imagine how many of the other tasks are not being done on safety-critical projects in the real world.&lt;/p&gt;

&lt;h4&gt;
  
  
  Toyota Unintended Acceleration Investigations
&lt;/h4&gt;

&lt;p&gt;If you haven't heard Toyota's unintended acceleration problems I suggest you read a brief summary on &lt;a href="https://en.wikipedia.org/wiki/Sudden_unintended_acceleration#Sudden_acceleration_in_Toyota_vehicles"&gt;wikipedia&lt;/a&gt; to get yourself up to speed. This is definitely a safety-critical software system and it is a mess. &lt;/p&gt;

&lt;p&gt;Let's set the hardware and safety culture problems aside for a moment and just look at some of the software findings for the Electronic Throttle Control System. It's the system responsible for reading the pedal position and controlling the engine throttle settings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;over 250 KLOC of C (not including comments)&lt;/li&gt;
&lt;li&gt;2,272 global variables&lt;/li&gt;
&lt;li&gt;64 instances of multiple declaration of the same global&lt;/li&gt;
&lt;li&gt;333 casts alter value&lt;/li&gt;
&lt;li&gt;22 uninitialized variables&lt;/li&gt;
&lt;li&gt;67 functions with complexity over 50&lt;/li&gt;
&lt;li&gt;one function was found to have a complexity of 146. It contained 1,300 lines of code and had no unit tests&lt;/li&gt;
&lt;li&gt;bugs that can cause unintended acceleration&lt;/li&gt;
&lt;li&gt;gaps and defects in the throttle failsafes&lt;/li&gt;
&lt;li&gt;blackbox found to record incorrect information&lt;/li&gt;
&lt;li&gt;stack overflow and defects that can lead to memory corruption&lt;/li&gt;
&lt;li&gt;and more...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anyone who has made it this far in this post knows this is not the kind of code you want to see in a safety-critical system.&lt;/p&gt;

&lt;p&gt;For more details please watch &lt;a href="https://youtu.be/NCTf7wT5WR0"&gt;Philip Koopman point out multiple problems with Toyota's hardware, software, and safety culture&lt;/a&gt; (&lt;a href="https://users.ece.cmu.edu/~koopman/pubs/koopman14_toyota_ua_slides.pdf"&gt;slides&lt;/a&gt;). It's an eye-opening talk.&lt;/p&gt;

&lt;h4&gt;
  
  
  Patients hacking their insulin pumps and posting the plans online
&lt;/h4&gt;

&lt;p&gt;I ran across a video several years ago where a non-programmer was describing how he glued together a bunch of tech to allow his continuous glucose monitoring device to send commands to his insulin pump to automatically adjust the amount of insulin it delivered to his body to control his diabetes. &lt;/p&gt;

&lt;p&gt;As a professional software developer, who is very aware how difficult it is to write correct software, I was very alarmed by what this guy was doing. He knew basically nothing about programming. He was building this system from tutorials and trading information with other non-programmers who were also working on the project in their spare time. I believe it was literally the first thing he ever programmed and it is definitely safety-critical--too little or too much insulin can definitely kill you.&lt;/p&gt;

&lt;p&gt;Now, if you want to take your life into your own hands and build something like this for your personal use, I say go for it. But these people were sharing the design and code on a website and making it available for anyone to use, which is not cool in my opinion. The FDA issued a &lt;a href="https://www.ajmc.com/newsroom/fda-issues-warning-on-do-it-yourself-artificial-pancreas"&gt;public warning&lt;/a&gt; not to build your own "do-it-yourself" pancreas after watching from the sidelines for several years.&lt;/p&gt;

&lt;p&gt;Anyway, this is another example of how the theory is radically different than the reality of safety-critical software development.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Boeing 737 Max and Starliner software issues
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Boeing_737_MAX_groundings"&gt;Two Boeing 737 Max crashes&lt;/a&gt; and a failed &lt;a href="https://blogs.nasa.gov/commercialcrew/2020/02/07/nasa-shares-initial-findings-from-boeing-starliner-orbital-flight-test-investigation/"&gt;Starliner test flight&lt;/a&gt; are what inspired me to write this post. But as I dug deeper and deeper into safety-critical software development and safety-critical software development at Boeing in particular I've realized that this topic deserves its own post. I'll link to that post here when I publish it.&lt;/p&gt;

&lt;h3&gt;
  
  
  14. The safety standards are widely criticized
&lt;/h3&gt;

&lt;p&gt;The standards are designed and approved by committees. They are based on what the drafters could get approved, instead of what is most appropriate or what is backed by evidence. While there appears to be broad agreement that coding standards, design reviews, code reviews, unit testing, and the like are good things, the standards disagree on specific practices and approaches. &lt;/p&gt;

&lt;h4&gt;
  
  
  Industry doesn't want to be told what to do
&lt;/h4&gt;

&lt;p&gt;One criticism I read suggested that industry wants to minimize the work prescribed by the standards so it lobbies against adding more prescriptions to them. In some cases it is because they want to minimize their work to get their products certified. In other cases, it is so they can pursue the most effective techniques as they become available instead of being forced to do something they know is ineffective compared to the state of the art, just because the standard says they have to do it.&lt;/p&gt;

&lt;h4&gt;
  
  
  There's little evidence that following the standards produces safe software
&lt;/h4&gt;

&lt;p&gt;There is actually little evidence that following the prescribed activities will result in the expected quality/failure rates experienced in the field. I think page 12 of the &lt;a href="https://standards.nasa.gov/standard/nasa/nasa-gb-871913"&gt;NASA Software Safety Guidebook&lt;/a&gt; describes the situation very well:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Opinions differ widely concerning the validity of some of the various techniques, and this guidebook attempts to present these opinions without prejudging their validity. In most cases, there are few or no metrics as of yet, to quantitatively evaluate or compare the techniques.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Security is ignored
&lt;/h4&gt;

&lt;p&gt;Other people criticize the standards because they are mostly silent on security. I think that's a valid concern. If your product isn't secure, it's hard to argue that it's safe. &lt;/p&gt;

&lt;p&gt;Here's another slide from the Barr Group's 2017 Embedded Safety &amp;amp; Security Survey. It shows that only 78% of the respondents who are working on safety-critical projects that are connected to the internet even have security as a requirement. It's not even on the radar of 22% of projects! Now, how many of the 78% of respondents who do have security requirements do you suppose are doing security well?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UQhZp6dT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/eoukdgs9zdwtt0qbgacm.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UQhZp6dT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/eoukdgs9zdwtt0qbgacm.PNG" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the compliance with coding standards, code reviews, and static analysis for the safety-critical and connected to the internet subset. The ratios are about the same as the safety-critical only subset I showed you previously in this post. If you're not following a coding standard, doing code reviews, or using static analysis, I have a hard time believing you're somehow writing ultra-secure code for your internet connect, safety-critical product.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aWcFePVt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7v362p5jsz3ryh4zce3r.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aWcFePVt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7v362p5jsz3ryh4zce3r.PNG" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  The standards don't address component interaction failures among others
&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://sunnyday.mit.edu/"&gt;Nancy Leveson&lt;/a&gt; shows many examples where following the standards isn't enough. Just as we acknowledge that all software contains defects and plan accordingly, we should also acknowledge the possibility that our software may also contain/experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;component interaction failures&lt;/li&gt;
&lt;li&gt;requirements errors&lt;/li&gt;
&lt;li&gt;unanticipated human behavior&lt;/li&gt;
&lt;li&gt;system design errors&lt;/li&gt;
&lt;li&gt;non-linear or indirect interactions between components or systems&lt;/li&gt;
&lt;li&gt;etc. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Leveson argues that we need to build safety-critical systems that can cope with these factors. She proposes &lt;a href="http://psas.scripts.mit.edu/home/wp-content/uploads/2016/04/STAMP-Intro-2016.pdf"&gt;STAMP&lt;/a&gt; as an additional approach to improve system safety for these types of issues. She has a great &lt;a href="https://youtu.be/WBktiCyPLo4"&gt;talk on YouTube&lt;/a&gt; that covers the basics.&lt;/p&gt;

&lt;p&gt;By the way, she's not an odd-ball spouting BS from the sidelines. She's the Professor of Aeronautics and Astronautics at MIT and she works with the DOD, NASA, and others on safety-critical systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  15. Thoughts on the future of safety-critical software development
&lt;/h3&gt;

&lt;p&gt;Here are some of my ideas for where safety-critical software development is going and some of the challenges we'll face in getting there.&lt;/p&gt;

&lt;h4&gt;
  
  
  I anticipate sky-rocketing demand for this kind of software in the following areas:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;autonomous cars and driver assist features&lt;/li&gt;
&lt;li&gt;internet of things (including the industrial internet of things)&lt;/li&gt;
&lt;li&gt;robotics and industrial automation&lt;/li&gt;
&lt;li&gt;military systems&lt;/li&gt;
&lt;li&gt;medical devices and healthcare related applications&lt;/li&gt;
&lt;li&gt;space-based applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Challenges:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;demand for larger, more complex systems surpasses our ability to build them to the quality standards this kind of software requires&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;we need a way to drastically reduce the cost and time required to produce this kind of software&lt;/li&gt;
&lt;li&gt;how can we incorporate AI and machine learning into safety-critical systems?&lt;/li&gt;
&lt;li&gt;how do we allow safety-critical systems to communicate with each other and with non-safety-critical systems without degrading safety?&lt;/li&gt;
&lt;li&gt;security is going to continue to be a thorn in our sides&lt;/li&gt;
&lt;li&gt;more and more software is going to be used for safety-critical purposes without having been designed and built to safety-critical standards (like the doctor calculating IV drug doses on her smartphone)&lt;/li&gt;
&lt;li&gt;how do we attract sufficient numbers of talented software developers to work on safety-critical projects?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://standards.nasa.gov/standard/nasa/nasa-gb-871913"&gt;NASA Software Safety Guidebook&lt;/a&gt; (pdf)&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://users.encs.concordia.ca/~ymzhang/courses/reliability/ICSE02Knight.pdf"&gt;Great Introduction to safety-critical systems&lt;/a&gt; (pdf)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/E0igfLcilSk?t=1"&gt;Martyn Thomas talk on safety-critical systems and criticisms of the standards&lt;/a&gt; (video)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/03mUs5NlT6U?t=1"&gt;Martyn Thomas talk on correctness by construction techniques&lt;/a&gt; (video)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Wrapping up
&lt;/h3&gt;

&lt;p&gt;What do I want you to take away from this?&lt;/p&gt;

&lt;h4&gt;
  
  
  The quantity and complexity of safety-critical software is growing rapidly
&lt;/h4&gt;

&lt;p&gt;Safety-critical software is all around us and we can only expect more of it as we connect more of the world to the Internet, make "dumb" devices "smart", and invent entirely new products to make our lives better.&lt;/p&gt;

&lt;h4&gt;
  
  
  Developing this kind of software is hard
&lt;/h4&gt;

&lt;p&gt;Developers of safety-critical software systems feel the pain of the lack of maturity of the software engineering field more than most of software developers. Much to my disappointment, they don't appear to be hoarding any magic tools or tricks to get around the problems we all face in trying to develop complex products.  Aside from doing more up-front planning than the average project, they just throw money and process at their problems just like the rest of us.&lt;/p&gt;

&lt;h4&gt;
  
  
  Some safety-critical software is developed with a shocking disregard for best practices
&lt;/h4&gt;

&lt;p&gt;There's a wide gap between how safety-critical software systems are supposed to be developed and certified and what actually happens. I was shocked to learn that many safety-critical projects don't use coding standards, static analysis, code reviews, automated testing, or follow any safety standard at all!&lt;/p&gt;

&lt;p&gt;If you find yourself working on such a project, maybe take some time to consider the potential consequences of what you're doing. There are plenty of jobs for talented developers where you aren't asked to endanger people's lives.&lt;/p&gt;

&lt;h4&gt;
  
  
  Most safety-critical software is relatively safe
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Despite the many challenges of safety-critical software development, most safety-critical software systems appear to be, more or less, safe enough for their intended purpose.&lt;/strong&gt; That doesn't mean that it doesn't contain errors, or even that it doesn't kill people (because it almost certainly does). What I mean is that most safety-critical software is trustworthy enough to be used for its intended purpose as evidenced by the public's willingness to fly on planes, live near nuclear power plants, and have medical devices implanted in their bodies.&lt;/p&gt;

&lt;p&gt;Until Boeing's recent problems with the 737 Max, the go-to example of a safety-critical software error resulting in death was malfunction of the &lt;a href="https://en.wikipedia.org/wiki/Therac-25"&gt;Therac-25 radiation therapy machines&lt;/a&gt;. An investigation revealed that &lt;a href="http://sunnyday.mit.edu/papers/therac.pdf"&gt;the machines were pretty much a disaster from top to bottom&lt;/a&gt;. And between 1985 and 1987 a handful of people received harmful doses of radiation from Therac-25 machines and a couple of people died. &lt;/p&gt;

&lt;p&gt;That the Therac-25 was the go-to example of a failure of safety-critical software causing death says something about just how well most of these systems perform in the real world. After all, safety-critical software is controlling nuclear power plants, medical devices, rail switching, elevators, aircraft, traffic lights, spacecraft, weapons systems, safety features in cars, and so on. But when is the last time you heard about a software error causing a safety-critical system to fail and kill people (besides the Boeing 737 Max and Tesla autopilot fatalities)?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have a comment, question or a story to share? Let me have it in the comments.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Enjoy this post? Please "like" it below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>codequality</category>
      <category>career</category>
      <category>management</category>
      <category>professionalism</category>
    </item>
    <item>
      <title>Checkout the world's safest open source sumobot (with video)</title>
      <dc:creator>Blaine Osepchuk</dc:creator>
      <pubDate>Thu, 16 Jan 2020 19:43:25 +0000</pubDate>
      <link>https://forem.com/bosepchuk/checkout-the-world-s-safest-open-source-sumobot-with-video-k6k</link>
      <guid>https://forem.com/bosepchuk/checkout-the-world-s-safest-open-source-sumobot-with-video-k6k</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/GyEZLSxFQtE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;I created the &lt;em&gt;&lt;a href="https://github.com/bosepchuk/High_Integrity_Sumobot" rel="noopener noreferrer"&gt;High Integrity Sumobot&lt;/a&gt;&lt;/em&gt; using Ada/SPARK and high integrity software engineering techniques. I wanted to make it easy for people interested in Ada/SPARK to see how all the pieces fit together in a small embedded project.&lt;/p&gt;

&lt;p&gt;I did my best to write simple, clean, and maintainable code throughout. It's extensively commented.&lt;/p&gt;

&lt;h1&gt;
  
  
  System overview
&lt;/h1&gt;

&lt;p&gt;I started with a &lt;a href="https://www.pololu.com/product/3126" rel="noopener noreferrer"&gt;Zumo 32U4&lt;/a&gt; sumobot. But instead of programming it directly as a microcontroller like most people do, I turned it into an I2C slave device, which I control with a microbit I programmed in Ada/SPARK.&lt;/p&gt;

&lt;p&gt;The zumo continuously collects sensor data and stores it in a buffer. The microbit periodically requests sensor data from the zumo over I2C and the zumo sends the data it most recently collected. The microbit validates the sensor data, decides how the zumo should move, and sends motor commands back to the zumo (also over I2C). The zumo validates the motor commands and then executes them. And then the process repeats (at least 50 times per second).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F94j8xil79ggflbr7069c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F94j8xil79ggflbr7069c.png" alt="describes the communications between the zumo and the microbit"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  More information and build instructions
&lt;/h1&gt;

&lt;p&gt;You can find the &lt;a href="https://smallbusinessprogramming.com/high-integrity-sumobot-build-instructions/" rel="noopener noreferrer"&gt;full documentation and build instructions for this project on my website&lt;/a&gt;. I've included everything you need to create your own &lt;em&gt;High Integrity Sumobot&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;written requirements&lt;/li&gt;
&lt;li&gt;full parts list&lt;/li&gt;
&lt;li&gt;wiring diagram&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bosepchuk/High_Integrity_Sumobot" rel="noopener noreferrer"&gt;source code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;detailed build instructions (with photos)&lt;/li&gt;
&lt;li&gt;detailed software installation instructions (with screenshots)&lt;/li&gt;
&lt;li&gt;instructions for how to run the automated unit tests&lt;/li&gt;
&lt;li&gt;compile/build and upload/flashing instructions (with screenshots)&lt;/li&gt;
&lt;li&gt;end-to-end testing plan linked to each requirement&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Wrapping up
&lt;/h1&gt;

&lt;p&gt;I welcome any feedback on my project. If you have a way to make it better I'd love to hear from you.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>embedded</category>
    </item>
    <item>
      <title>I'm programming a sumobot with the world's safest programming language</title>
      <dc:creator>Blaine Osepchuk</dc:creator>
      <pubDate>Thu, 14 Nov 2019 18:38:10 +0000</pubDate>
      <link>https://forem.com/bosepchuk/i-m-programming-a-sumobot-with-the-world-s-safest-programming-language-43do</link>
      <guid>https://forem.com/bosepchuk/i-m-programming-a-sumobot-with-the-world-s-safest-programming-language-43do</guid>
      <description>&lt;p&gt;The &lt;a href="https://www.hackster.io/contests/adacore2"&gt;Make with Ada&lt;/a&gt; contest is offering $8,000+ in prizes for "cool embedded applications programmed in the Ada and SPARK programming languages."&lt;/p&gt;

&lt;p&gt;I've always wanted to build a robot and &lt;a href="https://smallbusinessprogramming.com/how-i-intend-to-become-a-better-software-developer/"&gt;I've been looking for excuses to play around with Ada&lt;/a&gt; so I thought this would be a great time to kill two birds with one stone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project overview
&lt;/h3&gt;

&lt;p&gt;I'm building a robot that can compete in the mini-sumo class. I bought a &lt;a href="https://www.pololu.com/category/170/zumo-32u4-robot"&gt;Zumo 32U4 robot&lt;/a&gt; online because it's packed with sensors, has a great software library, and I didn't want to build a robot from scratch. It's meant to be programmed entirely as an arduino microcontroller but I'm going a different route. &lt;/p&gt;

&lt;p&gt;I'm collecting all the sensor data from the zumo and sending it to my &lt;a href="https://microbit.org/"&gt;microbit&lt;/a&gt; microcontroller over I2C. I'm using the &lt;a href="https://github.com/AdaCore/Ada_Drivers_Library"&gt;Ada drivers library&lt;/a&gt; to program the microbit in Ada (and I'll add some SPARK too if I have time). The microbit will receive the I2C sensor data, decide what to do, and directly command the robot motors from the GPIO lines on the microbit. All of the critical code will be written in Ada/SPARK on the microbit, which I hope will impress the judges.&lt;/p&gt;

&lt;p&gt;My robot should be quite a capable sumobot when I'm done.&lt;/p&gt;

&lt;h3&gt;
  
  
  Current status
&lt;/h3&gt;

&lt;p&gt;I have a working proof of concept. I'm collecting sensor data from the front proximity sensors, transferring it to the microbit over I2C, validating and processing it, and commanding the motors to turn the robot towards the detected object. My next task is to get all the electronics securely mounted on the zumo. Then I'll continue adding capabilities to my sumobot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Any ideas for features with "buzz effect" I should add to the project?
&lt;/h3&gt;

&lt;p&gt;One of the judging criteria is buzz effect:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;one of the main goals of the Competition is to give more exposure to Ada, SPARK and related technologies. Projects will be judged in part with regards to how we think the project can have an impact in that regard: Will the project give more exposure to Ada? Does it have a “wow effect” that will appeal to the technology community in general? Will it show the benefits of Ada and related technologies?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I imagine a sumobot like mine would have more "buzz effect" than a lithium ion battery charger written in Ada. But, beyond that, I'm not entirely sure what they are looking for. I'd welcome any suggestions for improving my project's "buzz effect."&lt;/p&gt;

&lt;h3&gt;
  
  
  More about the make with Ada contest
&lt;/h3&gt;

&lt;p&gt;If you have any interest in embedded software development or Ada you should definitely consider entering the &lt;a href="https://www.hackster.io/contests/adacore2"&gt;make with Ada contest&lt;/a&gt;. The number of serious entries in previous years has been quite low. So you have a good chance of winning one of the top ten finalist prizes of $600, if not the 1st place prize of $2000 if you put a decent amount of effort into your entry. &lt;/p&gt;

&lt;p&gt;The final day of the contest is January 31, 2020. So you have lots of time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrapping up
&lt;/h3&gt;

&lt;p&gt;I welcome any feedback on my project. If you have a way to make it better I'd love to hear from you. And I hope I can inspire at least one other person to join the contest. So let me know if you plan to enter the contest in the comments.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>embedded</category>
      <category>contests</category>
    </item>
    <item>
      <title>The ONE chart every developer MUST understand</title>
      <dc:creator>Blaine Osepchuk</dc:creator>
      <pubDate>Sat, 07 Sep 2019 16:59:21 +0000</pubDate>
      <link>https://forem.com/bosepchuk/the-one-chart-every-developer-must-understand-2db9</link>
      <guid>https://forem.com/bosepchuk/the-one-chart-every-developer-must-understand-2db9</guid>
      <description>&lt;p&gt;Our industry is famous for delivering projects late and over budget. Many projects are cancelled outright and many others never deliver anything near the value we promised our customers. And yet, there is a subset of software development organizations that consistently deliver excellent results. And they've known how to do it since the 1970s. In this post I'll tell you their secret.&lt;/p&gt;

&lt;p&gt;It all starts with understanding this one chart from Steve McConnell. It describes the relationship between defect rates and development time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Femtjmutq6vgsf8xtyn8a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Femtjmutq6vgsf8xtyn8a.png" alt="Chart showing the relationship between defect rate and development time."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This chart says that most teams could deliver their software projects sooner if they focused more effort on defect prevention, early defect removal, and other quality issues&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  But is this chart true?
&lt;/h3&gt;

&lt;p&gt;Steve McConnell published this chart in a blog post titled &lt;a href="https://stevemcconnell.com/articles/software-quality-at-top-speed/" rel="noopener noreferrer"&gt;Software Quality at Top Speed&lt;/a&gt; in 1996. This chart (and the blog post) summarizes some of the data in his excellent book &lt;a href="https://www.amazon.com/Rapid-Development-Devment-Developer-Practices-ebook/dp/B00JDMPOB6/" rel="noopener noreferrer"&gt;Rapid Development&lt;/a&gt;. And that book is based, in part, on the research of Capers Jones up to the early 1990s. I'm throwing in all these dates because I want you to know just how long we've known that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In software, higher quality (in the form of lower defect rates) and reduced development time go hand in hand.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Anyway, Capers Jones kept doing his research and he released another book in 2011 with co-author, Olivier Bonsignour titled &lt;a href="https://www.amazon.com/Economics-Software-Quality-Capers-Jones-ebook/dp/B005DKQQQY/" rel="noopener noreferrer"&gt;The Economics of Software Quality&lt;/a&gt;. They &lt;strong&gt;analyzed over 13,000 software projects from over 660 organizations between 1973 and 2010&lt;/strong&gt; and collected even more evidence that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;... high quality levels are invariably associated with shorter-than-average development schedules and lower than average development costs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In other words, Steve McConnell's chart is true.&lt;/p&gt;

&lt;h3&gt;
  
  
  So what's the problem then?
&lt;/h3&gt;

&lt;p&gt;There are three problems.&lt;/p&gt;

&lt;h4&gt;
  
  
  Problem 1: we're ignoring the research
&lt;/h4&gt;

&lt;p&gt;The majority of projects are run as if this chart isn't true. Hardly a day goes by when I don't hear of some project or someone exercising poor judgement and then predictably getting smacked down by the universe for it. &lt;strong&gt;Literally billions of dollars are lost every year to this foolishness&lt;/strong&gt;. It's been going on since we started programming computers. Every developer has experienced it. And there's no end in sight.&lt;/p&gt;

&lt;p&gt;For example, pressuring yourself (or succumbing to external pressure) to go faster by cutting corners is almost guaranteed to increase your defect rate and slow down your project. Yet it happens all the time!&lt;/p&gt;

&lt;p&gt;But the problem runs deeper than that. Managers are responsible for the worst project disasters. We have people running these projects who, while well-intentioned, have little idea what they are doing. Many of their projects are headed for disaster from the outset (see the "classic" software mistakes below). And by the time they realize that their project is in trouble--usually months after the developers reached the same conclusion--it's often too late to do much about it.&lt;/p&gt;

&lt;h4&gt;
  
  
  Problem 2: small project development practices don't scale well
&lt;/h4&gt;

&lt;p&gt;The development practices that work relatively well for small projects, don't scale to large, real world projects. Small projects are the only kind of projects most students work on. So they graduate with the false impression that they know how to develop software. But they've been building the equivalent of garden sheds when we are trying to hire them to build the equivalent of skyscrapers. A skyscraper isn't just a really big garden shed--they are completely different things. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fvz9irsvf9eyjsbnp89mf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fvz9irsvf9eyjsbnp89mf.jpg" alt="Garden sheds aren't the same as really big skyscrapers"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And because so few organizations do software development well, many teams employ garden shed-appropriate methods to tackle skyscraper-sized problems. So these poor developers think chaos, confusion, bugs, conflicting requirements, endless testing cycles, missed deadlines, stress, piles of rework, and death marches are all normal parts of software development. &lt;/p&gt;

&lt;h4&gt;
  
  
  Problem 3: many teams don't have the required skills
&lt;/h4&gt;

&lt;p&gt;You need more than raw technical skills to achieve low defects rates in real-world projects. You need a whole suite of organizational, managerial, and technical level strategies and tactics to pull this off. You'll almost certainly need additional training for almost everyone in your organization and it also requires you to embrace different development practices.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does it take to achieve that 95% pre-release defect removal rate?
&lt;/h3&gt;

&lt;p&gt;For most organizations, it will take quite an adjustment to achieve that 95% pre-release defect removal rate. But the good news is that &lt;strong&gt;even modest improvements in pre-release defect rates will positively impact the economics of your project&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With that in mind, I suggest the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accept the truth that high-quality software is faster and cheaper to build than low quality software&lt;/li&gt;
&lt;li&gt;Be aware of Steve McConnell's "classic" software mistakes&lt;/li&gt;
&lt;li&gt;Use memory-safe languages whenever possible&lt;/li&gt;
&lt;li&gt;Start improving your development practices&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's dive in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Accept the truth that high-quality software is faster and cheaper to build than low quality software
&lt;/h3&gt;

&lt;p&gt;If you need more evidence than you already have, read &lt;a href="https://www.amazon.com/Economics-Software-Quality-Capers-Jones-ebook/dp/B005DKQQQY/" rel="noopener noreferrer"&gt;The Economics of Software Quality&lt;/a&gt; to truly convince yourself and your teammates that this chart is telling the truth. The authors of this book leave very little doubt that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The best available quality results in 2011 are very good, but they are not well understood nor widely deployed because of, for one reason, the incorrect belief that high quality is expensive. High-quality software is not expensive. High-quality software is faster and cheaper to build and maintain than low quality software, from initial development all the way through total cost of ownership.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Furthermore:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If state-of-the-art combinations of defect prevention, pretest defect removal, and formal testing were utilized on every major software project, delivered defects would go down by perhaps 60% compared to 2011 averages.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Why is that?
&lt;/h4&gt;

&lt;p&gt;Low quality projects spend much more time on testing, debugging, fixing, and rework than high quality projects. In fact, low quality projects contain so many defects that testing often takes longer than construction. And low quality projects frequently stop testing long before they run out of bugs to find. &lt;/p&gt;

&lt;p&gt;On waterfall projects they either release the software as is or cancel the project because testing and fixing will go on forever otherwise. On agile projects increments of work are completed quickly at first and then slow to a glacial pace as more and more problems are discovered in existing code. Eventually low quality agile projects reach the same options as waterfall projects: release as is or cancel the project.&lt;/p&gt;

&lt;p&gt;High quality projects invest in defect prevention and pretest defect removal activities so that when they do get to testing, there are many fewer defects to find and fix. High quality projects are released sooner and cost less than low quality projects because they have much shorter testing phases and much less rework. And high quality projects also have fewer post-release issues to fix. So when they do need to make changes, the code in high quality projects is easier and cheaper to modify.&lt;/p&gt;

&lt;h4&gt;
  
  
  Let's look at some key points from &lt;em&gt;The Economics of Software Quality&lt;/em&gt;:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Overall quality levels have not changed much between 1973 and 2010&lt;/strong&gt;. IDEs, new languages, interpreted languages, automated testing tools, static analysis tools, better libraries, frameworks, continuous integration, thousands of books, Agile, Scrum, XP, OOP, TDD, and the whole fricking web haven't moved the needle! That's just depressing. (I know someone is going to argue that this point can't be true. Feel free to look it up on pages 538 and 539 of &lt;em&gt;The Economics of Software Quality&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;In low quality software projects &lt;strong&gt;nearly 50% of the effort is devoted to finding and repairing defects and rework&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defect rates rise faster than project size&lt;/strong&gt;. That means the things you need to do to ensure a 95% pre-release defect removal rate in a 5 KLOC project are completely different than the things you need to do in a 500 KLOC project. Bigger projects not only need more QA activities but they also need different QA activities. Remember, a skyscraper isn't just a really big garden shed.&lt;/li&gt;
&lt;li&gt;Testing has been the primary form of defect removal since the software industry began and for many projects, it's the only form used. That's a shame because &lt;strong&gt;testing is not that effective&lt;/strong&gt;. Even if you combine 6 or 8 forms of testing you can't expect to remove more than 80% of the defects in large systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defect prevention methods&lt;/strong&gt; include reuse, formal inspections, prototyping, &lt;a href="https://smallbusinessprogramming.com/want-to-write-defect-free-software-learn-the-personal-software-process/" rel="noopener noreferrer"&gt;PSP/TSP&lt;/a&gt;, static analysis, root cause analysis, TDD, and many others. The factors that hurt defect prevention the most are excessive requirements changes, excessive schedule pressure, and no defect or quality measures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The most effective forms of pretest defect removal are formal inspections and static analysis&lt;/strong&gt;. But the authors also discuss 23 other methods of pretest defect removal, their range of expected results, and when you might want to use them. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The ROI on the better forms pretest defect removal is more than $10 for every $1 that is spent&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;This book discusses 40 kinds of testing, their range of effectiveness, and when you might want to use them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think this book's true value comes from the evidence it provides to help you argue against ideas and practices that have an especially negative effect on the cost and schedule of your project. For example, after reading this book it's hard to argue that you don't have time for code reviews.&lt;/p&gt;

&lt;h3&gt;
  
  
  Be aware of Steve McConnell's classic software mistakes
&lt;/h3&gt;

&lt;p&gt;In chapter 3 of &lt;a href="https://www.amazon.com/Rapid-Development-Devment-Developer-Practices-ebook/dp/B00JDMPOB6/" rel="noopener noreferrer"&gt;Rapid Development&lt;/a&gt;, Steve McConnell lists 36 "classic" software mistakes. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Falling victim to even one of these mistakes can condemn your project to slow, expensive development&lt;/strong&gt;. You need to avoid all of them if you want to be efficient.&lt;/p&gt;

&lt;p&gt;They are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Undermined motivation&lt;/li&gt;
&lt;li&gt;Weak personnel&lt;/li&gt;
&lt;li&gt;Uncontrolled problem employees&lt;/li&gt;
&lt;li&gt;Heroics&lt;/li&gt;
&lt;li&gt;Adding people to a late project&lt;/li&gt;
&lt;li&gt;Noisy, crowded offices&lt;/li&gt;
&lt;li&gt;Friction between developers and customers&lt;/li&gt;
&lt;li&gt;Unrealistic expectations&lt;/li&gt;
&lt;li&gt;Lack of effective project sponsorship&lt;/li&gt;
&lt;li&gt;Lack of stakeholder buy-in&lt;/li&gt;
&lt;li&gt;Lack of user input&lt;/li&gt;
&lt;li&gt;Politics placed over substance&lt;/li&gt;
&lt;li&gt;Wishful thinking&lt;/li&gt;
&lt;li&gt;Overly optimistic schedules&lt;/li&gt;
&lt;li&gt;Insufficient risk management&lt;/li&gt;
&lt;li&gt;Contractor failure&lt;/li&gt;
&lt;li&gt;Insufficient planning&lt;/li&gt;
&lt;li&gt;Abandonment of planning under pressure&lt;/li&gt;
&lt;li&gt;Wasted time during the fuzzy front end&lt;/li&gt;
&lt;li&gt;Shortchanged upstream activities&lt;/li&gt;
&lt;li&gt;Inadequate design&lt;/li&gt;
&lt;li&gt;Shortchanged quality assurance&lt;/li&gt;
&lt;li&gt;Insufficient management controls&lt;/li&gt;
&lt;li&gt;Premature or overly frequent convergence&lt;/li&gt;
&lt;li&gt;Omitting necessary tasks from estimates&lt;/li&gt;
&lt;li&gt;Planning to catch up later&lt;/li&gt;
&lt;li&gt;Code-like-hell programming&lt;/li&gt;
&lt;li&gt;Requirements gold-plating&lt;/li&gt;
&lt;li&gt;Feature creep&lt;/li&gt;
&lt;li&gt;Developer gold-plating&lt;/li&gt;
&lt;li&gt;Push-me, pull-me negotiation&lt;/li&gt;
&lt;li&gt;Research-oriented development&lt;/li&gt;
&lt;li&gt;Silver-bullet syndrome&lt;/li&gt;
&lt;li&gt;Overestimated savings from new tools or methods&lt;/li&gt;
&lt;li&gt;Switching tools in the middle of a project&lt;/li&gt;
&lt;li&gt;Lack of automated source-code control&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Rapid Development&lt;/em&gt; was released over 25 years ago. Yet 35 of those classic mistakes are still extremely common (Subversion and GIT have largely solved #36 "lack of automated source-code control").&lt;/p&gt;



&lt;br&gt;
Update: 2021-08-17

&lt;p&gt;Check out Steve McConnell's updated and improved list of "&lt;a href="https://dev.to/steve-mcconnells-classic-software-mistakes-revisited/"&gt;classic software mistakes&lt;/a&gt;."&lt;br&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Use memory-safe languages whenever possible
&lt;/h3&gt;

&lt;p&gt;This suggestion didn't make it into either book but I think it's an important point in 2019. &lt;a href="https://www.zdnet.com/article/microsoft-70-percent-of-all-security-bugs-are-memory-safety-issues/" rel="noopener noreferrer"&gt;Around 70 percent of all the vulnerabilities in Microsoft products addressed through a security update each year are memory safety issues&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;It's pretty clear at this point that humans just aren't capable of programming large systems in memory-unsafe languages like C and C++ without making an astounding number of mistakes or spending embarrassing amounts of money to find and remove them.&lt;/p&gt;

&lt;p&gt;If Microsoft can't keep those errors out of their software, it's unreasonable to think you can do any better. So, if you're starting a new project choose a memory-safe language. There are memory-safe languages for even the most demanding domains so don't let your concerns about the performance implications or compatibility issues stop you from checking them out. &lt;/p&gt;

&lt;h3&gt;
  
  
  Start improving your development practices
&lt;/h3&gt;

&lt;p&gt;Okay. So, you now believe the chart is correct and you further believe you are to the left of the optimum. What now? Try to get your organization moving down the curve towards the optimal point on the chart, of course.&lt;/p&gt;

&lt;p&gt;Your first step is to &lt;strong&gt;get buy-in&lt;/strong&gt; to the fact that low quality is a problem on your project. Since quality is a problem on most projects it shouldn't be hard to come up with evidence to support your case. Chapter 2 of &lt;em&gt;The Economics of Software Quality&lt;/em&gt; will help you setup a defect tracking system to track the right things and avoid common measurement pitfalls. Having hard data about the cost of low quality will help you make your case.&lt;/p&gt;

&lt;p&gt;Your next step is to convince yourself and your team to &lt;strong&gt;stop taking shortcuts because they almost always backfire&lt;/strong&gt;. Print out the chart and hang out on your walls if you have to.&lt;/p&gt;

&lt;p&gt;Next, I suggest you &lt;strong&gt;implement a small change&lt;/strong&gt; across your team, try it for a while, evaluate your results, keep or discard your change, and then choose something else to improve and &lt;strong&gt;repeat the cycle&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not all ideas are equally helpful so I'd start with the suggestions in &lt;a href="https://stevemcconnell.com/articles/software-quality-at-top-speed/" rel="noopener noreferrer"&gt;Software Quality at Top Speed&lt;/a&gt;. The three ideas in that blog post are bang on. &lt;strong&gt;Start by eliminating shortcuts, replacing error-prone modules, and adopting some kind of code review process&lt;/strong&gt;. You're welcome to use my &lt;a href="https://smallbusinessprogramming.com/code-review-checklist-prevents-stupid-mistakes/" rel="noopener noreferrer"&gt;code review checklist&lt;/a&gt; as a starting point.&lt;/p&gt;

&lt;p&gt;Then I'd move on to &lt;a href="https://www.amazon.com/Rapid-Development-Devment-Developer-Practices-ebook/dp/B00JDMPOB6/" rel="noopener noreferrer"&gt;Rapid Development&lt;/a&gt;. This book is all about getting your project under control and delivering working software faster. The 36 classic mistakes to avoid are super important. Go there next, then tackle the topics in the remainder of the book. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/Economics-Software-Quality-Capers-Jones-ebook/dp/B005DKQQQY/" rel="noopener noreferrer"&gt;The Economics of Software Quality&lt;/a&gt; isn't really a how-to book but it will come in handy as a reference. It will help you determine the optimal quality target for your particular project. And it offers you a menu of options to help you choose the right combination of practices to achieve it.&lt;/p&gt;

&lt;h3&gt;
  
  
  What if nobody's interested in improving quality?
&lt;/h3&gt;

&lt;p&gt;Sadly, this is going to happen to many of you. It's hard to shake the myth that quality is expensive. And it's even harder to convince people to change how they work. Unless you are the top dog on your team you may not have the influence required to spearhead this kind of change.&lt;/p&gt;

&lt;p&gt;So you have three options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Forget about improving quality at the project level and conform to the norms of your team.&lt;/li&gt;
&lt;li&gt;Continue advocating for quality improvements and hope that people will eventually agree with you.&lt;/li&gt;
&lt;li&gt;Find a new place to work that already cares about quality.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I can't decide for you but let me just say that there are many more developer positions available than qualified developers to fill them. And &lt;strong&gt;many employers do care about quality and are actively recruiting people at all levels of experience&lt;/strong&gt; who can help them improve it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrapping Up
&lt;/h3&gt;

&lt;p&gt;Many of you are just as alarmed and distressed by the quality of the average software project as I am. We know how to do better but we just need to get the ball rolling on more software development teams. And I believe the first step is to show people this chart and the evidence behind it.&lt;/p&gt;

&lt;p&gt;I know this problem isn't going to go away overnight. But if you feel the same way I do please do what you can to spread the word, share this post, improve the results in your own projects, and help improve the collective results of our industry.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Agree or disagree? Have a story to share? Let me have it in the comments.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Enjoy this post? Please "like" it below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>codequality</category>
      <category>testing</category>
      <category>programming</category>
      <category>books</category>
    </item>
    <item>
      <title>How to Crush it at the Start of Your New Developer Job</title>
      <dc:creator>Blaine Osepchuk</dc:creator>
      <pubDate>Sat, 15 Jun 2019 15:27:49 +0000</pubDate>
      <link>https://forem.com/bosepchuk/how-to-crush-it-at-the-start-of-your-new-developer-job-2fm2</link>
      <guid>https://forem.com/bosepchuk/how-to-crush-it-at-the-start-of-your-new-developer-job-2fm2</guid>
      <description>&lt;p&gt;This no B.S. guide will tell you what you need to know to survive and thrive as a software developer at my workplace (or just about any workplace).&lt;/p&gt;

&lt;h3&gt;
  
  
  Congratulations on being hired. You have a lot to learn. It's not the stuff you think. And you've got to learn it fast
&lt;/h3&gt;

&lt;p&gt;We don't care where you went to school, where you've worked, or about any of the things you've accomplished. That's all in the past. You are starting from zero.&lt;/p&gt;

&lt;h4&gt;
  
  
  Here's the deal
&lt;/h4&gt;

&lt;p&gt;I assume you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;are a reasonably competent programmer who wants to do a good job and work on interesting projects&lt;/li&gt;
&lt;li&gt;want autonomy to choose what you work on, make your own decisions, have your opinion heard, and influence the direction of your projects&lt;/li&gt;
&lt;li&gt;want to learn valuable skills that can help you progress in your career&lt;/li&gt;
&lt;li&gt;may or may not want leadership or management positions and responsibilities&lt;/li&gt;
&lt;li&gt;wouldn't turn down bonuses, raises, and other perks for doing your job well&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of that is on the table in our organization. You set your own limits on the level of autonomy, rewards, training, responsibility, perks, etc. you will receive in this job. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The level of autonomy we grant you is directly proportional to the clarity with which you understand your mission (see below) and the level of competence you exhibit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High levels of clarity of mission and competence will be met with high rewards&lt;/strong&gt;. But there's a flip side to that equation. &lt;strong&gt;If you are unable to grasp your mission or if you demonstrate low competence despite our best efforts to train you, we'll park you on unimportant tasks and micro-manage you in the best case and fire you in the worst case&lt;/strong&gt; (I said this is a no B.S. guide).&lt;/p&gt;

&lt;h4&gt;
  
  
  Your mission
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XPYLAcKU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2n0xjiaj7bsu6ye7kavh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XPYLAcKU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2n0xjiaj7bsu6ye7kavh.jpg" alt="military exercise"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your mission is to help our company increase revenues and reduce costs. That's it. Every position in our company (and every for-profit company) has the same mission. Your value to our company rests on your ability to deliver on your mission. And we are judging you on that basis. So you need demonstrate that you understand your mission and start delivering on that mission as quickly as you can.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;best way you can help us increase revenues and reduce costs is by working on the most important thing at all times&lt;/strong&gt;. I can't overstate the importance of this point.&lt;/p&gt;

&lt;p&gt;The simplistic formula for calculating the most important thing is "return" divided by "effort." &lt;/p&gt;

&lt;p&gt;This is a major problem for you as a new employee because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;you have no way of knowing the amount of "return" (revenue or cost reduction) any given task could be expected to provide&lt;/li&gt;
&lt;li&gt;you can only guess at the "effort" required to complete any given task because you don't know how we do things yet&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, it's basically impossible for you to create much value on your own until you can make reasonable assessments of "return" and "effort." &lt;strong&gt;And you won't get much autonomy until you prove to us that you can make these assessments reasonably well.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Tips
&lt;/h4&gt;

&lt;p&gt;Let me point out a couple of things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;your most important decision is the first decision&lt;/strong&gt; (what to work on). If you get that one really wrong nothing you do after that will help you create substantial value. You could write the world's best software but if you solve the wrong problem, it's worthless to us.&lt;/li&gt;
&lt;li&gt;it's not enough to find something of value to work on. You are looking for the thing that has the most value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;the most important decisions in your job are rarely 100% technical&lt;/strong&gt;. Our product owner is an MBA. And he can't tell the difference between an SQL query and a file full of jQuery but he's really good at this stuff. His deep domain knowledge, ability to ask us (his programmers) smart questions, and his strong grasp of how value is created ("return" divided by "effort") are all he needs to make great decisions. Unfortunately for you, this is also a lot harder to learn than the typical things new programming hires ask about such as the mechanics of how we create pull requests or how we name things.&lt;/li&gt;
&lt;li&gt;it's a mistake to assume you know the best way to make all these decisions as a new hire. But it's not against the rules to ask a co-worker for help. &lt;strong&gt;Hint!&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  How to do a really good job in your first few days
&lt;/h4&gt;

&lt;p&gt;Focus on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;acquiring domain knowledge - start with the basics (what we sell, why we sell it, how we make money, where our opportunities are, where our challenges are, etc.)&lt;/li&gt;
&lt;li&gt;asking your teammates smart questions - what do you want me to learn first? what are our priorities? what do I have to do to be a &lt;a href="https://smallbusinessprogramming.com/10x-programmer/"&gt;10x programmer&lt;/a&gt; on this team?&lt;/li&gt;
&lt;li&gt;getting into the habit of trying to maximize the value of your efforts. Start doing that math on your decisions. It needs to become a habit.&lt;/li&gt;
&lt;li&gt;avoiding silly suggestions - I know you want to sound smart and make valuable contributions but you don't know anything about creating value in this company yet. This is the time for asking questions and learning, not advocating for your favorite technology, methodology, or problem solving approach. Even if you see something that seems absolutely crazy I'd encourage you to assume that there's a good reason for it and just go with it for now (but make a note to circle back to it in a month or two if it still seems crazy).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  I want you to succeed but you have to be responsible for yourself
&lt;/h3&gt;

&lt;p&gt;Be prepared. Work hard. Meet your commitments. Don't be late. Don't waste people's time. Ask smart questions. And take notes.&lt;/p&gt;

&lt;p&gt;Take responsibility for integrating yourself into the rituals, processes, and culture of your team. Request training and one-on-ones with people who can help you with your mission. If you need resources, ask for them. But know when you are beginning to make too many demands on other people and dial it back.&lt;/p&gt;

&lt;p&gt;I'll give you as much of my time as I can but I find that it's better if new hires "pull" information toward themselves than if I "push" it on them by assigning readings and giving tutorials. &lt;/p&gt;

&lt;p&gt;To a large extent, you are in control of how much training, orientation, and mentoring you receive above the bare minimum.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aim to be a "zero" for your first few weeks
&lt;/h3&gt;

&lt;p&gt;In his book &lt;a href="https://www.amazon.com/Astronauts-Guide-Life-Earth-ebook/dp/B00DPTL1TW/"&gt;An Astronaut's Guide to Life on Earth&lt;/a&gt;, Chris Hatfield (a famous Canadian astronaut) said he aimed to be a "zero" at the beginning of a new job.&lt;/p&gt;

&lt;p&gt;In your first few weeks in a new position it's very easy to say or do the wrong thing, especially if you're trying to show people how smart and capable you are. And because it can be difficult to overcome first impressions (or get yourself un-fired), you should aim to simply meet expectations and not make any major mistakes--aim to be a "zero."&lt;/p&gt;

&lt;p&gt;Your first few weeks are about finding your footing and figuring out what's expected of you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Never stop learning
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A9Jn4t_V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/gd53qhimaf5f5qcpsziv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9Jn4t_V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/gd53qhimaf5f5qcpsziv.jpg" alt="baby using a computer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mastering the information in this post will help you make it through your probationary period. But your long term success at our company relies on your continued growth and ability to create value.&lt;/p&gt;

&lt;p&gt;You should work through all the information in this post: &lt;a href="https://smallbusinessprogramming.com/how-to-be-a-wildly-successful-small-business-programmer/"&gt;How to be a wildly successful programmer&lt;/a&gt;. There's no secret to being an amazingly valuable member of our team. I wrote it all down for you and I'll help you achieve your goals any way I can. But you have to do the work.&lt;/p&gt;

&lt;p&gt;You should also start reading my &lt;a href="https://smallbusinessprogramming.com/must-read-programming-books/"&gt;must read programming books&lt;/a&gt;. I can give you customized reading recommendations. Just ask.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;So that's my no B.S. (highly opinionated) guide to crushing it at the start of your new developer job. Over the years I've observed many people start all kinds of positions. And hardly anybody does as well as they could during their first few weeks on the job because they are focused on the wrong things. So be prepared for your boss to fall in love with you if you follow this guide. &lt;/p&gt;

&lt;p&gt;You can also use this guide to change your fortunes in your current position. It's never too late to change your approach to your job and reap the rewards of being a star employee.&lt;/p&gt;

&lt;p&gt;Note: the opinions expressed in this post are mine alone and do not reflect the opinions of my current employer or former employers.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Do you have a good or bad onboarding experience to share? I'd love to hear it in the comments.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Enjoy this post? Please "like" it below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>hiring</category>
      <category>learning</category>
      <category>psychology</category>
    </item>
    <item>
      <title>How to Manage Programmers Without Losing Your Damn Mind</title>
      <dc:creator>Blaine Osepchuk</dc:creator>
      <pubDate>Sat, 04 May 2019 19:32:59 +0000</pubDate>
      <link>https://forem.com/bosepchuk/how-to-manage-programmers-without-losing-your-damn-mind-66c</link>
      <guid>https://forem.com/bosepchuk/how-to-manage-programmers-without-losing-your-damn-mind-66c</guid>
      <description>&lt;p&gt;Stop me if this sounds like you. Somewhere along the way someone put you in charge of something at your job. Maybe you're coaching a new hire, maybe you're a technical lead on a small team, or maybe you're running a whole project. Regardless of what you're managing, you need to deal with people and that's not going quite as well as you had hoped because managing programmers is hard. And it can be hard on your sanity.&lt;/p&gt;

&lt;p&gt;Maybe you even picked up a book or two about management in the hopes that you'd find something--some trick or skill--to help you manage your people better. I can tell you from experience that most of those books are crap. But there are a couple of exceptions and in this post I want to give you a summary of one of them: &lt;a href="https://www.amazon.com/Coaching-Habit-Less-Change-Forever-ebook/dp/B01BUIBBZI/"&gt;The Coaching Habit: Say Less, Ask More &amp;amp; Change the Way You Lead Forever&lt;/a&gt; by Michael Bungay Stanier.&lt;/p&gt;

&lt;h3&gt;
  
  
  The problem
&lt;/h3&gt;

&lt;p&gt;Too many conversations between managers and the people they manage feel like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the manager is doing too much of the work&lt;/li&gt;
&lt;li&gt;the manager thinks he knows what's wrong and how to fix it&lt;/li&gt;
&lt;li&gt;the conversation gets derailed&lt;/li&gt;
&lt;li&gt;the manager has too much trouble getting the conversation back into productive territory&lt;/li&gt;
&lt;li&gt;the manager is exhausted at the end and hasn't accomplished nearly as much as he hoped&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Coaching as a leadership style
&lt;/h3&gt;

&lt;p&gt;Coaching is an effective leadership style but most people don't know how to do it. Managers are programmed to solve problems but &lt;strong&gt;solving problems for your staff is not a healthy practice. It makes your staff dependent on you for advice and solutions and you become a bottleneck&lt;/strong&gt;. Nobody ever grows and performance never improves. When this happens you've fallen victim to the "advice monster" lurking inside of you. &lt;/p&gt;

&lt;p&gt;Through the "seven essential questions," &lt;a href="https://www.amazon.com/Coaching-Habit-Less-Change-Forever-ebook/dp/B01BUIBBZI/"&gt;The Coaching Habit&lt;/a&gt; flips the script. You must resist the urge to dive into advice-giving mode. You need to &lt;strong&gt;coach your staff to solve their own problems&lt;/strong&gt; and do so effectively. This book's approach only takes a few minutes per day. But you have to actually do.&lt;/p&gt;

&lt;h4&gt;
  
  
  Understanding the different types of coaching
&lt;/h4&gt;

&lt;p&gt;There are two types of coaching:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;coaching for performance&lt;/strong&gt; - how do we solve the problem in front of us as efficiently as possible&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;coaching for development&lt;/strong&gt; - goes beyond solving the immediate problem to development of problem solving skills and confidence in the person experiencing the problem&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Coaching for development pays greater dividends.&lt;/p&gt;

&lt;h3&gt;
  
  
  The seven essential questions
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;What's on your mind?&lt;/li&gt;
&lt;li&gt;And what else?&lt;/li&gt;
&lt;li&gt;What's the real challenge for you here?&lt;/li&gt;
&lt;li&gt;What do you want from me?&lt;/li&gt;
&lt;li&gt;How can I help?&lt;/li&gt;
&lt;li&gt;If you're saying yes to this, what are you saying no to?&lt;/li&gt;
&lt;li&gt;What was most useful to you?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'll briefly describe each question and how to use it below.&lt;/p&gt;

&lt;h3&gt;
  
  
  1 - What's on your mind?
&lt;/h3&gt;

&lt;p&gt;Start with this question. You can prefix the question with: "out of curiosity" to take some of the heaviness out of it and make it easier to answer.&lt;/p&gt;

&lt;p&gt;If you get a vague answer like "the project," you can put the three "Ps" to use by saying that there are three different facets we could look at:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;the project&lt;/strong&gt; - any challenges around the actual content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;the people&lt;/strong&gt; - any challenges with the people involved&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;the patterns&lt;/strong&gt; - if there's a way you're getting in your own way or not showing up in the best way possible&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then you ask "Where would you like to begin?" No matter how the person answers, you are on your way to a deep conversion.&lt;/p&gt;

&lt;h3&gt;
  
  
  2 - And what else?
&lt;/h3&gt;

&lt;p&gt;It buys you time to think and generates options, which is a good thing. It's also more appropriate than just jumping in with the answer.&lt;/p&gt;

&lt;p&gt;Tips for using this question:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stay curious, genuine&lt;/li&gt;
&lt;li&gt;ask the question one more time (3-5 times is usually where you end up)&lt;/li&gt;
&lt;li&gt;recognize success (success is when the person says there is nothing else)&lt;/li&gt;
&lt;li&gt;move on when it's time (if the energy is dropping you can wrap up with a variation: is there anything else?)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Tip: acknowledge the answers you get
&lt;/h4&gt;

&lt;p&gt;Remember to acknowledge the person's answers before moving on to the next "and what else?" to let the person being coached know that you're listening and to encourage them to continue.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fantastic. I like it. Good One&lt;/li&gt;
&lt;li&gt;Nice. Yes, that's good.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Another tip: stop offering advice with a question mark attached
&lt;/h4&gt;

&lt;p&gt;When you've got an answer you want to suggest, ask at least one of the seven essential questions first. Then if you still want to offer your suggestion, you can offer it up as an "option" instead of disguising it as a question. People know you're not really asking a question so don't play games. And offering it as an "option" makes it part of a discussion instead of saying "I think we should do X," which is a conversation killer.&lt;/p&gt;

&lt;h3&gt;
  
  
  3 - What's the real challenge here for you?
&lt;/h3&gt;

&lt;p&gt;When you ask question 1 ("what's on your mind?") you can get three responses that aren't helpful. You can refocus them with "What's the real challenge for you?" You want to get to the real issue and not the first thing that comes to someone's mind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three possible unhelpful responses to this question:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;proliferation of challenges&lt;/strong&gt; - the person says everything that's wrong (often a very long list)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;coaching the ghost&lt;/strong&gt; - the person is complaining about a third party or situation (but you can't coach a person who isn't there so this focusing question will bring the person back to what you &lt;em&gt;can&lt;/em&gt; do for them) &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;abstractions and generalizations&lt;/strong&gt; - if the person is talking about theory and generalizations this focusing question will bring you back to the person at hand and the concrete situation. We're not philosophers, we are just trying to do our jobs.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Tips:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;trust that this process is actually useful (the person you're coaching will never learn anything if you always jump straight in with the answer)&lt;/li&gt;
&lt;li&gt;remember that there's a place for advice. We're just trying to slow things down so everyone can think and giving people the answer immediately is no longer your default setting. But sometimes it is totally appropriate to give someone the answer immediately&lt;/li&gt;
&lt;li&gt;remember the second question: "and what else?" Or "what else is the real challenge for you here?" These questions will help you get past the superficial&lt;/li&gt;
&lt;li&gt;the words "&lt;strong&gt;for you&lt;/strong&gt;" are a kind of magic sauce that cuts through all kinds generalities and hypothetical problems&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Another tip: stick with questions starting with "what" (and avoid questions starting with "why")
&lt;/h4&gt;

&lt;p&gt;"Why" puts people on the defensive. "Why" asks for the backstory. You don't need the "why" if you aren't trying to solve the problem. Whenever you are tempted to ask a "why" question. Reformulate it into a "what" question. For example, "why did you do that?" becomes "what did you hope to accomplish here?"&lt;/p&gt;

&lt;h3&gt;
  
  
  4 - What do you want from me?
&lt;/h3&gt;

&lt;p&gt;It's a powerful question that people are rarely asked so they might not have an answer. Nevertheless, it's an important question. You are not a mind reader and you shouldn't assume that you know what the person being coached wants. &lt;/p&gt;

&lt;p&gt;You should ask the question without fear you might not be able to grant their request. If you can get to what they actually want, at least you're are having a meaningful conversation.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to actually help without taking over someone's initiative
&lt;/h4&gt;

&lt;p&gt;Start by assuming that you are playing lessor versions of yourself at least some of the time. &lt;strong&gt;You are usually bouncing between one of the roles in the drama triangle:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;victim&lt;/strong&gt; - my life is so hard, my life is so unfair, poor me. Nothing's my fault. I feel stuck because I have no power and no influence. I feel useless.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;persecutor&lt;/strong&gt; - I'm surrounded by idiots and fools. It's not my fault, it's theirs. I feel stuck because I don't trust anyone. I feel alone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;rescuer&lt;/strong&gt; - don't fight, don't worry. Let me take it on and fix it. It's my fault, not yours. I feel stuck because my rescuing doesn't work. I feel burdened. Rescuers create more victims the more they take over.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Tip: people are hardwired to look for danger all the time
&lt;/h4&gt;

&lt;p&gt;And if they sense danger they start looking for ways to defend themselves instead of being productive and high functioning. As a manger, it is in your interest to have people feeling safe so that they can perform at their best.&lt;/p&gt;

&lt;p&gt;Here are four factors that influence whether people feel safe (TERA):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T - is for tribe&lt;/strong&gt; - are you on the same team or are you opponents?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E - is for expectation&lt;/strong&gt; - if you know what to expect, you'll feel safer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R - is for rank&lt;/strong&gt; - if I'm relatively more powerful than you, you'll feel less safe&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A - is for autonomy&lt;/strong&gt; - if you get a say in the outcome, you'll feel safer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's your job as a manger to increase the TERA quotient for the person you're talking with. It's good for all parties. You do that by asking the seven essential questions and especially the "what do you want" question. (It also helps to not be a jerk the rest of the time.)&lt;/p&gt;

&lt;h4&gt;
  
  
  Another tip: get used to silence.
&lt;/h4&gt;

&lt;p&gt;Don't immediately fill the void when you ask one of the seven essential questions and don't get an immediate response.&lt;/p&gt;

&lt;h3&gt;
  
  
  5 - How can I help?
&lt;/h3&gt;

&lt;p&gt;You can't avoid the drama triangle. But you can learn to recognize when you're in it and you can get yourself out by asking: "&lt;strong&gt;how can I help?&lt;/strong&gt;" This question is powerful for two reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;it forces the other person to make a specific request, which they might not have thought of before you asked&lt;/li&gt;
&lt;li&gt;it keeps you from assuming you know what's wrong and what the right solution is&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Tip: if someone directly asks for advice you need to resist the urge to provide an answer directly, which will be extremely difficult
&lt;/h4&gt;

&lt;p&gt;Respond by saying "that's a great question. I have some ideas on that, which I'll share. But before I do that, what are your first thoughts?" And when he answers, which he inevitable will, you nod your head and be engaged and interested, and when he finishes you say, "that's terrific. What else could you do?" More nodding, more being interested. Then you say, "this is all good. Is there anything else you could try here?" &lt;/p&gt;

&lt;p&gt;And then, and only then, you could add your own idea to the mix here if you want. And, of course, if the conversation is going well keep asking " and what else?" until he's run out of ideas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use this technique every time you get the urge to jump in, help out, and volunteer&lt;/strong&gt;. And the real insult here--to your time, effort, and good intentions--is that the recipients may not even want or need what you're about to give them.&lt;/p&gt;

&lt;h3&gt;
  
  
  6 - If you're saying yes to this, what are you saying no to?
&lt;/h3&gt;

&lt;p&gt;It's easy to say "yes" to things but it's hard to get them done unless you take something off your plate. So part of saying "yes" is thinking about what you are not going to do while you're doing this.&lt;/p&gt;

&lt;p&gt;Other forms of the question:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What could being fully committed to this idea look like?"&lt;/li&gt;
&lt;li&gt;"What will you say 'no' to, to make this 'yes' rock-solid and real?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are two kinds of "no" to consider. The first type applies to the things that are automatically impossible if you say "yes" to this. For example, if you say "yes" to a meeting tomorrow morning, you can't attend another meeting at the same time.&lt;/p&gt;

&lt;p&gt;The second kind of "no" is what you need now to make the "yes" happen. Pulling off the thing you said "yes" to will take your time, attention, and energy. So how are you going to pull that off? What things are you going to de-prioritize to make sure this "yes" succeeds. You can use the 3P model to cover all the bases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Projects:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What products do you need to abandon or postpone?&lt;/li&gt;
&lt;li&gt;What meetings will you no longer attend?&lt;/li&gt;
&lt;li&gt;What resources do you need to divert to the yes?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;People:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What expectations do you need to manage?&lt;/li&gt;
&lt;li&gt;From what Drama Triangle dynamics will you extract yourself?&lt;/li&gt;
&lt;li&gt;What relationships will you let wither?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Patterns:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What habits do you need to break?&lt;/li&gt;
&lt;li&gt;What old stories or dated ambitions do you need to update?&lt;/li&gt;
&lt;li&gt;What beliefs about yourself do you need to let go of?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Tip: how to say no when you can't
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The secret to saying "no" is to shift the focus and learn how to say "yes" more slowly&lt;/em&gt;&lt;/strong&gt;. Saying "yes" more slowly means being willing to stay curious before committing, which means asking more questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why are you asking me?&lt;/li&gt;
&lt;li&gt;Whom else have you asked?&lt;/li&gt;
&lt;li&gt;When you say this is urgent, what do you mean?&lt;/li&gt;
&lt;li&gt;According to what standard does this need to be completed? By when?&lt;/li&gt;
&lt;li&gt;If I couldn't do all of this, but could just do a part, what part would you have me do?&lt;/li&gt;
&lt;li&gt;What do you want me to take off my plate so I can do this?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Being willing to stay curious will likely provoke one of four responses:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stop asking annoying questions and get on with it. This means that someone in authority has decided you are going to do this and you are expected to comply.&lt;/li&gt;
&lt;li&gt;The person has good answers to your questions, which means he thought this through.&lt;/li&gt;
&lt;li&gt;He doesn't have the answers but will find them and get back to you (or not).&lt;/li&gt;
&lt;li&gt;He might decide that you're too much work for him and ask someone else.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  7 - What was most useful to you?
&lt;/h3&gt;

&lt;p&gt;You can end your coaching session by asking "What was most useful to you?"&lt;/p&gt;

&lt;p&gt;This question has four benefits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;you'll get feedback about how the other person perceived the coaching&lt;/li&gt;
&lt;li&gt;you might plant the idea in the other person's head that these talks are useful to them&lt;/li&gt;
&lt;li&gt;and you create a mini-review to help the person remember what you talked about&lt;/li&gt;
&lt;li&gt;it wraps up the coaching session nicely&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Tip: coaching over email works
&lt;/h4&gt;

&lt;p&gt;When you get an advice request by email, instead of writing a big, long answer, choose the most appropriate of the seven essential questions and ask it.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Wow, there's a lot going on here. What's the real challenge here for you, do you think?"&lt;/li&gt;
&lt;li&gt;"Before I jump into a longer reply, let me ask you: What's the real challenge here for you?"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Additional resources
&lt;/h3&gt;

&lt;p&gt;I've found the following resources about management to be useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Managing-Humans-Humorous-Software-Engineering-ebook/dp/B01J53IE1O/"&gt;Managing Humans: Biting and Humorous Tales of a Software Engineering Manager&lt;/a&gt; by Michael Lopp (book) Practical advice from someone who's been there and lived to tell the tale (also very funny)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Turn-Ship-Around-Turning-Followers-ebook/dp/B00AFPVP0Y/"&gt;Turn the Ship Around!: A True Story of Turning Followers into Leaders&lt;/a&gt; by L. David Marquet (book) This is the amazing and entertaining story of how a first-time submarine commander took over the worst sub in the fleet and made it into the best in 2 years. &lt;em&gt;The Coaching Habit&lt;/em&gt; fills in many of the details of how to actually turn the ship around that were a little thin in this book&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/IzJL8zX3EVk"&gt;Google Talk: Turn the Ship Around&lt;/a&gt; (video) Great intro to the concepts from Marquet's book&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion:
&lt;/h3&gt;

&lt;p&gt;I wrote this blog post because I really needed this book. I'm a problem solver by nature and I've fallen into pretty much every trap discussed in &lt;a href="https://www.amazon.com/Coaching-Habit-Less-Change-Forever-ebook/dp/B01BUIBBZI/"&gt;The Coaching Habit&lt;/a&gt;. The parts of my personality that make me a good programmer tend to make me a mediocre leader/manager, which I expect is probably true for most software developers.&lt;/p&gt;

&lt;p&gt;I haven't mastered everything in &lt;a href="https://www.amazon.com/Coaching-Habit-Less-Change-Forever-ebook/dp/B01BUIBBZI/"&gt;The Coaching Habit&lt;/a&gt; yet (not by a long shot) but I'm trying. And just knowing that my tendency to jump into advice-giving mode isn't helping anybody is important all on its own. I tend not to do that so much anymore and I'll continue working on the rest of it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have you read this book or do you think you might? Is there another management books that was especially helpful to you? I'd love to hear your thoughts in the comments.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Enjoy this post? Please "like" it below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>leadership</category>
      <category>learning</category>
      <category>career</category>
      <category>management</category>
    </item>
    <item>
      <title>29 Must Read Books For Programmers</title>
      <dc:creator>Blaine Osepchuk</dc:creator>
      <pubDate>Wed, 14 Nov 2018 00:19:57 +0000</pubDate>
      <link>https://forem.com/bosepchuk/29-must-read-programming-books-2n45</link>
      <guid>https://forem.com/bosepchuk/29-must-read-programming-books-2n45</guid>
      <description>&lt;p&gt;These are my "must read" programming books. They are universally applicable: you'll benefit from reading them regardless of the kind of programming you do. And the knowledge in these books will remain relevant throughout your career.&lt;/p&gt;

&lt;p&gt;I hope you'll find a couple of good books to add to your reading list here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;June 16, 2019: I'm no longer updating this post. You'll find my most up-to-date list of must read books for programmers (with working links) on my &lt;a href="https://smallbusinessprogramming.com/must-read-programming-books/" rel="noopener noreferrer"&gt;blog&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Career
&lt;/h3&gt;

&lt;p&gt;The first thing you have to figure out, if you haven't done so already, is what kind of career you want and how to get it. This book will help. Actually, it will help anyone get more satisfaction out of their career.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;So Good They Can't Ignore You&lt;/em&gt;&lt;/strong&gt; - Cal Newport (Why follow your passion is bad advice and what you should do instead)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Learn how to learn
&lt;/h3&gt;

&lt;p&gt;Learning new skills is hard. Change is hard. So why not learn how to make new behaviors stick and learning new things easier? These books will help.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;The Power of Habit: Why We Do What We Do in Life and Business&lt;/em&gt;&lt;/strong&gt; - Charles Duhigg (Learn how habits actually work so you can make lasting changes by working with your brain instead of against it)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;The Spirit of Kaizen: Creating Lasting Excellence One Small Step at a Time: Creating Lasting Excellence One Small Step at a Time&lt;/em&gt;&lt;/strong&gt; - Robert Maurer (Kaizen is the practice of making small, continuous improvements. Toyota used it to improve the quality of their cars and become the biggest car maker in the world. You can use it to improve just about anything as this book demonstrates)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Badass: Making Users Awesome&lt;/em&gt;&lt;/strong&gt; - Kathy Sierra (Most people learn inefficiently. This book shows you a better way) (&lt;a href="https://youtu.be/FKTxC9pl-WM" rel="noopener noreferrer"&gt;YouTube summary&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Personal effectiveness
&lt;/h3&gt;

&lt;p&gt;The first three books below are all slightly different takes on the same advice. No matter what your profession or education or task, effective people tend to share a similar mindset and employ similar techniques. Read the book that resonates with you the most. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;The 7 Habits of Highly Effective People: Powerful Lessons in Personal Change&lt;/em&gt;&lt;/strong&gt; - Stephen Covey (a classic)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;The Effective Executive: The Definitive Guide to Getting the Right Things Done&lt;/em&gt;&lt;/strong&gt; - Peter Drucker (another classic)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Great at Work: How Top Performers Do Less, Work Better, and Achieve More&lt;/em&gt;&lt;/strong&gt; - Morten Hansen (a modern take on the genre)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Checklists can be a game changer. I've got tons of them and you should too.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;The Checklist Manifesto: How to Get Things Right&lt;/em&gt;&lt;/strong&gt; - Atul Gawande (Learn the power of simple checklists to improve your performance and reduce errors)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Programming effectiveness
&lt;/h3&gt;

&lt;p&gt;Once you've mastered personal effectiveness, it's time to learn how to be an effective software developer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;The Effective Engineer: How to Leverage Your Efforts In Software Engineering to Make a Disproportionate and Meaningful Impact&lt;/em&gt;&lt;/strong&gt; - Edmond Lau (Gets you focused on the right things)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;The Pragmatic Programmer: From Journeyman to Master&lt;/em&gt;&lt;/strong&gt; - Andrew Hunt and David Thomas (Shows beginners how to apply their craft and level up)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Writing code
&lt;/h3&gt;

&lt;p&gt;I still meet programmers who haven't read these classics. What are you waiting for?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Code Complete: A Practical Handbook of Software Construction, Second Edition&lt;/em&gt;&lt;/strong&gt; - Steve McConnell (Evidence-based recommendations on software construction--&lt;strong&gt;MY BIBLE&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Clean Code: A Handbook of Agile Software Craftsmanship&lt;/em&gt;&lt;/strong&gt; - Robert C Martin (Every programmer in my workplace is paid to read this book. Learn the importance of readability and maintainability and the cost of owning a mess. I agree with almost all of it (except forcing people to write extremely short methods))&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Code Simplicity: The Fundamentals of Software&lt;/em&gt;&lt;/strong&gt; - Max Kanat-Alexander (It's easy to get lost on the theory, opinions, and patterns we are urged to use when creating software. This book puts it all in perspective. It's simply 80 pages of amazing wisdom--&lt;strong&gt;MUST READ&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Software engineering
&lt;/h3&gt;

&lt;p&gt;Despite what most people believe, software engineering does have a body of knowledge backed by research. Don't go against the research and expect your project to turn out okay--it probably won't.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Facts and Fallacies of Software Engineering&lt;/em&gt;&lt;/strong&gt; - Robert Glass (Evidence of what works and what doesn't. If you're breaking any of these rules, you better have a good reason to think the research doesn't apply to you)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Rapid Development: Taming Wild Software Schedules&lt;/em&gt;&lt;/strong&gt; - Steve McConnell (Evidence-based recommendations on project/team management--&lt;strong&gt;MUST READ&lt;/strong&gt;) &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Making Software: What Really Works, and Why We Believe It&lt;/em&gt;&lt;/strong&gt; - Andy Oram &amp;amp; Greg Wilson (I don't love this book. It's written as a bunch of essays and it's kind of long winded and disjointed. However, if you want to avoid doing something foolish, and you've read the other books in this section, give this book a try after)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Leadership
&lt;/h3&gt;

&lt;p&gt;Leadership is a mindset and a set of skills, not a title or position. Anybody can be a leader. As your career progresses and you gain responsibilities, you need to sharpen your leadership skills.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Measure What Matters: How Google, Bono, and the Gates Foundation Rock the World with OKRs&lt;/em&gt;&lt;/strong&gt; - John Doerr (How to get everybody in your organization pulling as hard as they can in the same direction) &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Turn the Ship Around!: A True Story of Turning Followers into Leaders&lt;/em&gt;&lt;/strong&gt; - L. David Marquet (Leader-leader instead of leader-follower. Your organization will perform at the highest levels if everyone is 100% engaged in their job and working towards a common objective. You will learn how to give everyone in your organization the 3 Cs: control, competence, and clarity to make their maximum contribution)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Project management
&lt;/h3&gt;

&lt;p&gt;Just because you're a good coder and you've been around for a while, it doesn't mean you can run a project. Avoid all the beginner mistakes by reading these books. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Rapid Development: Taming Wild Software Schedules&lt;/em&gt;&lt;/strong&gt; - Steve McConnell (Evidence-based recommendations on project/team management--&lt;strong&gt;MUST READ&lt;/strong&gt;) &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Essential Scrum: A Practical Guide to the Most Popular Agile Process&lt;/em&gt;&lt;/strong&gt; - Ken Rubin (Excellent advice on scrum and project management in general. Very high signal-to-noise ratio)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;The Lean Startup: How Today's Entrepreneurs Use Continuous Innovation to Create Radically Successful Businesses&lt;/em&gt;&lt;/strong&gt; - Eric Ries (Learn why building an MVP and using the build-measure-learn cycle is so important)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;The Phoenix Project: A Novel about IT, DevOps, and Helping Your Business Win&lt;/em&gt;&lt;/strong&gt; - Gene Kim &amp;amp; Kevin Behr (Learn how you can apply the Theory of Constraints and Lean to turn around a trouble project (or prevent it from getting into trouble in the first place))&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Advanced project management
&lt;/h3&gt;

&lt;p&gt;Once you've got the basics down and your projects are no longer raging garbage fires, consider learning the advanced project management techniques described in the following books.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;The Principles of Product Development Flow: Second Generation Lean Product Development&lt;/em&gt;&lt;/strong&gt; - Donald Reinertsen (Corrects the errors people naturally make by trying to apply Lean and Six Sigma techniques from the manufacturing world to the product development world--not suitable for beginners)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Goldratt's Theory of Constraints: A Systems Approach to Continuous Improvement&lt;/em&gt;&lt;/strong&gt; - William H. Dettmer (A systematic approach to finding the constraint in your organization and overcoming it. This is a huge lever--not suitable for beginners)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Unit testing
&lt;/h3&gt;

&lt;p&gt;If you're not unit testing yet, what's stopping you? These books will get you started.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Starting to Unit Test: Not as Hard as You Think&lt;/em&gt;&lt;/strong&gt; - Erik Dietrich (A Beginner's guide to unit testing)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Working Effectively with Unit Tests&lt;/em&gt;&lt;/strong&gt; - Jay Fields (Unit testing best practices for people who know the basics)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Working Effectively with Legacy Code&lt;/em&gt;&lt;/strong&gt; - Michael Feathers (Very famous book on getting existing code covered by automated unit tests--a notoriously difficult task)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data analysis and statistics
&lt;/h3&gt;

&lt;p&gt;You need data analysis skills to measure your results. Many programmers lack the statistics knowledge and the skills required to correctly apply statistical tests to data and come up with sound conclusions. These books will help.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Data Analysis with Open Source Tools: A Hands-On Guide for Programmers and Data Scientists&lt;/em&gt;&lt;/strong&gt; - Philipp K. Janert (This is the book you need when your boss dumps a ton of data in your lap and says "find the insights." I love this book)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Any introductory book on statistics. The following books are much better than the textbooks I read in university:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Statistics For Dummies&lt;/em&gt;&lt;/strong&gt; - Deborah Rumsey&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Statistics II for Dummies&lt;/em&gt;&lt;/strong&gt; - Deborah Rumsey&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  User interface/user experience
&lt;/h3&gt;

&lt;p&gt;Most programmers don't pay enough attention to user interfaces and user experience. These books are written for programmers and they'll teach you everything you need to know.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Don't Make Me Think, Revisited: A Common Sense Approach to Web Usability&lt;/em&gt;&lt;/strong&gt; - Steve Krug (amazing!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Rocket Surgery Made Easy: The Do-It-Yourself Guide to Finding and Fixing Usability Problems&lt;/em&gt;&lt;/strong&gt; - Steve Krug (also amazing!)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Wrapping up
&lt;/h3&gt;

&lt;p&gt;So that's my list of "must read" programming books. There's enough material here to keep you busy for a couple of years so please don't think you should read all these books immediately. We already have enough problems with unrealistic expectations in our profession and I don't want to add to them.&lt;/p&gt;

&lt;p&gt;Don't just skim through these books so you can check them off some list either. The important point is to &lt;strong&gt;&lt;em&gt;take as much time as you need to learn a new skill that's important to you&lt;/em&gt;&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;I almost certainly missed some really great books. Feel free to suggest more "must read" books in the comments.&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
      <category>learning</category>
      <category>effectiveness</category>
    </item>
    <item>
      <title>How to be fully alert minutes after waking</title>
      <dc:creator>Blaine Osepchuk</dc:creator>
      <pubDate>Sun, 28 Oct 2018 14:40:26 +0000</pubDate>
      <link>https://forem.com/bosepchuk/how-to-be-fully-alert-minutes-after-waking-lp6</link>
      <guid>https://forem.com/bosepchuk/how-to-be-fully-alert-minutes-after-waking-lp6</guid>
      <description>&lt;p&gt;I use a SAD light as soon as I wake up to go from groggy and useless to fully alert in a couple of minutes. Most mornings I'm sitting at my desk and working within 7 minutes of waking up. It's one hell of a productivity hack.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is sleep inertia?
&lt;/h3&gt;

&lt;p&gt;I used to have a hard time getting up in the morning, especially in the winter. I'd wake up groggy and have to force myself to get out of bed. But getting up, turning on some lights, having a drink of water, and using the bathroom didn't seem to help me get my brain working. Sound familiar?&lt;/p&gt;

&lt;p&gt;Everybody experiences a groggy feeling after they wake from a deep sleep. Scientists call it &lt;a href="https://www.inverse.com/article/50128-how-long-does-it-take-to-wake-up-the-brain"&gt;sleep inertia&lt;/a&gt;. It can last up to 30 minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Coffee won't help
&lt;/h3&gt;

&lt;p&gt;Most people reach for their favorite caffeinated beverage in the morning to help get their brain firing on all cylinders. But it takes caffeine 30-45 minutes to kick in and sleep inertia usually wears off on its own before that happens. Plus, your brain adapts to caffeine, which leads to reduced effectiveness as a stimulant (and possibly dependence).&lt;/p&gt;

&lt;h3&gt;
  
  
  What's a SAD light?
&lt;/h3&gt;

&lt;p&gt;It's a special light therapy device designed to treat &lt;a href="https://en.m.wikipedia.org/wiki/Seasonal_affective_disorder"&gt;seasonal affective disorder&lt;/a&gt;, which is a kind of depression associated with low light levels people experience in the fall and winter.&lt;/p&gt;

&lt;p&gt;Here's the one I have. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DsMXha1r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ze2juh79nfd505qo8dk3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DsMXha1r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ze2juh79nfd505qo8dk3.jpg" alt="my desk with SAD light on"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It puts out 10,000 lux, blocks UV, and the light strikes my eyes from above--all the important characteristics of an effective light therapy device.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can a SAD light treat sleep inertia and/or morning grogginess?
&lt;/h3&gt;

&lt;p&gt;I believe it can. I'm not aware of any studies backing this up but, in my experience, if I spend even a couple of minutes sitting in front of my SAD light, my grogginess completely disappears.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My normal procedure is:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;to wake up at the same time every day (even on weekends)&lt;/li&gt;
&lt;li&gt;get to my desk as fast as I can&lt;/li&gt;
&lt;li&gt;turn on my SAD light and start working. (I work with the bright light shining into my eyes from beside my monitor. I become fully alert almost immediately)&lt;/li&gt;
&lt;li&gt;after an hour I turn it off, have breakfast, and leave it off for the rest of the day&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How I discovered this productivity hack
&lt;/h3&gt;

&lt;p&gt;I used to spend a couple of weeks working outside every summer. I was part of a crew using helicopters to spray herbicide on young forests in northern Alberta, Canada (very fun job). We started our days in the dark so we would be ready to spray as soon as light broke. &lt;/p&gt;

&lt;p&gt;I saw stuff like this every morning.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UOrsYphQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/lm75bdbjgyr92nct4zvi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UOrsYphQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/lm75bdbjgyr92nct4zvi.jpg" alt="August sunrise in northern Alberta"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We napped in the afternoons when it was too windy to spray and then worked until after dark. &lt;/p&gt;

&lt;p&gt;Those were &lt;strong&gt;&lt;em&gt;long&lt;/em&gt;&lt;/strong&gt; days but I noticed that my brain worked surprisingly well as long as I was outside in the daylight. I also noticed that my chronic sleep problems disappeared when I was living and working outdoors. But that they would reappear when I went back to the city and I saw something like this in the mornings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p9s7a_Wq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jycbw6d48z9vugtthykk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p9s7a_Wq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jycbw6d48z9vugtthykk.jpg" alt="my desk with normal room illumination"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So that got me thinking about the level of light in my office compared to outside. I learned that even a very overcast day is still much, much brighter than your average office. That lead me to read the research on seasonal affective disorder. I was fascinated and inspired to do an experiment.&lt;/p&gt;

&lt;p&gt;My theory is that humans are adapted to living outdoors near the equator. Our ancestors woke with the rising of the sun and went to sleep when the sun set. I believe that living indoors and using artificial lights is messing with our circadian system. I also believe that I can help my body figure out what it's supposed to be doing in the morning by exposing myself to some simulated sunlight (when the real stuff isn't available).&lt;/p&gt;

&lt;h3&gt;
  
  
  My wife uses a different kind of light to help her wake up
&lt;/h3&gt;

&lt;p&gt;Interestingly enough, my wife also has trouble getting up in the morning. I bought her a &lt;em&gt;Philips Wake-Up Light Alarm Clock&lt;/em&gt; that simulates the sunrise by slowly turning on a bunch of LEDs for about 20 minutes before her desired wake-up time. She loves it. It's a total game changer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Some warnings before you try this yourself
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;I am not a doctor. And I am not qualified to give medical advice. I'm not telling you what I do. It's up to you and your doctor to figure out what's right and safe for you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Beware of products claiming to be light therapy boxes. There are dozens of them on Amazon and elsewhere. They are completely unregulated and they might not be safe or effective:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dangerous levels of UV light are my biggest concern (you don't want cataracts and/or skin damage)&lt;/li&gt;
&lt;li&gt;they might not work because they aren't bright enough or they emit the wrong frequency of light&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cet.org/bright-light-exposure-risks/"&gt;this is a more complete list of warnings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://www.amazon.com/dp/B002WTCHLC"&gt;light therapy box I bought&lt;/a&gt; was nearly the same one used in a research study that proved that they work for SAD (it's same light from the same company with a different stand). There are much cheaper options out there but I wanted something that was proven to actually work.&lt;/p&gt;

&lt;p&gt;Finally, if you think you might have a sleep or mood disorder, don't self-treat with a light therapy box. Being unusually tired or depressed can be a sign of a serious health problem. If in doubt, get that checked out by your doctor just like I did.&lt;/p&gt;

&lt;h3&gt;
  
  
  Results
&lt;/h3&gt;

&lt;p&gt;I've been using my SAD light for more than 7 years and it helps me work &lt;strong&gt;&lt;em&gt;productively&lt;/em&gt;&lt;/strong&gt; right after I wake up. Without the light box, I struggled to get my brain working for the first half hour of my day, especially when the days are shorter. So if you add that up, I'm more productive for an extra 2.5 hours or more per week.&lt;/p&gt;

&lt;p&gt;I've also experimented with using my SAD light to help me deal with a poor night's sleep. It's helped a little but it's definitely not a cure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional resources
&lt;/h3&gt;

&lt;p&gt;Here are some resources to help you learn more about light therapy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://cet.org/product-light-therapy-lamp-content/"&gt;A great non-technical overview of light therapy&lt;/a&gt; (website)&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.ederma.net/wp-content/uploads/2015/04/Terman-1989-Neuropsychopharm.pdf"&gt;A survey of 29 studies establishing the efficacy of light therapy for SAD&lt;/a&gt; (pdf)&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://day-lights.com/us/light-therapy-news/downloads/light-therapy-wp.pdf"&gt;Research-backed guidelines for the medical uses of light therapy&lt;/a&gt; (pdf)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Takeaways
&lt;/h3&gt;

&lt;p&gt;I've performed experiments on myself with a SAD light to hack my brain and improve my productivity. And I thought my fellow programmers would find that interesting.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have you experimented with light to improve your productivity or influence your mood? If so, what did you learn? If not, would you ever try? Tell me all about your experiences in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>tips</category>
      <category>health</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Want to write defect-free software? Learn the Personal Software Process</title>
      <dc:creator>Blaine Osepchuk</dc:creator>
      <pubDate>Mon, 03 Sep 2018 22:47:44 +0000</pubDate>
      <link>https://forem.com/bosepchuk/want-to-write-defect-free-software-learn-the-personal-software-process-2n2</link>
      <guid>https://forem.com/bosepchuk/want-to-write-defect-free-software-learn-the-personal-software-process-2n2</guid>
      <description>&lt;p&gt;I'm on a journey to &lt;a href="https://smallbusinessprogramming.com/how-i-intend-to-become-a-better-software-developer/"&gt;become a better software developer&lt;/a&gt; by reducing the number of defects in my code. The Personal Software Process (PSP) is one of the few proven ways to achieve ultra-low defect rates. I did a deep dive on it over the last few months. And in this post I'm going to tell you everything you need to know about PSP.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Promise of the Personal Software Process (PSP)
&lt;/h3&gt;

&lt;p&gt;Watts Humphrey, the creator of &lt;a href="https://en.wikipedia.org/wiki/Personal_software_process"&gt;PSP&lt;/a&gt;/&lt;a href="https://en.wikipedia.org/wiki/Team_software_process"&gt;TSP&lt;/a&gt;, makes extraordinary claims for defects rates and productivity achievable by individuals and teams following his processes. He wrote a couple of books on the topic but the one I'm writing about today is &lt;a href="https://www.amazon.com/PSP-Self-Improvement-Process-Software-Engineers/dp/0321305493/"&gt;PSP: A Self-Improvement Process for Software Engineers&lt;/a&gt; (2005).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E9fIgRXK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/y7y09r8l4qw7zcwuyemi.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E9fIgRXK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/y7y09r8l4qw7zcwuyemi.PNG" alt="Software Defects by CMM Level vs the Personal Software Process"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This chart shows a strong correlation between the formality with which software is developed and the number of defects in the delivered software. As you can see, PSP/TSP delivered a shocking 0.06 defects/KLOC, which is about &lt;strong&gt;100 times fewer defects than your average organization&lt;/strong&gt; hovering around &lt;a href="https://en.wikipedia.org/wiki/Capability_Maturity_Model"&gt;CMM level 2&lt;/a&gt; (6.24 defects/KLOC). Impressive, right?&lt;/p&gt;

&lt;p&gt;Humphrey further claims:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Forty percent of the TSP teams have reported delivering defect-free products. And these teams had an average productivity improvement of 78% (Davis and Mullaney 2003). Quality isn't free--it actually pays.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Bottom line: defects make software development slower than it needs to be. If you adopt PSP and get your team to adopt TSP, you can dramatically reduce defects and deliver software faster.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;It seems counter-intuitive but Steve McConnell explains why reducing defect rates actually allows you to deliver software more quickly in this article: &lt;a href="https://stevemcconnell.com/articles/software-quality-at-top-speed/"&gt;Software Quality at Top Speed&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, you can only get those gains if you follow a process like PSP. I'll explain more on that later but I want to take a small detour to tell you a story.&lt;/p&gt;

&lt;h3&gt;
  
  
  Imagine your ideal job
&lt;/h3&gt;

&lt;p&gt;Imagine you work as a software developer for a truly enlightened company--I'm talking about something far beyond Google or Facebook or Amazon or whomever you think is the best at software development right now. &lt;/p&gt;

&lt;h4&gt;
  
  
  You are assigned a productivity coach
&lt;/h4&gt;

&lt;p&gt;Now, your employer cares so much about developer productivity that every software developer in your company is assigned a coach. Here's how it works. Your coach sits behind you and watches you work every day (without being disruptive). He keeps detailed records of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;time spent on each task&lt;/li&gt;
&lt;li&gt;programming tasks are broken down into categories like requirements, requirements review, design, design review, coding, personal code review, testing, peer code review, etc.&lt;/li&gt;
&lt;li&gt;non-programming tasks are also broken down into meaningful categories like meetings, training, administrative, etc.&lt;/li&gt;
&lt;li&gt;defects you inject and correct are logged and categorized&lt;/li&gt;
&lt;li&gt;anything else you think might be useful&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Your coach runs experiments on your behalf
&lt;/h4&gt;

&lt;p&gt;After you go home, your coach runs your work products (requirements, designs, code, documentation, etc.) through several tools to extract even more data such as lines of code added and modified in the case of code. He combines and analyzes additional data from your bug tracker and other data sources into useful reports for your review when the results become statistically significant.&lt;/p&gt;

&lt;p&gt;Your coach's job is to &lt;strong&gt;help you discover how to be the very best programmer you can be&lt;/strong&gt;. So, you can propose experiments and your coach will set everything up, collect the data, and present you with the results. Maybe you want to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;if test-first development works better for you than test-last development?&lt;/li&gt;
&lt;li&gt;are design reviews worth the effort?&lt;/li&gt;
&lt;li&gt;does pair programming work for you?&lt;/li&gt;
&lt;li&gt;do you actually get more done by working more than 40 hours a week?&lt;/li&gt;
&lt;li&gt;are your personal code reviews effective?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those would be the kinds of experiments your coach would be happy to run.  Or your coach might suggest you try an experiment that has been run by several of your colleagues with favorable outcomes. The important point is that your coach is doing all the data collection and analysis for you while you focus on programming.&lt;/p&gt;

&lt;p&gt;Doesn't that sound great? Imagine how productive you could become.&lt;/p&gt;

&lt;h4&gt;
  
  
  Unfortunately this is the real world so you have to be your own coach
&lt;/h4&gt;

&lt;p&gt;This is the essence of the Personal Software Process (PSP). So, &lt;strong&gt;&lt;em&gt;in addition to developing software, you also have to learn statistics, propose experiments, collect data, analyze it, draw meaningful conclusions, and adjust your behavior based on what your experiments reveal&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the Personal Software Process gets right
&lt;/h3&gt;

&lt;p&gt;Humphrey gets to the root of a number of the problems in software development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;projects are often doomed by arbitrary and often impossible deadlines&lt;/li&gt;
&lt;li&gt;the longer a defect is in the project, the more it will cost to fix it&lt;/li&gt;
&lt;li&gt;defects accumulate in large projects and lead to expensive debugging and unplanned rework in system testing&lt;/li&gt;
&lt;li&gt;debugging and defect repair times increase exponentially as projects grow in size&lt;/li&gt;
&lt;li&gt;a heavy reliance on testing is inefficient, time-consuming, and unpredictable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's an overview of his solution:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;The objective, therefore, must be to remove defects from the requirements, the designs, and the code as soon as possible. By reviewing and inspecting every work product as soon as you produce it, you can minimize the number of defects at every stage. This also minimizes the volume of rework and the rework costs. It also improves development productivity and predictability as well as accelerating development schedules&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Humphrey convinced me that he's right about all aspects of the problem. He has data and it's persuasive. However, the prescription--what you need to do to fix the problem--is unappealing, as I'll explain in the next section. &lt;/p&gt;

&lt;h3&gt;
  
  
  Why almost nobody practices the Personal Software Process
&lt;/h3&gt;

&lt;p&gt;PSP is too hard to follow for 99.9% of software developers. The discipline required to be your own productivity coach is beyond what most people can muster, especially in the absence of organizational support and sponsorship. Software development is already demanding work and now you need to add this whole other layer of thinking, logging, data analysis, and behavior changes if you're going to practice the Personal Software Process. &lt;/p&gt;

&lt;p&gt;Most software developers just aren't going to do that unless you hold a gun to their heads. And if you do hold a gun to someone's head PSP won't work at all. They'll just sabotage it or quit.&lt;/p&gt;

&lt;p&gt;Here's a quote from Humphrey's book just to give you a taste for how detailed and process-driven PSP is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The PSP's recommended personal quality-management strategy is to use your plans and historical data to guide your work. That is, start by striving to meet the PQI guidelines. Focus on producing a thorough and complete design and then document that design with the four PSP design templates that are covered in Chapters 11 and 12. Then, as you review the design, spend enough time to find the likely defects. If the design work took four hours, plan to spend at least two, and preferably three, hours doing the review. To do this productively, plan the review steps based in the guidelines in the PSP Design Review Script described in Chapter 9....&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It goes on from there...for about 150 pages. I can see how you could create 'virtually defect-free' software using this kind of process but it's hard for me to imagine a circumstance where you could get a room full of developers to voluntarily adopt such an involved process and apply it successfully.&lt;/p&gt;

&lt;p&gt;But that's not the only barrier to adoption.&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional barriers to adoption
&lt;/h3&gt;

&lt;h4&gt;
  
  
  The Personal Software Process is meant to be taught as a classroom course
&lt;/h4&gt;

&lt;p&gt;The course is prohibitively expensive. So, the book is the only realistic option available to most people.&lt;/p&gt;

&lt;p&gt;You'll find that reading the book, applying the process, figuring out how to fill out all the forms properly, and then analyzing your data all without the help of classmates or an instructor is hard.&lt;/p&gt;

&lt;h4&gt;
  
  
  The book assumes your current process is some version of waterfall
&lt;/h4&gt;

&lt;p&gt;TDD doesn't not play nice with the version of PSP you'll learn in the book. Neither does the process where you write a few lines, compile, run, repeat until you're done. It breaks the stats and the measures you need to compute to get the feedback you require to track your progress. It's not impossible to come up with your own measures to get around these problems but it's definitely another hurdle in your way. &lt;/p&gt;

&lt;p&gt;Languages without a compile phase (python, PHP, etc.) also mess up the stats in a similar way.&lt;/p&gt;

&lt;h4&gt;
  
  
  The chapters on estimating are of little value to agile/scrum practitioners
&lt;/h4&gt;

&lt;p&gt;There's a whole estimating process in PSP that involves collecting data, breaking down tasks, and using historical data to make very detailed estimates about the size of a task that just don't matter that much in the age of agile/scrum. In fact, I didn't see any evidence that the Personal Software Process estimating methods are any better than just getting an experienced group of developers together to play planning poker.&lt;/p&gt;

&lt;h4&gt;
  
  
  It's very difficult to collect good data on a real-world project
&lt;/h4&gt;

&lt;p&gt;If you're going to count defects and lines of code, you need good definitions for those things. And at first glance, PSP seems to have a reasonably coherent answer. But when I actually tried to collect that data I was flooded by edge cases for which I had no good answers. &lt;/p&gt;

&lt;p&gt;For example, a missing requirement caught in maintenance could take one hour to fix or it could take months to fix but you are supposed to record them both as requirement defects and record the fix time. Then you use the arithmetic mean for the fix time in your stats. So that one major missing requirement could completely distort your stats, even if it is unlikely to be repeated.&lt;/p&gt;

&lt;p&gt;Garbage in, garbage out. Very concerning.&lt;/p&gt;

&lt;p&gt;By the way, there's some free software you can use to help you with the data collection and analysis for PSP. It's hasn't been very useful in my experience but it's probably better than the alternative, which is paper forms.&lt;/p&gt;

&lt;h4&gt;
  
  
  Your organization needs to be completely on board
&lt;/h4&gt;

&lt;p&gt;Learning the Personal Software Process is a huge investment. I think I read somewhere that it will take the average developer about 200 hours of devoted study to get proficient with the PSP processes and practices. Not many organizations are going to be up for that. &lt;/p&gt;

&lt;p&gt;PSP/TSP works because the people using it follow a detailed process. But most software development occurs at &lt;a href="https://en.wikipedia.org/wiki/Capability_Maturity_Model"&gt;CMM Level 1&lt;/a&gt; because the whole business is at CMM Level 1. I think it's pretty unlikely that a chaotic business is going to see the value in sponsoring a super-process-driven software development methodology on the basis that it will make the software developers more productive and increase the quality of their software.&lt;/p&gt;

&lt;p&gt;You could argue that the first 'P' in PSP stands for 'personal' and that you don't need any organizational buy-in to do PSP on your own. And that may technically be true but that means you'll have to learn it on your own, practice it on your own, and resist all the organizational pressure to abandon it whenever management decides your project is taking too long.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the Personal Software Process (PSP) a waste of time then?
&lt;/h3&gt;

&lt;p&gt;No, I don't think so. Humphrey nails the problems in software development. And PSP is full of great ideas. The reason most people won't be able to adopt the Personal Software Process--or won't even try--is the same reason people people drop their new year's resolutions to lose weight or exercise more by February: our brains resist radical change. There's a bunch of research behind this human quirk and you can read &lt;a href="https://www.amazon.com/Spirit-Kaizen-Creating-Lasting-Excellence-ebook/dp/B009Q0CQMA/"&gt;The Spirit of Kaizen&lt;/a&gt; or &lt;a href="https://www.amazon.com/Power-Habit-What-Life-Business-ebook/dp/B00564GPKY/"&gt;The Power of Habit&lt;/a&gt; if you want to learn more.&lt;/p&gt;

&lt;p&gt;Humphrey comes at this problem like an engineer trying to make a robot work more efficiently and that's PSP's fatal flaw. Software developers are people, not robots. &lt;/p&gt;

&lt;p&gt;So, here are some ideas for how you can get the benefits from the Personal Software Process (PSP) that are more compatible with human psychology.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Follow the recommendations without doing any of the tracking
&lt;/h4&gt;

&lt;p&gt;Your goal in following PSP is to remove as many defects as possible as soon as possible. You definitely don't want any errors in your work when you give it to another person for peer review and/or system testing. Humphrey recommends written requirements, personal requirements review, written designs, personal design reviews, careful coding in small batches, personal code reviews, the development and use of &lt;a href="https://smallbusinessprogramming.com/code-review-checklist-prevents-stupid-mistakes/"&gt;checklists&lt;/a&gt;, etc. &lt;/p&gt;

&lt;p&gt;You can do all that stuff without doing the tracking. He even recommends ratios of effort for different tasks that you could adopt. Will that get you to 0.06 defects/KLOC? No. But you might get 80% of the way there for 20% of the effort.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Adopt PSP a little bit at a time
&lt;/h4&gt;

&lt;p&gt;To get around the part of your brain that resists radical change, you could adopt PSP over many months. Maybe you just adopt the recommendations from one chapter every month or two. Instead of investing 200 hours up front, you could start with 5-10 hours and see how that goes.&lt;/p&gt;

&lt;p&gt;Or you could just track enough data to prove to yourself that method A is better than method B. And once you're satisfied, you could drop the tracking altogether. For example, if you wanted to know if personal design reviews are helpful for you, you don't need to do all the PSP tracking all the time. You could just setup an experiment where you could choose five tasks as controls and five tasks for design reviews and run that for a week or two, stop tracking, and then decide which design review method to adopt based on what you learn.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Read the PSP book and then follow a process with a better chance of succeeding in the long run
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/Rapid-Development-Devment-Developer-Practices-ebook/dp/B00JDMPOB6/"&gt;Rapid Development&lt;/a&gt; by Steve McConnell is all about getting your project under control and delivering working software faster. McConnell, unlike Humphrey, doesn't ignore human psychology. In fact, he embraces it. I believe most teams would follow McConnell's advice long before they'd consider adopting the Personal Software Process (PSP). &lt;/p&gt;

&lt;p&gt;Most of the advice in Rapid Development is aimed at the team or organization instead of the individual, which I think it the correct focus. PSP is aimed at the individual but I can't see how you're going to get good results with it unless nearly everyone working on your project uses it. For example, if everyone on your team is producing crappy software as quickly as they can, your efforts to produce defect-free software won't have much effect on the quality or delivery date of the finished software.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I'm going to do
&lt;/h3&gt;

&lt;p&gt;I develop e-commerce software on a team of two. My colleague and I have adopted a number of processes to ensure only high quality software makes it into production. And we've been successful at that; we've only had 4 critical (but easily fixed) defects and a handful of minor defects make it into production in the last year. Our problem is that we have quite a bit of rework because too many defects are making to the peer code review stage.&lt;/p&gt;

&lt;p&gt;I showed my colleague PSP and he wasn't excited to adopt it, especially all the tracking. But he was willing to add design reviews to our process. So we'll start there and improve our processes in little steps at our retrospectives--just like we've been doing. &lt;/p&gt;

&lt;p&gt;Rod Chapman recorded a nice talk on &lt;a href="https://youtu.be/nWScAkGn-zw"&gt;PSP&lt;/a&gt; and I like his idea of "moving left". If you want go faster and save more money you should move your QA to the left--or closer to the beginning--of your development process. That sounds about right to me.&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional resources
&lt;/h3&gt;

&lt;p&gt;Here are some resources to help you learn more about PSP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/nWScAkGn-zw"&gt;Nice overview of PSP&lt;/a&gt; by Rod Chapman (video)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/4GFqodvsugY"&gt;Watts Humphrey speaking about TSP/PSP&lt;/a&gt; (video)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pdfs.semanticscholar.org/86b9/16e062217867543889fc2c487ac368414698.pdf"&gt;A PSP case study supporting PSP&lt;/a&gt; (pdf)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.researchgate.net/profile/Karlheinz_Kautz/publication/258223987_Improving_Software_Developer%27s_Competence_Is_the_Personal_Software_Process_Working/links/54bda13f0cf218da9391b500/Improving-Software-Developers-Competence-Is-the-Personal-Software-Process-Working.pdf?origin=publication_detail"&gt;Research paper that casts doubt on the benefits of PSP&lt;/a&gt; (pdf)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/PSP-Self-Improvement-Process-Software-Engineers/dp/0321305493/"&gt;PSP: A Self-Improvement Process for Software Engineers&lt;/a&gt; (book)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://smallbusinessprogramming.com/where-to-find-the-psp-programming-exercises/"&gt;Link to the programming exercises for the book&lt;/a&gt; (website)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.processdash.com/"&gt;Process Dashboard&lt;/a&gt; - a PSP support tool (website)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Takeaways
&lt;/h3&gt;

&lt;p&gt;It's tough to recommend the Personal Software Process (PSP) unless you are building safety-critical software or you've got excellent organizational support and sponsorship for it. Most developers are just going to find the Personal Software Process overwhelming, frustrating, and not very compatible with the demands of their jobs.&lt;/p&gt;

&lt;p&gt;On the other hand, PSP is full of good ideas. I know most of you won't adopt it. But that doesn't preclude you from using some of the ideas from PSP to improve the quality of your software. I outlined three alternate paths you could take to get some of the benefits of PSP without doing the full Personal Software Process (PSP). I hope one of those options will appeal to you. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have you ever tried PSP? Would you ever try PSP? I'd love to hear your thoughts in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>codequality</category>
      <category>learning</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why I can't recommend Clean Architecture by Robert C Martin</title>
      <dc:creator>Blaine Osepchuk</dc:creator>
      <pubDate>Mon, 23 Jul 2018 14:44:20 +0000</pubDate>
      <link>https://forem.com/bosepchuk/why-i-cant-recommend-clean-architecture-by-robert-c-martin-ofd</link>
      <guid>https://forem.com/bosepchuk/why-i-cant-recommend-clean-architecture-by-robert-c-martin-ofd</guid>
      <description>&lt;p&gt;&lt;em&gt;Clean Architecture&lt;/em&gt; failed to meet my expectations on a number of fronts. Despite Mr. Martin's obvious passion for the topic, &lt;em&gt;Clean Architecture&lt;/em&gt; is poorly organized, lacks examples, and is silent on working with existing systems. The author missed a major opportunity to teach us when and how to apply these lessons to our own systems. Let me explain.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Clean Architecture&lt;/em&gt; is a poorly organized book
&lt;/h3&gt;

&lt;p&gt;This book takes a long time to get going. The chapters on design paradigms (structured, object oriented, and functional) seem particularly out of place and unnecessary.&lt;/p&gt;

&lt;p&gt;The chapters on the SOLID principles are good. I enjoyed seeing the principles broken down and explained well. And I found it interesting to think about their applicability to system architecture. But Uncle Bob presents the SOLID principles like hard rules, which rubbed me the wrong way. In fact, I'm pretty sure a system that &lt;strong&gt;&lt;em&gt;never&lt;/em&gt;&lt;/strong&gt; violated the SOLID principles would be a giant mess.&lt;/p&gt;

&lt;p&gt;However, this paragraph from page 137 is important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The primary purpose of architecture is to support the life cycle of the system. Good architecture makes the system easy to understand, easy to develop, easy to maintain, and easy to deploy. The ultimate goal is to minimize the lifetime cost of the system and to maximize programmer productivity.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's a great observation. Why didn't Uncle Bob put it in the first chapter?&lt;/p&gt;

&lt;h3&gt;
  
  
  Not enough examples
&lt;/h3&gt;

&lt;p&gt;There are hardly any examples in this book. Chapter 33 contains an example that discusses a video sales e-commerce application. It's okay. But I didn't walk away from it with a firm idea of how I'd apply the concepts to my own systems.&lt;/p&gt;

&lt;p&gt;The appendix tells the story of how Uncle Bob came up with the SOLID principles and the rules of clean architecture. It's loaded with examples of past projects. I think it's the &lt;strong&gt;most interesting section&lt;/strong&gt; of the book.&lt;/p&gt;

&lt;h3&gt;
  
  
  The book is silent on improving the architecture of existing systems
&lt;/h3&gt;

&lt;p&gt;Most developers spend most of their time working on existing systems. So, I expected &lt;em&gt;&lt;a href="https://www.amazon.com/Clean-Architecture-Craftsmans-Software-Structure/dp/0134494164/" rel="noopener noreferrer"&gt;Clean Architecture&lt;/a&gt;&lt;/em&gt; to be full of advice on improving existing systems. But the book is conspicuously silent on the subject.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to create a clean architecture?
&lt;/h3&gt;

&lt;p&gt;In the first half of the book you'll learn that you create a clean architecture by following the SOLID principles to break your system into components along your system boundaries (I'm paraphrasing). If you stopped reading there, you could be forgiven for having the impression that Uncle Bob would not approve of whatever you've been doing for architecture. You could also be forgiven for thinking that the few options he presents are the "right" way to do things. Yet towards the end of the book you'll read this on page 228:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This example is intended to show that architectural boundaries exist everywhere. We, as architects, must be careful to recognize when they are needed. We also have to be aware that such boundaries, when fully implemented, are expensive.&lt;/p&gt;

&lt;p&gt;At the same time, we have to recognize that when such boundaries are ignored, they are very expensive to add in later—even in the presence of comprehensive test-suites and refactoring discipline.&lt;/p&gt;

&lt;p&gt;So what do we do, we architects? The answer is dissatisfying. On the one hand, some very smart people have told us, over the years, that we should not anticipate the need for abstraction. This is the philosophy of YAGNI: "You aren’t going to need it." There is wisdom in this message, since over-engineering is often much worse than under-engineering. On the other hand, when you discover that you truly do need an architectural boundary where none exists, the costs and risks can be very high to add such a boundary.&lt;/p&gt;

&lt;p&gt;So there you have it. O Software Architect, you must see the future. You must guess—intelligently. You must weigh the costs and determine where the architectural boundaries lie, and which should be fully implemented, and which should be partially implemented, and which should be ignored.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So more than half way through the book he says that it is up to us to decide where we should put the boundaries in our systems. And that boundaries are potentially everywhere. Confusing, right?&lt;/p&gt;

&lt;h3&gt;
  
  
  What this book is missing
&lt;/h3&gt;

&lt;p&gt;So, if the ultimate goal of software architecture is to minimize the lifetime cost of the system, shouldn't a book on architecture help an architect make those decisions?&lt;/p&gt;

&lt;h4&gt;
  
  
  Unanswered questions
&lt;/h4&gt;

&lt;p&gt;This book left me with a lot of unanswered questions. Where is the discussion of the economics of the various options? How do I find the optimum architecture for my system? Where's the research?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw5ytqh3vdwtxyyigbbr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw5ytqh3vdwtxyyigbbr.jpg" alt="unanswered questions" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How do I decide if horizontal layering or vertical slicing or something else will minimize the lifetime cost of my system? Or if I have no clearly defined layers, how do I decide which, if any, layering strategy will minimize my lifetime costs?&lt;/p&gt;

&lt;p&gt;I have even more questions. Where should you put your effort if you have a limited amount of time to improve the architecture of an existing system? Is separating the database from the business logic is always a good idea? Which advice should you always follow? Which advice depends on the system?&lt;/p&gt;

&lt;h4&gt;
  
  
  Details that would have made &lt;em&gt;Clean Architecture&lt;/em&gt; more valuable
&lt;/h4&gt;

&lt;p&gt;In &lt;em&gt;&lt;a href="https://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/" rel="noopener noreferrer"&gt;Code Complete&lt;/a&gt;&lt;/em&gt;, Steve McConnell talks about the tradeoffs between different non-functional requirements like reliability, dependability, correctness, maintainability, readability, etc. He explains how some requirements move together and others conflict. I would have loved to see something like that for the architecture decisions discussed in this book.&lt;/p&gt;

&lt;p&gt;In &lt;em&gt;Clean Architecture&lt;/em&gt;, project size, team size, the consequences of project failure, expected code lifetime, and other important factors are under-emphasized as drivers of architecture. For example, Healthcare.gov needs more architecture than the personal to-do list you are developing, even though they are both web apps backed by databases.&lt;/p&gt;

&lt;h3&gt;
  
  
  What this book is really about
&lt;/h3&gt;

&lt;p&gt;I spent the majority of this book slightly confused. I kind of understood what Uncle Bob was trying to say. But didn't completely get it until I read the appendix. So, let me save you some time.&lt;/p&gt;

&lt;h4&gt;
  
  
  An example
&lt;/h4&gt;

&lt;p&gt;Imagine you are building a desktop computer for the consumer market (office computers for example). You get to choose the hardware and you are going to write the software for the whole thing (firmware, OS, drivers, applications, everything).&lt;/p&gt;

&lt;h4&gt;
  
  
  Would you write a monolith?
&lt;/h4&gt;

&lt;p&gt;How would you go about it? Would you write a giant program (a monolith) where the code for the spreadsheet knew about the kind of disk you selected for your computer? Can you imagine updating the spreadsheet code and adding 'if' statements everywhere so that it does one thing if you have a SATA drive and another if you have a SCSI drive? And then doing the same thing for VGA vs DVI vs HDMI video? What about different paths for PS/2 vs USB mouse input? And then repeat the process for the word processor and all the other applications you intend to bundle with your computer?&lt;/p&gt;

&lt;p&gt;That would be a nightmare to maintain, right? So what's the solution? Architecture! Your spreadsheet shouldn't know what kind of mouse you're using. Nor what kind of display you have. It should be completely oblivious to those details.&lt;/p&gt;

&lt;h4&gt;
  
  
  Boundaries in your computer
&lt;/h4&gt;

&lt;p&gt;And that's what you'll find if you look at your computer. There's embedded software in your mouse that communicates with your operating system. Yet the details are hidden from your applications. Your spreadsheet accepts standardized input without knowing or caring what kind of mouse you are using. Then when someone invents a new input device like the touchpad it works with your spreadsheet automatically.&lt;/p&gt;

&lt;p&gt;That's just one of the boundaries in your computer. You'll likely come up with hundreds of them. You might assign different teams to work on different parts of the system. You might create or adopt different specs for the various ways the different components interact.&lt;/p&gt;

&lt;p&gt;You're probably saying 'duh' at this point. It's obvious that you wouldn't want to change and recompile your spreadsheet every time your hardware changes. Maintenance would be a nightmare. And I agree.&lt;/p&gt;

&lt;h4&gt;
  
  
  Boundaries are your friend (if you use them correctly)
&lt;/h4&gt;

&lt;p&gt;It's easy to see hardware boundaries. But the same logic that makes hardware boundaries worthwhile also applies to software boundaries. Software boundaries are just harder to see.&lt;/p&gt;

&lt;p&gt;So, you might start with the ability to display the spreadsheet on the screen. But you might also want to save it to disk, save it to PDF, save it as a CSV, or print it. So, maybe one of the boundaries in your spreadsheet program is to have an internal data structure that represents each spreadsheet. And then you pass that structure to different code to display, save, or print it in the desired format.&lt;/p&gt;

&lt;p&gt;If you keep the data structure completely unaware of how it is displayed, saved, or printed, then you can add a "save to XML" feature down the road without digging through all the code related to the spreadsheet data structure. And if that spreadsheet data structure is several million lines of code, you can imagine how much easier that would be.&lt;/p&gt;

&lt;p&gt;That's all Uncle Bob is trying to tell us in this book. &lt;strong&gt;You can use the SOLID principles to create boundaries in your systems that hide your implementation details, reduce complexity, and help you reduce the total lifecycle cost of your systems&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  A better software architecture book
&lt;/h3&gt;

&lt;p&gt;In many ways, &lt;em&gt;&lt;a href="https://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420/" rel="noopener noreferrer"&gt;Patterns of Enterprise Application Architecture&lt;/a&gt;&lt;/em&gt; by Martin Fowler is far superior to &lt;em&gt;Clean Architecture&lt;/em&gt;. Fowler describes the patterns he's observed repeatedly in enterprise applications. He gives a simple example if each pattern, describes how it works, and where to use it. I found &lt;em&gt;Patterns of Enterprise Application Architecture&lt;/em&gt; to be very readable and applicable to my systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Takeaways
&lt;/h3&gt;

&lt;p&gt;There is valuable information in &lt;em&gt;Clean Architecture&lt;/em&gt; but you have to work to find it.&lt;/p&gt;

&lt;p&gt;I found the chapter on embedded software one of the easiest to understand. It intuitively makes sense to avoid scattering low-level calls throughout your code base. And it also makes sense to make your logic testable in the absence of the hardware (especially since embedded software is often developed before the hardware is available). If you could only read two chapters of this book, I'd recommend you make it this one and the appendix, regardless of what kind of software you write for a living.&lt;/p&gt;

&lt;p&gt;Overall, &lt;em&gt;Clean Architecture&lt;/em&gt; is a tough read and Uncle Bob left me with more questions than answers. I definitely wouldn't recommend this as your first book on software architecture (check out &lt;em&gt;&lt;a href="https://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420/" rel="noopener noreferrer"&gt;Patterns of Enterprise Application Architecture&lt;/a&gt;&lt;/em&gt; by Martin Fowler instead).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Agree or disagree. I'd love to hear your thoughts.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Enjoy this post? Please "like" it below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>learning</category>
      <category>career</category>
      <category>books</category>
    </item>
    <item>
      <title>How I intend to become a better software developer</title>
      <dc:creator>Blaine Osepchuk</dc:creator>
      <pubDate>Tue, 22 May 2018 13:57:09 +0000</pubDate>
      <link>https://forem.com/bosepchuk/how-i-intend-to-become-a-better-software-developer-2pjp</link>
      <guid>https://forem.com/bosepchuk/how-i-intend-to-become-a-better-software-developer-2pjp</guid>
      <description>&lt;p&gt;My survey of the computer science literature suggests there are only two economical ways to achieve extremely low defect rates (&amp;lt; 1 defect per KLOC). The first way is to follow the Personal Software Process (PSP), which was created by Watts S. Humphrey at CMU. The second way is to use languages and tools that make it difficult to introduce errors into your code in the first place and easier to detect errors if you do manage to get some into your code. In this post I'm going to briefly discuss these two options and how I plan to explore them to become a better software developer.&lt;/p&gt;

&lt;p&gt;But first, why do I want to do this? Because my experience building and maintaining software roughly tracks the data coming out of the research: defect-riddled code and all the testing, debugging, correcting, and rework that go along with it are incredibly wasteful. Our industry is &lt;a href="http://catless.ncl.ac.uk/Risks/" rel="noopener noreferrer"&gt;overflowing with failure&lt;/a&gt;. There's got to be a better way.&lt;/p&gt;

&lt;p&gt;I've already written at length on &lt;a href="https://smallbusinessprogramming.com/working-on-the-most-important-thing/" rel="noopener noreferrer"&gt;working on the most important thing&lt;/a&gt;, &lt;a href="https://smallbusinessprogramming.com/worthless-software-risks-prevention/" rel="noopener noreferrer"&gt;avoiding waste&lt;/a&gt;, &lt;a href="https://smallbusinessprogramming.com/code-review-checklist-prevents-stupid-mistakes/" rel="noopener noreferrer"&gt;code review checklists&lt;/a&gt;, &lt;a href="https://smallbusinessprogramming.com/optimal-pull-request-size/" rel="noopener noreferrer"&gt;optimal pull request size&lt;/a&gt;, and so forth. So, in this post, I'm going to focus solely on what it takes to produce software with very low defect rates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Personal Software Process
&lt;/h3&gt;

&lt;p&gt;PSP might best be described as the application of lean manufacturing principles to the activities of an individual developer. Programmers tend have poor insight into the various ways they make mistakes and create waste. They make the same mistakes over and over again and think they are awesome (me included). But the truth is that you are the one who is putting all those errors into your code, writing complicated code, writing unmaintainable code, and so on.&lt;/p&gt;

&lt;p&gt;PSP teaches programmers how to track their work and their mistakes. And it provides programmers with strategies they can use to improve their performance over time. From what I hear, people who follow this process can improve dramatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better languages and tools
&lt;/h3&gt;

&lt;p&gt;It's very difficult to write correct code in most languages. They're ambiguous and they allow programmers to do things that are almost certainly errors. Things get more interesting when you switch to a safer language like Ada and/or its ultra-safe subset called SPARK. This fits very well with my idea that &lt;a href="https://smallbusinessprogramming.com/software-security-is-hopelessly-broken/" rel="noopener noreferrer"&gt;programming languages need to become significantly safer by default&lt;/a&gt; if we're ever going to improve software security.&lt;/p&gt;

&lt;h4&gt;
  
  
  Ada
&lt;/h4&gt;

&lt;p&gt;Let's talk about Ada first. Strong typing, ranged types, contracts, and a really smart compiler help you avoid the stupid errors that languages like C/C++ and their derivatives ignore. So, if you choose to program in Ada, you're going to have an easier time detecting and localizing defects that you wouldn't even notice with another language. &lt;/p&gt;

&lt;h4&gt;
  
  
  SPARK
&lt;/h4&gt;

&lt;p&gt;If you want to take things to another level, you can look into using SPARK, which is a subset of Ada that can apply formal methods to your code. &lt;/p&gt;

&lt;p&gt;I know it sounds scary but I've been playing around with SPARK and I think it's awesome. First off, you don't need to know or do any serious math to use SPARK. SPARK can prove (or at least attempt to prove) your Ada contacts and type constraints automatically. If you just stopped right there, SPARK basically acts like that best static analyzer you've ever seen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fmmqhvcqiod957kreyncz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fmmqhvcqiod957kreyncz.jpg" alt="accurate measurement"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But you can go further. You can add assertions to your code and SPARK will attempt to statically prove that they will never be violated. How far you go is up to you but you can get your code--or some important parts of it--to the point that SPARK can demonstrate an absence of run-time errors. That means it can't crash from overflows, divide by zero, etc. &lt;/p&gt;

&lt;p&gt;Why would you want to do that? Four reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Just like with TDD, writing your code in a way that SPARK can prove results in really well designed, simple, easy to read code. &lt;/li&gt;
&lt;li&gt;If SPARK is guaranteeing that whole class of errors can't happen, you don't need to write tests for as many paths through your code. &lt;/li&gt;
&lt;li&gt;There's a strong correlation between absence of run-time errors and the absence of logical errors. That means that code proved by SPARK tends to have fewer logical errors than code that hasn't been proved with SPARK. &lt;/li&gt;
&lt;li&gt;Once you understand what SPARK can do, you can stop thinking about those things when you are coding. It's similar to the way you don't have to agonize about your spelling when you write an email because the spell checker handles that for you. It's really impressive when you see it in action.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Just a word of warning
&lt;/h4&gt;

&lt;p&gt;There's not much information on the web about Ada/SPARK (compared to more popular languages). And much of what's out there is outdated or just wrong. Both Ada and SPARK went through major changes in their latest releases that addressed some real pain points. Plus, Moore's law has made compiling and proving the correctness of your software orders of magnitude faster than they used to be.&lt;/p&gt;

&lt;h3&gt;
  
  
  My plan
&lt;/h3&gt;

&lt;p&gt;I'm already experimenting with Ada and SPARK. This kind of programming is a little different than I'm used to but I found some good resources and things are starting to click (see resources below). I plan to build a few toy applications with Ada/SPARK solidify my learning. &lt;/p&gt;

&lt;p&gt;For a bunch of reasons I won't go into here, it's unlikely that Ada will ever be a mainstream language. So, I'm not under any delusions that I'll get to write production code in it any time soon. But, I can already see that some of the concepts can be applied to any programming language with very little effort. And I'm looking forward to using some of those ideas to improve my code at my day job.&lt;/p&gt;

&lt;p&gt;As for PSP, I ordered the book &lt;a href="https://www.amazon.com/PSP-Self-Improvement-Process-Software-Engineers/dp/0321305493/" rel="noopener noreferrer"&gt;PSP: A Self Improvement Process For Software Engineers&lt;/a&gt; by Watts S. Humphrey and I plan to work through it and the accompanying programming exercises straight away. PSP is language agnostic so if you're interested in upping your game immediately, you might want to start with PSP and explore Ada/SPARK later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update: 2018-09-03:&lt;/strong&gt;&lt;br&gt;
I've been studying PSP for the last few months and I've written a &lt;a href="https://smallbusinessprogramming.com/want-to-write-defect-free-software-learn-the-personal-software-process/" rel="noopener noreferrer"&gt;summary&lt;/a&gt; of what I've learned so far.&lt;/p&gt;

&lt;h3&gt;
  
  
  Takeaways
&lt;/h3&gt;

&lt;p&gt;Both PSP and Ada/SPARK are more prominent in the safety-critical, mission-critical, and high security sides of our profession. I've never heard any of the web development gurus mention this stuff so, I have no idea how well these tools will apply to my day job as a back-end ecommerce developer. My guess is that almost anything I can do to prevent defects from getting into our code base will be worth doing. &lt;/p&gt;

&lt;p&gt;The research is very clear on &lt;a href="https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20100036670.pdf" rel="noopener noreferrer"&gt;the rising costs of fixing defects in the later stages of the development lifecycle&lt;/a&gt;. So, I can give up some speed on coding to save time on testing, debugging, and unplanned rework. The trick will be finding the sweet spot.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Would you ever consider learning PSP or Ada/SPARK? I'd love to hear your ideas in the comments.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How to achieve ultra-low defect rates:&lt;/strong&gt;&lt;br&gt;
Paper: &lt;a href="https://proteancode.com/wp-content/uploads/2018/02/the_fumble_programmer.pdf" rel="noopener noreferrer"&gt;The Fumble Programmer&lt;/a&gt; by Rod Chapman&lt;br&gt;
Video: &lt;a href="https://youtu.be/ruuZVFbRlr4" rel="noopener noreferrer"&gt;Murphy vs Satan: Why Programming secure systems is still hard&lt;/a&gt; by Rod Chapman&lt;br&gt;
Should we trust computers? (&lt;a href="https://youtu.be/qZrHVXxIOCA" rel="noopener noreferrer"&gt;video&lt;/a&gt; or &lt;a href="https://s3-eu-west-1.amazonaws.com/content.gresham.ac.uk/data/binary/36/20Oct15MartynThomas_ShouldweTrust.docx" rel="noopener noreferrer"&gt;word doc&lt;/a&gt;) by Martyn Thomas&lt;br&gt;
Making Software Correct by construction (&lt;a href="https://youtu.be/03mUs5NlT6U" rel="noopener noreferrer"&gt;video&lt;/a&gt; or &lt;a href="https://s3-eu-west-1.amazonaws.com/content.gresham.ac.uk/data/binary/2464/2017-05-02-MartynThomas_MakingSoftware.docx" rel="noopener noreferrer"&gt;word doc&lt;/a&gt;) by Martyn Thomas&lt;br&gt;
Safety-Critical Systems (&lt;a href="https://youtu.be/E0igfLcilSk" rel="noopener noreferrer"&gt;video&lt;/a&gt; or &lt;a href="https://s3-eu-west-1.amazonaws.com/content.gresham.ac.uk/data/binary/2360/2017-01-10-MartynThomas_SafetyCritical.docx" rel="noopener noreferrer"&gt;word doc&lt;/a&gt;) by Martyn Thomas&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn PSP:&lt;/strong&gt;&lt;br&gt;
Book: &lt;a href="https://www.amazon.com/PSP-Self-Improvement-Process-Software-Engineers/dp/0321305493/" rel="noopener noreferrer"&gt;PSP: A Self Improvement Process For Software Engineers&lt;/a&gt; by Watts S. Humphrey&lt;br&gt;
Video: &lt;a href="https://youtu.be/4GFqodvsugY" rel="noopener noreferrer"&gt;An Introduction to PSP&lt;/a&gt; by Watts S. Humphrey&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn Ada/SPARK:&lt;/strong&gt;&lt;br&gt;
Pluralsight Course: &lt;a href="https://www.pluralsight.com/courses/ada-2012-introduction" rel="noopener noreferrer"&gt;An Introductions to Ada 2012&lt;/a&gt;&lt;br&gt;
Contract-Based Programming in Ada 2012 (&lt;a href="https://ftp.osuosl.org/pub/fosdem/2018/AW1.125/ada_contracts.webm" rel="noopener noreferrer"&gt;video&lt;/a&gt; or &lt;a href="http://www.jacob-sparre.dk/reliability/Contract-based-programming-2014.pdf" rel="noopener noreferrer"&gt;slides&lt;/a&gt;) by Jacob Sparre Andersen&lt;br&gt;
Website: &lt;a href="http://www.inspirel.com/articles/Ada_On_Cortex.html" rel="noopener noreferrer"&gt;Introduction to embedded programming with Ada&lt;/a&gt;&lt;br&gt;
Book: &lt;a href="https://www.amazon.com/Building-High-Integrity-Applications-SPARK/dp/1107656842/" rel="noopener noreferrer"&gt;Building High Integrity Applications with SPARK&lt;/a&gt; by John W. McCormick and Peter C. Chapin&lt;br&gt;
Website: &lt;a href="http://www.adaic.org/" rel="noopener noreferrer"&gt;Ada Information Clearinghouse&lt;/a&gt;&lt;/p&gt;

</description>
      <category>professionalism</category>
      <category>learning</category>
      <category>programming</category>
      <category>career</category>
    </item>
  </channel>
</rss>
