Posts Tagged ‘Visual Studio’

Here is an entertaining story I think you will enjoy. But there is a lesson: protect yourself from being used as I was. TL;DR: Insist on a two-way NDA.

True story, this happened to me last week. I got a call about a consulting job: a 3-6 month contract for a Windows Visual C++ Developer, full-time at an hourly rate. The company was reluctant to express any limits for the hourly rate — price did not seem to matter to them. The interview was on a gorgeous Friday before Labor Day weekend. At the appointed time, I arrived and was greeted by the president of the startup. I liked him right away. We were the same ages and exchanged tidbits of raising a family in the Bay Area. He explained that his company produced a limited number of high cost medical devices. An updated, smaller model was announced earlier in the year, and it was due to the first customers in a month. But the hardware had been delayed. Hence, their Plan B was to cripple the shipping, full-size model to reduce the capacity to match the smaller model with half the number of ‘modules’. But the original Windows application that operated the device would need to be modified accordingly. And their Windows developer had left a year before.

The interview would require signing an NDA, getting the source code to the Windows application, building it, modifying it to work with half the modules, and returning both the binaries and the source code, which would be judged for correctness and the most qualified candidate would be selected for the contract.

Analysis: In hindsight, this “take home test” was entirely inappropriate for a months-long hourly contract. It is the exact work assignment in total, not a representative workload of the job’s requirements. It is what might be expected for a one-time gig on Craigslist. It might seem obvious to you right away what my fate would be. Assigning an interview problem which is exactly what they need to ship? Return the source code? But I thought that they were desperate, and this was well within my comfort level, and it would turn out to be a win-win situation.

I was the third candidate so far.

Analysis: Third candidate? Was I so blind that I couldn’t see that right after I left, there would be a fourth candidate, and after that a fifth candidate? But, I did not think much about this since they implied the first two candidates had not submitted acceptable results. The first one crashed on startup, and the second positioned the robot at the wrong position and showed the window too small on a 4K display. The other candidates did not have access to the discontinued Visual C++ 6 tool that was used and there were known compatibility issues with the newer version of the tool that they did use. I still had the original tool and accepted the challenge in good faith. I thought they would give me every chance to succeed before going to the fourth candidate. In fact, I asked to debug it with the actual device, should my attempt not initially work. Looking back, they did not expressly agree, but neither did they say that was not going to happen.

1.5 hours later, I signed the NDA, declined an invitation to stay for a pizza lunch (I told you the president and I hit it off), and took the USB stick of source code with me. Over the holiday weekend, I spent a total of 6 additional hours resuscitating my ancient computer with Visual C++ 6 still running on it and modifying the code as I understood the problem. I must say, I did enjoy myself immensely. Visual C++ 6 is an oldie but goodie, it still is way faster than even the latest Visual Studio 2017, and simpler and more direct besides. While the source code was naively written, it was easy to follow (as opposed to the overengineered gas plant code I have had the displeasure to encounter over the years). I e-mailed the binaries and source code on Labor Day afternoon, expecting feedback right away. The response was I would hear something by Friday, 4 days away.

Friday rolls around. Yes, you guessed it. “We actually interviewed 6 candidates in total. We know you are very capable, but we did not choose you because of the high bill rate.”

Now I was mad. First, they act like price does not matter, and now that is why they are disqualifying me? They interviewed three more candidates after me? Whatever happened to working together to debug and refine my work? They got the source code from 6 candidates? I accused the president of copy/pasting the code from me and possibly the other candidates and shipping the result. “We did not use your modified software for our use. Please believe us on this. We did not look into your code. We only run the machine to test your compiled code.” Then why did you ask for the source code?

Analysis: Of course, it’s impossible to know what they did or didn’t do with the source code. Or whether they actually hired someone. There does seem to be some deception, at least not being upfront about budget expectations.

But I could have avoided this situation in a couple of ways. First, I could have just walked away and not played at all. But I truly did believe in the people and the company’s mission. The president gave me a story of how it was nice working on something that helped so many hundreds of thousands of people (it is a medical device), and his mother had died of cancer, and this device would have helped her.

Here is the best thing I should have done: I should have asked for a two-way NDA. Before signing their NDA, I should have asked that they add a clause like, “Candidate’s source code will be destroyed and Company will not profit from it unless Candidate is hired.“

Consultants routinely go to interviews and sign NDA’s required to learn more about the projects for which they are interviewing. They don’t think to protect themselves with their own NDA’s. But given the company was asking for production ready code without pay, the two-way NDA was not only appropriate but necessary.

I assume people (especially those I like) have the best of intentions and will work with me towards a win-win scenario. That doesn’t appear to be what happened here. But, giving them every chance as I am apt to do, perhaps it might be due to an innocent difference in culture. The company, while being in the SF Bay Area, is Chinese – the employees are from China, and their customers are in China. As I am Chinese American (4th generation), I might be expecting them to embrace American values of individualism, and thus would work with me to debug and refine my solution for their needs. Whereas, they are used to infinite human collateral, and it is the most natural thing to discard the person in front of them and try the next (the 4th, 5th, and 6th candidates).

Juggling several client projects at once requires some sort of dedicated computer resources for each of them. Happily the state of the art makes it very easy. At first, I used just one computer and just juggled. Then I installed SysInternals Desktops to be able to switch to different screens for each client.

This proved too little, as each client eventually needed incompatible Visual Studio configurations. For example, the .NET projects benefited from add-ins like .NET Demon (continual rebuilding of the project), but this was incompatible with C++ projects. In addition, some clients required the Qt add-in, different versions of the Windows SDK, some required the DDK, etc. One needed the Dev Express ASP.NET controls, but that license was only for that client and I couldn’t use it for other projects.

Clearly the easiest way to assure an optimum environment for each client was a dedicated PC. While I do have enough computers to do this, so many physical machines makes for a very crowded desk, and I only have one good keyboard, mouse, and 30″ monitor, Happily, the performance of virtual machines makes this an unnecessary cost and inconvenience.

Which virtual machine software is the best? The cheapest and best performing is Hyper-V. Compared to my other favorite, VMware Workstation, it is a Type 1 hypervisor, which allows for faster performance, and it’s now included free with Windows 8(.1).

So my main development machine is a 3 year old Core i7, with 24 GB RAM and 1 TB SSD. I can run several Hyper-V VM’s with dedicated 4-6 GB of RAM simultaneously. Since most of the time they are just sitting idle, the one or two I am working in are very fast performing.

It is such a productivity booster to be able to Remote Desktop into these VM’s from anywhere on the Internet (although mostly from the Hyper-V host machine itself) with all the apps open exactly as I have left it. As I get older, my memory forgets things like what is the next thing to do for a client, and seeing all the apps there just as it was when I last worked on it saves me many minutes of ramp up time.

So it works great, and I wouldn’t change a thing. The one irritant is the initial setup of the VM’s. The number of installs you need to perform grows proportionally to the number of VM’s you create. But this is not as bad we it could be. First, we can create a “reference VM” which we clone to start all the new ones; the reference VM has all our must-have apps installed and configured, so these automatically work for all our new VM’s. This also helps with software that allows only a limited number of installations – when such software is installed, it checks a server on the Internet to see how many times prior the license file was installed. But after installation, it doesn’t check the Internet anymore. So if the VM is subsequently cloned, that software is none the wiser. (I realize this subverts the letter of the license, but not the spirit — I paid for a license to have full use of the software, I can’t help it if the software has a license that does not keep pace with how people use computers today.)

The second thing about all these installs is that they go way faster now, with the SSD. Even gargantuan packages like Visual Studio and Office install (relatively) very quickly.