The High Cost of Burnout

Most developers have tasted the adrenaline fueled excitement of jamming acts of coding magic into incredibly tight deadlines.  It can be exhilerating to test your skills under pressure and come out the other side proud of what you’ve managed to pull off.  But unfortunately, what starts as a big push to meet a deadline or satisfy a customer can often turn into a Battan death march of one unreasonable deadline after another.  All to often developers tend to sacrifice family or social lives to meet these goals only to find that instead of crossing a finish line we just passed another starting gate.  Do this long enough and you reach burnout, a deep black state of mind where no customer issue is important anymore and no deadline really matters.

As a developer the signs of burnout aren’t often easy to see.  When working long hours, weekends, and having no social life become the norm you don’t always realize that you’re missing out.  And if everybody in your team is doing the same thing, then you certainly don’t want to be the Prima Donna who complains, right?  In fact, it’s often the people outside our work lives who clue us in that somethings wrong.  Spouses, friends, and relatives usually see the signs before we do but they don’t always know how to tell us and let’s be honest, we don’t always listen.

Eventually though, we start to get clued into the fact that something is fundamentally wrong here.  Not with us of course, but with those idiots in management who keep giving us crazy deadlines.  Or with the other members of your team who if they only pulled their own weight, you could take a day off once in a while.  The cause is almost never seen as coming from us, we are simply reacting to outside forces.  This I’m sorry to say is mostly bull.

After working for six weeks straight without a single day off, including Saturday and Sunday, I received a warning from a colleague.  “Eventually”, he said, “there will be be nothing the company can do to compensate you enough to keep you happy”.  What he was speaking of specifically is that at some point, I’m going to look back and feel that no  promotion or bonus was worth the long hours and time away from family I was going through, and then I would have no choice but to quit.  Quit caring about my project, quit pushing to be a better developer, and eventually just quit my job outright. 

Quitting is the ultimate cost of burnout.

As a manager I’ve also seen the high cost of burnout, not in myself but in suddenly having to deal with a project where a key resource has flamed out and walked off.  In some cases, this happens with the resources we most depend on because they are the ones who most often willing to accept the ever tightening deadlines or ever increasing scope.  They don’t cry out for help when they should and we don’t notice the stress fractures until it’s too late.

So how do you avoid burnout in the face of impossible deadlines and crushing management pressure?  Here are a few tips…

  1. Make a schedule and stick to it.  A big part of burnout is caused by the feeling of pressure with all of the things we have to do in a day shuffing through your brain and bouncing off the walls.  Just write them down as they come to you and then schedule specific times of the day for each category or task.  Doing this, you’ll find that those random thoughts don’t cause the sensation of pressure they once did because you now have a place to put them.  Even if the end result is merely confirmation of the fact that you don’t have enough hours in the day, you at least are able to know what will fit and what won’t.
  2. Schedule in time for a life.  Take the time you need to keep the rest of your life working.  If you like movies, schedule in a weekly movie trip.  If, like me, you are married schedule in time where you can focus on just being with your spouse.  These things are important and deserve the attention of a dedicated spot in your schedule. 
  3. Say NO.  When you feel the symptoms of burnout coming on it’s time to start saying no.  This is of course easier to do when you have a schedule that you can look at that shows you have no open slots for additional work. 
  4. For Manager:  Watch out for signs of burnout.  Are your employees frustrated or resigned.  Have they lost focus?  These can all be signs of burnout.  Remember, it’s almost always easier to avoid burnout than it is to deal with it after the fact.

Android player version 0.95 now available on Android Market

We’ve fixed a number of bugs in our new Pluralsight app for Android since we moved to the FFmpeg library for streaming video. We’ve had our ups and downs, but we’ve got a pretty solid player in place in version 0.95, which was released to the market recently. We also submitted the app to the Amazon AppStore, which typically takes about a week to do their review before going live for the Kindle Fire.

Some of the more interesting fixes include better resolution matching for different sizes of devices (the Kindle Fire should now have higher resolution video, for example), lower memory requirements during catalog parsing, which should reduce startup crashes, FFmpeg integration bug fixes, as well as a safer OpenGL initialization routine that works on more devices, fixing some crashes that were happening when initiating playback on a video.

Let us know how the player works for you! If you like it, please take the time to rate it on the Android Market – we’d love to have your feedback! If you’re having trouble with it, please contact us and let us know the details so that we can start a conversation to get your problem fixed. Thanks!

Video: Do More With LESS (and SASS) In Your CSS3 Stylesheets

Bring the power of a dynamic language to your CSS3 Stylesheets.  In this video excerpt from Shawn Wildermuth’s course A Better CSS:  LESS and SASS you’ll see how to include the LESS features into your web application and how to create a stylesheet that uses LESS variables.  In the full course Shawn covers how to use both LESS and SASS to perform feats of CSS magic including nesting rules, using variables, selector inheritance and more.



Continue reading

Simpler Tests: What kind of test are you writing?

One common problem that I see in test suites is confusion about what each test should cover. This confusion often leads to tests that are either too broad or too focused to accomplish the goal of the author. When writing a test, it is important to think about what kind of test it will be and the constraints that make that type of test effective.

There are a few broad categories of tests that I keep in mind to help focus my testing:

Unit Tests
Also called micro tests, unit tests form the foundation of any good testing strategy. These are tests that test a single class or method in isolation from it’s dependencies. Mocks and stubs help us isolate the code under test and make our tests more focused and expressive. A test that touches any external resource such as the database, the file system, a web service, etc is never a unit test.
The primary purpose of unit tests is to validate that the subject under test is functionally correct for the expected inputs and outputs. Additionally, unit tests provide documentation on how the class is expected to function and be used by consumers.
Good unit tests are fast, atomic, isolated, conclusive, order independent and executed automatically by the continuous integration server on each commit to the source control system.
Smells for unit tests include too much setup, long test methods, race conditions, reliance on strict mocks, lack of CI integration.

Integration Tests
These are tests that include a specific concrete dependency. There are two primary sub-categories of integration tests. The first category of integration tests is the tests on your adapters for the features of another system. Examples include tests of your data access layer, web service proxies, file system proxies, etc. In order to provide real value, these tests must use the real dependency. For that reason, they often require more set up and are slower to write and run than unit tests, but in order to have confidence in your test suite, these tests are absolutely necessary.
The primary purpose of these integration tests is to validate the code that you have written to manipulate the external system. Additionally, these tests may validate some portion of the remote system. As an example, consider a data access object that is implemented in terms of an object relational mapper with stored procedures in the database. If you call Save, then Load and validate that the retrieved object is equivalent to the stored object, you have tested your DAO, your OR mapping, the stored procedure(s), the network connection, the database connection string, the database engine, the script evaluation sub-system in the database, etc. You can see that these tests exercise a larger block of code and infrastructure than unit tests. For this reason, they tend to be more brittle and prone to breaking. I don’t recommend failing the build on failed integration tests. Once your suite of integration tests grows large, you may not even want to run them on check in, but just schedule them to all run at various intervals (hourly/daily.)
Good integration tests validate the features of the external system that you use in your application. They do not attempt to cover the full set of functionality, but only to validate that what you need works. Like your unit tests, these tests should be atomic, isolated, conclusive, order independent and executed automatically by the continuous integration server as often as is reasonable. You also want them to be as fast as possible, but keep in mind that they will never be as fast as your unit tests.
Smells for these tests include too much setup, long test methods, race conditions, reliance on any mocks or stubs, lack of continuous integration.
The second category of integration tests are those that depend on more than one of your own components. These are tests that are generally confused about their role. JB Rainsberger gave an excellent talk about these tests that you can watch here on InfoQ: Integration Tests are a Scam.

Acceptance Tests
Acceptance tests are often overlooked, but critical to a solid test suite. These are tests that execute your entire stack; excluding only the user interface. To be clear, this means using no mocks or stubs or test doubles of any kind. Your tests should attach at the Application Layer just under the UI Layer. These tests complement the unit and integration tests. While unit and integration tests validate correctness in the small, these tests validate correct composition of your building blocks. Acceptance tests are often written using different tools than those used in unit and integration testing. This is because in a mature environment, the specification for the tests can be understood, discussed and even written by users, business analysts, and QA testers.
The primary purpose of these tests is validate things like component wire up, application stack integration, basic use cases/user stories, system performance, and overall application stability. These tests will likely be run the least often as they will be fairly time consuming to execute and may require extensive (though automated) setup.
Good acceptance tests can be understood by a user and are written in terms common to the business.
Smells for acceptance tests include attempting to validate every path through the system and writing them in a programming language not understood by the users.

User Interface Tests
These are tests that manipulate your application the way the user would. In theory, you can test just the UI this way, but in practice, this most often means that these tests exercise the whole application stack. Writing UI tests often requires special tools to manipulate the application. These are the most fragile, brittle, expensive tests to write and maintain. They are also the slowest to run. It is often best to use these tests only to validate that the application is navigable, doesn’t fall over and has all of its dependencies met.
Good UI tests are simple and limited in scope.
Smells for UI tests are inconsistent failures, testing application correctness.

TATFT
There are many ways to categorize tests. I find these 4 categories help me to focus my testing and build a faster and more reliable test suite. What techniques do you use to improve your testing suite?

Contributed by David Adsit at http://codeobsession.blogspot.com/2012/03/simpler-tests-what-kind-of-test-are-you.html

Video: Using Lambdas Old School Style in C++

C++ is still one of the most widely used and powerful languages available and in no way has been forgotten in the .NET framework.  In this video excerpt from Kate Gregory’s course C++ Advanced Topics you’ll see how to use Lambda expressions in C++ including how to control the capture of variables used in the Lamda expression itself.  In the full course Kate covers other advanced topics such as using standard containers, avoiding memory management, forward declaration, and move semantics.



Continue reading

New course: TCP/IP Networking for Developers

Steve Evans has just published a new course:                                                                   TCP/IP Networking for Developers

In today’s world it’s hard to write an application that doesn’t rely on the network, but so few of us know how to troubleshoot networking issues. Stop wondering if it’s your code or the network, Steve will show you how  to point the finger at the right culprit.

New Course: Introduction to .NET Debugging using Visual Studio 2010

Mario Hewardt has just published a new course: Introduction to .NET Debugging using Visual Studio 2010

Mario HewardtThis course teaches how to use the Visual Studio 2010 powerful debugging features to hunt down tough bugs. You might be surprised that Visual Studio contains super powerful debugging features that are invaluable when hunting down tough bugs. Topics such as data inspection, power tools, debugger canvas, threading and much more is explained. We even take a look at some of the new debugging features in Visual Studio 11 beta.

Meet the Author: David Chappell on Cloud Computing: Seeing the Big Picture

In today’s installment of the Meet the Author podcast series, Fritz Onion sits down with David Chappell to discuss his new course Cloud Computing:  Seeing the Big Picture.  In this interview, David explains how he shunned the usual SaaS, PaaS, and IaaS model for a more general categorization of SaaS, Cloud Platforms, and Private Clouds.  He also gives his view on who the major players are in the Cloud Computing space and what the motivations are behind organizations moving to Cloud Computing.

Listen to the Audio (MP3)

Meet the Author:  David Chappell on Cloud Computing:  Seeing the Big Picture

Transcript


[Fritz] Hi, this is Fritz Onion with another episode of Pluralsight’s Meet the Author podcast. Today I’m speaking with David Chappell about his new course Cloud Computing: Seeing the Big Picture. David is Principal of Chappell and Associates in San Francisco, California. Through his speaking, writing, and consulting, he helps people around the world understand, use, and make better decisions about new technology. David has been the key note speaker for more than 100 conferences and events on five continents, and his seminars have been attended by tens of thousands of IT leaders, architects, and developers in 45 countries. David, it’s great to talk with you today.
Continue reading

Microsoft Releases ASP.NET MVC, Web API, and Razor as Open Source

Microsoft has just announced via Scott Guthrie’s blog that they will be releasing ASP.NET Web API and ASP.NET Web Pages (aka Razor) as open source under the Apache license.  These products will join others that Microsoft has release as open source including ASP.NET MVC which has been open source since V1.  Perhaps more key to this announcement though is that Microsoft will for the first time be allowing external developers to contribute to the code base.

We will also for the first time allow developers outside of Microsoft to submit patches and code contributions that the Microsoft development team will review for potential inclusion in the products. We announced a similar open development approach with the Windows Azure SDK last December, and have found it to be a great way to build an even tighter feedback loop with developers – and ultimately deliver even better products as a result.  – Scott Guthrie’s Blog

Another key aspect is that while Microsoft will allow developers to contribute to the products, they will continue to be fully supported by Microsoft and will ship both stand-alone and with Visual Studio.

Scott Hanselman posted shortly after this announcement and answered a few questions including why ASP.NET WebForms is not going to be included.

The components that are being open sourced at this time are all components that are shipped independently of the core .NET framework, which means no OS components take dependencies on them. Web Forms is a part of System.Web.dll which parts of the Windows Server platform take a dependency on. Because of this dependency this code can’t easily be replaced with newer versions expect when updates to the .NET framework or the OS ships.  – Scott Hanselman’s Blog

The source code will be hosted on CodePlex at http://aspnetwebstack.codeplex.com.  Microsoft has recently added Git support in addition to TFS and Mercurial support.