How to get your dream job – Part I

Like a lot of developers, I’ve always wanted to have a job where I’d be creating an amazing product with the world’s brightest engineers. It’s the kind of work that gives you purpose, but feels more like a hobby because you’re so passionate about it. It’s with a team that pushes you to become better because well… they’re smarter than you. And it’s where your customers, whether they’re millions of users around the world or just a dozen coworkers, are more like die-hard fans and can’t wait to see your latest creation.

I started out on this quest while I was in college where I landed my first technical job as a web developer for the university. Since then I’ve worked for one of the country’s biggest defense contractors, a software company that’s changed the way IT is done, and Apple. And when it comes to hiring I’ve been on both sides of the fence… I’ve been the eager engineer who sent his resume into the black-hole and the not-so-nice guy that played paper-toss with one too many resumes.

There are a few key things I’ve learned over the years that will increase your odds at getting that dream job… and here they are!

Getting Noticed. The first thing you need to do is get an interview. Chances are the job you’re applying for is going to have hundreds to thousands of people applying for it and a lot of resumes will go unnoticed. Here are a few easy ways you can distinguish yourself from the crowd.

Launch your own project. When I see a candidate has created their own commercial app or tool that fills a need, they’ll usually get an interview (bonus points if they’re selling it). This triumphs education and experience. Why? Well first it shows that you’re motivated and passionate about your work (something a CS degree from Stanford doesn’t)… and this alone can take you far. But most importantly it shows you can ship (deliver a project on-time and with quality)… and that’s something few people can do with a team let alone by themselves.

Build relationships with your colleagues. A lot of the people I’ve worked with were referred by other coworkers. Why? Well, if a coworker recommends you you’re probably a good fit for the job, have a great track record, and will fit in with the team’s culture (aka easy to work with). You’re resume will get more attention versus applying online with the masses and you’ll probably get bumped ahead in the interview queue.

Develop your persona in the community. Blogs, Twitter and mailing lists help here. If you’re an avid developer for the Acme Platform, blog and tweet about your projects. Use mailing lists or sites like StackOverflow to help other developers in the Acme community. Chances are if I’m working for Acme, Inc. and we have a job opening, I’ll be contacting you.

Be yourself in your resume. This one sounds obvious, but I can’t tell you how many resumes I’ve read that sound like they were written by robots (and it hurts even more when they have spelling or grammar errors). If we met in person, would you introduce yourself by spewing off a list of the technologies you learned in the last 5 years? I’d hope not! Put some effort into writing a meaningful cover letter, this is where you get a chance to shine. DO NOT send a generic cover letter, unless you’re applying for a factory job and want to be treated like a cog.

Use metrics. A lot of times people will gloss over their accomplishments without providing anything tangible for the guy reading it. For example, if Joe automated some tests for Acme Inc. his resume might have a bullet point with “Developed automated tests for Acme’s Widget”. As someone screening your resume, I have no idea if that was an OK, good, or great accomplishment because chances are this is the first time I’ve heard of Acme’s Widget. But if you tell me “Developed 200 automated tests for Acme’s Widget that save over 30 man-days per year and found 137 bugs in the last release” a light bulb with go on and I’ll know this was a significant feat.

Innovation and Ignorance

During my college years I worked at a defense contractor, but they weren’t just any ole’ defense contractor. They were a small team of talented folk that only built non-lethal technology to help our troops. Stuff like simulators and obscurants.

Nonetheless, I’d consider my first project there one of my most challenging yet successful projects. And by successful I’m referring to both the literal sense of finishing an awesome product on time and self growth… you know the kind of stuff that pushes you to the next level.

I was the sole software guy on an embedded system that launched smoke grenades. There was half a dozen of us building this thing from scratch and that covered project management, electrical & mechanical engineering, software and testing. I knew the project meant a lot to the company and they trusted me to write some great software for it, but I felt like I had no idea what I was doing.

I had a handful of commercial software projects under my belt and the first version of NetPoint was almost out the door. But I just graduated college, never wrote embedded software and I definitely had no experience with smoke grenades… well unless lighting smoke bombs on the 4th of July counts.

Over the next few months I brainstormed how our hardware and software was going to work with Derek, our electrical engineer and one of the most talented guys I’ve worked with. If you haven’t written embedded software before (and no, iPhone apps don’t count), it’s a different animal. You’re dealing with very low-level stuff, like figuring out whether you should send data in most or least significant bit order. A slight hiccup in timing can throw off the entire system. It’s really important for your hardware to align with your software or else things just won’t work.

For the next few months, I came into the office and chiseled away at a different piece of the project every day. We eventually demoed it to our customers and blew them out of the water.  And I later realized that feeling of not knowing what you’re doing is a good sign – it’s innovation at its best.  It means you’re stretching your limits and treading new territory, somewhere that not many people have been before.  If you’re fortunate enough, you might even be onto something that will change the world.  After all, there was no recipe for the light bulb, the combustible engine, or any of the great inventions we rely on today.  It took a lot of trial and error.

So the next time you feel like you don’t know what you’re doing, just remember you’re probably onto something great.

Take 2

It’s been a while since I last posted here, almost a year to be exact. Sure I could blame it on the fact I’ve been busy at work, getting settled in San Francisco, and working the night shift here and there. But that’s not 100% true.

I haven’t blogged because I wasn’t sure what to blog about. A year ago I moved out west to work at Apple and that was a big change for me (99% of my experience was developing for Windows & IT). In the past I mostly blogged about my projects and that just wasn’t going to happen anymore.

So I’m here to say that going forward I’ll be writing about my thoughts on developing great software. And by that I don’t mean the nitty gritty details of how to write a for loop. I’m talking about the people, thought, and discipline that it takes to build great bytes versus mediocre bits.

Now I’m not saying I’ll be right on any of this, everything is solely my opinion. Heck, if you try any of this you might just make The Office seem normal. My main intention here is to create some dialogue (so please comment!) that gets you (and me) thinking about the stuff that it takes to build a great software app, team, and company. So I have to say please do not try any of this at home the office… or if you do it’ll be at your own risk!

Hello I’m a Mac

So today is my last day at Citrix.  Over the past month or so I’ve been interviewing with Apple’s iPhone team and have accepted a position on the Wireless Technologies team.  My official title is “Tools/Automation QA Engineer”, which basically means I’ll be writing software to test the iPhone’s Bluetooth and WiFi features.  I’m pretty excited about the opportunity, after all I get to work on the world’s best phone and live in one of the greatest cities.  But there’s a lot that needs to happen in these next couple of weeks.

San Francisco from Coit TowerMy first day on the job is July 27, a little less than two weeks away.  In about a week the movers will ship all of my stuff out west and I’ll be jumping on a plane shortly after.  I’ll be staying in temporary housing till I can find a place in San Francisco, hopefully this wont take long.  I really can’t imagine what this experience would be like without the help of the relocation staff.

So between getting ready for the move and enjoying my last few days in the warm Atlantic Ocean, I plan on spending some time on NetPoint.  It’s a bit aggressive, but I’m going to try get the NetPoint v2.5.1 update online and give the Neutex web site a facelift.  The v2.5.1 update will have some bug fixes and basic integration with OneOrZero’s help desk system.  As far as the web site goes, I think there are a few things that can be done to help market NetPoint better.  I anticipate the first month or two at Apple will be crazy, so finishing this before I head out to the valley will definitely save me some grey hair.

As far as Shannon Ma Virtualized goes, you probably wont see much new content on XenApp.  However, I still plan on developing tools like NetPoint that will alleviate some of the common problems IT Pros face and you can be the first to hear about them here.  I also have some other ideas for topics that I need to look into a bit more, so we’ll see how that pans out.

Episode 1 of the NetPoint PowerShell Commands

Back in March I wrote a blog about the NetPoint PowerShell Commands, which are now available in NetPoint 2.5. These commands can be used to query your network inventory from PowerShell, so you can easily automate those repetitive system and asset management tasks.

Within the upcoming week or two, I plan on posting a set of videos that will show how these cmdlets can be used to automate some typical IT scenarios.  This first episode gives a brief introduction of the NetPoint PowerShell Commands.  We also walk-through a scenario that involves getting a list of the programs installed on an arbitrary machine in just one line of script.

In the next episode, we’ll look at generating custom network inventory reports right from PowerShell, so stay tuned!

Enhancements for the XenApp Publishing Extension

I’ve been thinking about adding some new enhancements to the XenApp Publishing Extension, but before doing so I’m curious to see how useful the community thinks they are.  To answer this question, I’ve decided to post a blog where you can give feedback on each enhancement.  If these ideas get a lot of votes, you’ll probably see them come to life.

So here we go.  The first idea is to add offline app support to the XenApp Publishing Extension.  This means you would be able to right-click a .profile in Windows and publish one of its apps to your farm.

The next idea is to add PowerShell support to the XenApp Publishing Extension.  Right now the extension publishes online apps via MFCOM.  A set of PowerShell cmdlets known as the XenApp Commands have been released as a Technology Preview and can also be used to publish both online and offline apps.  Since the code for the XenApp Publishing Extension is available, adding support for this would also be a good reference for anyone that’s interested in calling the cmdlets from a .NET app.

Thanks in advance for your votes!

Cloning a XenApp server with remapped drives

A fellow Shannon Ma Virtualized fan has posted a link that talks about how you can clone a XenApp server with remapped drives.  Check out http://kb.acronis.com/content/1666 if you’re interested in this.  The article talks about a few ways you can accomplish this with and without Acronis’ imaging solution.  To be honest, I haven’t had a chance to try this out but it seems like a handy reference if you’re looking to XenAppPrep your servers with remapped drives.  Thanks Mike!

Hot Off the Compiler: Citrix XenApp Publishing Extension

My latest side project at Citrix is the XenApp Publishing Extension, a tool that makes app publishing so simple your mom could probably do it.  It integrates with Windows, so you can right-click on any executable or shortcut to publish it.  The final bits, including the source code, are now available on CDN and can be downloaded from here.

XenApp Publishing Extension DemoI’ve included a video of the tool in action, which by the way was taken with GoView.  For those if you not familiar with GoView, it’s our all new service that allows you to create your own screen recordings and publish them online.  Think of Camtasia, except web-based and best of all totally free.  It’s pretty slick and I highly recommend trying it out if you ever need to make your own screen recordings.

Anyway, back to the XenApp Publishing Extension.  If you’re interested in taking a peek at the code, you’ll notice its 100% WPF based to create that “cool” look and feel.  It also uses MFCOM and the infamous DataModel-View-ViewModel pattern.  This makes pretty easy to maintain and test.

I’d also like to thank the following Citrites for their contributions:

  • Chris Anthony and the User Experience team for the icon art.
  • Thomas Hammond for the WPF wizard control.
  • Vishnu Nath who came to me with the right-click app publishing idea.

Well, that’s all I have for today.  As always, I enjoy hearing feedback from anyone using my tools, especially if its saved you some gray hairs.  So feel free to post any questions or comments you have here.  Till next time!

Update: PowerShell SnapIn for XenServer Snapshots 1.01

I just released a update of the PowerShell SnapIn for XenServer Snapshots, which can be found here. This version contains a NoStart switch on the Restore-VM cmdlet. By default Restore-VM will start the virtual machine after its been reverted. You can now specify the NoStart switch if you don’t want it to be started. Here’s a brief example:

Restore-VM -Hostname 192.168.0.2 -Username root -Password qwerty -VM Bluemoon -Snapshot BluemoonBackup -NoStart

I’m always interested in hearing feedback, so feel free to post any questions or comments you have.

P.S. If you’re a XenApp customer, Citrix Receiver for the iPhone (aka the XenApp client for the iPhone) is now available in the AppStore. Chris Fleck has posted a demo if it here. Unfortunately, I haven’t been able to try this out as I don’t (yet) have one of these snazzy phones.

PowerShell Cmdlets for Network Inventory

This past week I spent a few evenings on my balcony coding the final bits of Project Full Moon.  Full Moon is a set of PowerShell Cmdlets for NetPoint, which are targeted at helping IT Pros automate repetitive system and asset management tasks.

In this post I’ll show how you can use these commands to make your life a bit easier.  Here are some scenarios I’ll walk through:

  • You’re interested in getting a list of the apps installed on a certain system
  • Some of your Dell workstations are having issues with their NVIDIA graphics cards.  You need to apply a driver update to all of these systems.
  • It’s that time of the year to buy new hardware.  You need to determine if there are any systems that need a hard drive upgrade.
  • There’s a new virus in the wild.  You need to ensure all of your systems are protected with up to date virus definitions.

So let’s get started!  First let’s add the NetPoint PowerShell SnapIn and get a list of our network inventory cmdlets:

Add-PSSnapin Neutex*
Get-Command -PSSnapin Neutex*

PowerShell will list the 20 cmdlets available to us:

  • Get-NetAntiVirus
  • Get-NetBIOS
  • Get-NetCDROMDrive
  • Get-NetDiskDrive
  • Get-NetFirewall
  • Get-NetFloppyDrive
  • Get-NetLogicalDisk
  • Get-NetMemory
  • Get-NetModem
  • Get-NetMonitor
  • Get-NetNetworkAdapter
  • Get-NetOperatingSystem
  • Get-NetPatch
  • Get-NetPrinter
  • Get-NetProcessor
  • Get-NetProgram
  • Get-NetService
  • Get-NetSoundDevice
  • Get-NetSystem
  • Get-NetVideoController

Now we're ready to tackle our scenarios.

You're interested in getting a list of the apps installed on a certain system

Get-NetProgram can be used to retrieve a set of programs.  Running this command by itself will return all programs that have been installed on our network (even those that have been uninstalled).  Like all of our other network inventory commands, it also accepts a set of parameters (app name, publisher, how often it's used, etc.) that can be used to filter its results.  Here is the script that will get us the results we want:

Get-NetProgram -System maui -Uninstalled $False | % { $_.DisplayName } | sort -unique

This command starts out by retrieving all of the apps installed on the system named maui.  By default, we’ll get a whole set of information about each app, but we only want the app names so we’ll pipe this into % { $_.DisplayName } and sort it so we can easily get an idea of the installed apps.

Some of your Dell workstations are having issues with their NVIDIA graphics cards.  You need to apply a driver update to all of these systems.

The data we need to target for this scenario is spread across two domains: video controller (NVIDIA graphics cards) and system (Dell workstations).  We’ll use Get-VideoController in conjunction with Get-System to get the job done:

Get-NetVideoController -Name nvidia* -Uninstalled $False | Get-NetSystem -Manufacturer dell* | % { $_.ComputerSystemName } | sort -unique

Here we’re getting a list of all installed graphics cards whose name starts with NVIDIA.  We then pipe this to Get-System with the Manufacturer parameter set.  This will return all Dell systems that contain an NVIDIA graphics cards.  The last two portions of this script will cause only the system names to be returned in alphabetical order.

You could use this output with the WMI cmdlets to install the driver update.

It’s that time of the year to buy new hardware.  You need to determine if there are any systems that need a hard drive upgrade.

In this scenario, we’re interested in using the Get-NetLogicalDisk cmdlet as follows:

Get-NetLogicalDisk -DriveType "Local Disk" | where { $_.FreeSpace / $_.Size -lt .10 } | % { $_.ComputerSystemName }

The first portion of this script will get all partitions that are stored on hard disks (versus CDs, floppies, etc.).  We proceed by using PowerShell’s where command to only get partitions that have less than 10% of free space and we pipe this to % { $_.ComputerSystemName } to only get a list of the system names.

There’s a new virus in the wild.  You need to ensure all of your systems are protected with up to date virus definitions.

This scenario is a little more complex than the previous ones, however we can still solve it in two lines of PowerShell.

$i = Get-NetAntiVirus -Uninstalled $False -UptoDate $True | % { $_.ComputerSystemName } | sort -unique
Get-NetSystem | where {$i -notcontains $_.ComputerSystemName} | % { $_.ComputerSystemName } | sort -unique

The first line will get us names of all the systems that have an antivirus client with up to date virus definitions.  The second line will subtract this list from all of the systems on our network using the where command, which leaves us with the unprotected systems.  The WMI cmdlets could also be used here to install an updated antivirus client on these systems.

That pretty much sums up some of the basic scenarios you can address with NetPoint’s PowerShell Cmdlets.  There is some documentation work that still needs to be sorted out, however you can expect to see the final bits online in a couple of weeks.  In the meantime if you don’t already have a copy of NetPoint, you can get the free Express Edition here.

Follow

Get every new post delivered to your Inbox.