Quickly Link SQL Server Tables in Access

Long gone are the days when I did much application development in MS Access.  However, I still find it a darn good tool for querying, reporting and doing quick edits to data stored in other platforms.

I wrote this code ages ago to allow me to quickly create linked tables in MS Access for SQL Server tables/views. It is much faster than the manual UI approach and doesn’t require setting up a DSN on the local system to make the connection

Usage

Use the immediate window (ctrl-G) to enter these commands:

Link every table in a SQL database(“MYDB”) from SQL Server Instance (“MYSQLSERVER”)
? LinkTable(MYSQLSERVER,MYDB,True)

Link a single table(“MySQLTable”) in a SQL database (“MYSQLDB”)  from SQL Server Instance named “MYSQLSERVER”
? LinkTable(MyTableAliasInAccess, MYSQLSERVER,MYDB,MYSQLTABLE,True)

The Code

Just paste this code into a new module in the Access database and you are ready to go.

Sub LinkAllTables(Server As String, database As String, OverwriteIfExists As Boolean) 'Usage Example (link all tables in database "SQLDB" on SQL Server Instance SQO01, overwriting any existing linked tables. 'linkalltables "SQL01","SQLDB", true 'This will also update the link if the underlying table definition has been modified. Dim rsTableList As New ADODB.Recordset Dim sqlTableList As String sqlTableList = "SELECT [name] as tablename FROM sysObjects WHERE (type = 'U')" rsTableList.Open sqlTableList, BuildSQLConnectionString(Server, database) While Not rsTableList.EOF If LinkTable(rsTableList("tableName"), Server, database, rsTableList("tableName"), OverwriteIfExists) Then Debug.Print "Linked: " & rsTableList("tableName") End If rsTableList.MoveNext Wend rsTableList.Close Debug.Print "Done." End Sub Function LinkTable(LinkedTableAlias As String, Server As String, database As String, SourceTableName As String, OverwriteIfExists As Boolean) 'This method will also update the link if the underlying table definition has been modified. 'The overwrite parameter will cause it to re-map/refresh the link for LinktedTable Alias, but only if it was already a linked table. ' it will not overwrite an existing query or local table with the name specified in LinkedTableAlias. 'Links to a SQL Server table without the need to set up a DSN in the ODBC Console. Dim dbsCurrent As database Dim tdfLinked As TableDef ' Open a database to which a linked table can be appended. Set dbsCurrent = CurrentDb() 'Check for and deal with the scenario ofthe table alias already existing If TableNameInUse(LinkedTableAlias) Then If (Not OverwriteIfExists) Then Debug.Print "Can't use name '" + LinkedTableAlias + "' because it would overwrite existing table." Exit Function End If 'delete existing table, but only if it is a linked table If IsLinkedTable(LinkedTableAlias) Then dbsCurrent.TableDefs.Delete LinkedTableAlias dbsCurrent.TableDefs.Refresh Else Debug.Print "Can't use name '" + LinkedTableAlias + "' because it would overwrite an existing query or local table." Exit Function End If End If 'Create a linked table Set tdfLinked = dbsCurrent.CreateTableDef(LinkedTableAlias) tdfLinked.SourceTableName = SourceTableName tdfLinked.Connect = "ODBC;DRIVER={SQL Server};SERVER=" & Server & ";DATABASE=" & database & ";TRUSTED_CONNECTION=yes;" On Error Resume Next dbsCurrent.TableDefs.Append tdfLinked If (Err.Number = 3626) Then 'too many indexes on source table for Access Err.Clear On Error GoTo 0 If LinkTable(LinkedTableAlias, Server, database, "vw" & SourceTableName, OverwriteIfExists) Then Debug.Print "Can't link directly to table '" + SourceTableName + "' because it contains too many indexes for Access to handle. Linked to view '" & "vw" & SourceTableName & "' instead." LinkTable = True Else Debug.Print "Can't link table '" + SourceTableName + "' because it contains too many indexes for Access to handle. Create a view named '" & "vw" & SourceTableName & "' that selects all rows/columns from '" & SourceTableName & "' and try again to circumvent this." LinkTable = False End If Exit Function End If On Error GoTo 0 tdfLinked.RefreshLink LinkTable = True End Function Function BuildSQLConnectionString(Server As String, DBName As String) As String BuildSQLConnectionString = "Driver={SQL Server};Server=" & Server & ";Database=" & DBName & ";TRUSTED_CONNECTION=yes;" End Function Function TableNameInUse(TableName As String) As Boolean 'check for local tables, linked tables and queries (they all share the same namespace) TableNameInUse = DCount("*", "MSYSObjects", "(Type = 4 or type=1 or type=5) AND [Name]='" & TableName & "'") > 0 End Function Function IsLinkedTable(TableName As String) As Boolean IsLinkedTable = DCount("*", "MSYSObjects", "(Type = 4) AND [Name]='" & TableName & "'") > 0 End Function

New FogBugz Plugin Released (FNN)

Just a note to let everyone know that I’ve just released my second FogBugz plugin, which is now available on the FogBugz Plugin Gallery under the name FNN.

This plugin, also known as “FogBugz News Network” adds some functionality to a FogBugz installation to provide a more real-time glimpse into what is going on for the projects managed in the system.

FB On Demand Users: FNN was submitted to FogCreek for approval on the FBOD installations earlier this week, so it should be available for you in the near future.

Recent Events Report

Available from the “Extras” pull-down menu, this report enables you to see what is going on in FogBugz. It shows a listing of recent case updates, for example resolving a case or assigning it to someone else.  This report can be filtered down to a specific person or project.

FNN Recent Events Report

Work in Progress Report

Also available from the extras menu, this report provides a centralized place to see what everyone is currently working on based on what they have marked with the “Working On” built-in FogBugz feature accessible from the upper right hand of the screen.

FNN - Work In Progress Report

Working on Indicator

Another feature included in FNN is a new status indicator displayed at the top of a case that indicates which user(s)  are working on the case, again according to their “Working on” settings.

Although the assignment features of FogBugz provide a good way to prevent two people from working on the same case, it isn’t uncommon for team leads to re-assign cases from one developer/tester to another to re-balance the workload.

Prior to this feature, we just used a custom FogBugz status called “Work in progress” that alerted everyone not to re-assign the case because work had already started. This status indicator effectively serves the same purpose without the need for a separate case status code.

FNN - Working On Indicator

Bug Reports, Comments, Suggestions

If you have any trouble with the plug-in, have ideas to improve it, or just want to tell me what you think of it, I’m happy to listen. You can e-mail me directly using the link provided in the Author column of the FogBugz plug-in administration page.

Blog Response: Lookup fields in Access are evil?

A comment on one of my answers on StackOverflow brought to my attention a blog article “The Evils of Lookup Fields in Tables” that argues against defining lookup fields in MS Access table definitions. Quite interesting. I don’t do nearly as much Access development as I once did, but I had never encountered any serious issues using Lookup fields.

The article is written by Arvin Meyer and Joan Wild, who appear to be part of the Microsoft MVP program. My experience predisposes me to give a lot of credibility to MVPs even when I am initially skeptical of something they say. However, given the full context of their complete argument. I am calling foul on this one.

Lookup Fields in Access

First, a quick primer on this handy feature of MS Access for anyone that is not familiar with it.

In the design view for a table definition, you can define a display control type for a each field that is used to display it in data-sheet view and also used as a default when the field is added to a form. “Lookup field” in this context of this article and the one it responds to simply refers to a field defined with a “Combo Box” display control that uses a table or query as the row source.

Access Lookup Field Definition

The effect of using a lookup field for the configuration shown above is that the user gets a handy drop-down control in data-sheet view as shown below. In this example, the Company field is actually a numeric foreign key to the companies table, but the user gets to pick a company based on a CompanyName instead of the CompanyID. The CompanyID is still stored in the underlying table.

Lookup Field Datasheet view

In fact, by changing the configuration slightly, you can even make it display BOTH the CompanyID and CompanyName in the drop-down.

Lookup Field Datasheet - 2 Columns

The great thing about this is that it removes one of the excuses novice developers often make for not normalizing their databases sufficiently.

The users don’t want to have to look up the CompanyID to enter a new customer! It’s just easier to put all the company information in the customers table.
-Novice Developer

When you consider that Access is the tool of choice for a lot of novice developers, removing obstacles to good DB design was a good strategy for the Access product team at Microsoft.

Dubious Claims

So back to the assertion that this feature should be avoided.  Let’s tackle the claims one at a time.

1. A Lookup field in a table displays the looked-up value. For instance, if a user opens a table data-sheet and sees a column of company names, what is in the table is, in fact, a numeric CompanyID, and the table is linked with a select statement to the company table by that ID.

Rebuttal: Yes, this is exactly the point of this feature and why it is beneficial.

2a. Any query that uses that lookup field to sort by that company name won’t work.

Rebuttal: Sorting does indeed work. It sorts on the first displayed column in the lookup control and not necessarily the underlying value. It is much more intuitive to the user to have it sort based on what is displayed rather than a hidden underlying value that you are trying to hide from them in the first place.  In any case, how often do you want to sort on a numeric foreign key value anyway? Retracted. I still take issue that sorting in a query on a lookup field does work correctly, but I can see that the original author may have been talking about using the sort feature in table/form view which is admittedly a little wonky. I’ll offer the benefit of the doubt on this one, but would like to see clarification in the original article.

2b. Nor will a query that uses a company name in that field as a criteria.

Rebuttal: When writing queries, you do have to specify the criteria using the underlying value rather than the user-friendly displayed value.  However, you have to assume that someone writing queries is not the target of the end-user abstraction provided by lookups and will know to supply a numeric criteria for “CompanyID.”

2c. If a user creates a combo box to select the company using a value list, the data in the table can be over-written.

Rebuttal: First, one of the reasons for this feature is that it auto-creates the combo-box with the appropriate settings. Although, I have no idea what they mean by “the data in the table can be over-written”, it is true that someone could modify the form design to do things that mess up the data. This is not unique to any specific feature.

3. Another relationship is created which then creates another set of indexes when a Lookup field is created, thus bloating the database unnecessarily.

Rebuttal: You shouldn’t use a feature that simplifies life for the developer and end user because it might bloat the database? You weren’t planning on adding a relationship and/or indexes to your foreign and primary keys anyway?

4. If a combo box based on the lookup is used in a form, and a filter is applied, the persistent filter effect of Access often saves the filter and the next time the form is opened, there will be a prompt for the value (which cannot be provided, thus creating an error).

Rebuttal: I tested this one out in thoroughly and could not reproduce what this person is describing.  I have seen similar behavior in Access before even without lookup fields. It seems unrelated.

5. Reports based on the lookup field need a combo box to display the data, causing them to run more slowly. The underlying record source can also be modified to include the table, however the index, (unless it was set up within a proper relationship) may not be optimized.

Rebuttal: Uhhh. Yeah. If you want to display a value from a related table, the report is going to need to pull it from that other table combo-box or not. Assuming that the combo-box method is slower than adding a join to the underlying query, so what? Adding a lookup to a field doesn’t REQUIRE you to have a combo-box, and not having a lookup field doesn’t stop you from using a combo box.

6. Lookup fields mask what is really happening, and hide good relational methodology from the user.

Rebuttal: The point of your app is not to teach the user about “good relational methodology.” As much as you’d like them to care about the intricacies of your very important job, they just want a way to efficiently work with their data. In fact, this feature encourages the use of good database design by giving the developer a way to hide the technical details behind the scenes.

7. The database cannot be properly upsized to, or queried by, another engine (without removing all the lookup fields) because no other engines use or understand them.

Rebuttal: Wrong, Wrong, Wrong. Other databases might not support this particular feature to display the data automatically with the cool drop downs, but they can use these fields just like any other. The upsizing thing is irrelevant, despite the fact that you configure this in the table design, it is a UI feature not a data format.

8. If security is implemented, permissions to tables[are] usually denied, and [Run with owner’s permissions] queries are used for data access. There will often be errors that there are no permissions on a specific table that isn’t even being used in a query (because the lookup field is). If the queries are nested or complex, it can take some time to track down the lookup that’s causing the error (that is, if it occurs to you).

Rebuttal: So the argument here is that if you set up complicated security, this feature will trip you up because you have to remember to give permissions on the related table. I suppose you don’t have to worry about permissions on the related table if you forgo this feature and manually add that table to the query? Is it really that confusing if you get an error telling you it doesn’t have permissions on {specific table} just because it isn’t explicitly in the query? Sounds like a PICNIC problem.

Update:

As pointed out in the comments (thanks JamesL), in my rebuttal to the weak arguments against using lookup fields, I was remiss in not mentioning that there are some legitimate complaints about the implementation of this feature in MS-Access. I still don’t think the feature should be discarded completely, but it definitely needs to be used with an understanding of its quirks and shortcomings.

The problem with lookup fields

Using the built in sorting and filtering features provided by access in form and table view against a lookup field that is configured to display a value other than the underlying value (as shown in my examples above) is definitely wonky and can be confusing to users. The implementation is textbook case of a leaky abstraction.

Note: I did some experimentation and found that different versions of Access misbehaved in slightly different ways.

Problem 1: The sort feature in the UI (at least in Access 2007)  sorts based on the underlying field value regardless of what is displayed.  This could definitely be confusing to users.

Problem 2: The right-click filter-by-example feature  is REALLY misleading and flat out broken. The filtering options are based on the displayed value, but do nothing when you click them because they don’t match up with the underlying data-type of the field (usually). In Access 2007, this feature simply ignores your click when you try to use the feature whereas in earlier versions of Access it would throw a type mismatch error.

Filter-By-Example screenshot

Oops!

Thanks again to JamesL for pointing out the omission/error in the original article. I definitely want to make sure I am providing accurate and useful information in this blog, and rely on the watchful eye of my readers to keep me in line.

19 Tips for Recruiting Great Developers

1. The big job boards like Monster and Dice have become practically useless for hiring top tier talent.

It is easy to quickly obtain a pile of resumes using these services. However, this approach will have you shucking a heck of a lot of oysters to find a truly great Perl programmer. Several professional recruiters I know have given up on these boards except for staffing entry level positions like help-desk and phone support jobs. The odds of finding the proverbial rock star programmer on Monster are growing increasingly slim.

2. Niche job boards will get you qualified leads, but not very many of them.

High-end job boards like TheLadders charge a fee to the candidates and are as much a den of recruiters as the mainstream sites.  I find it hard to believe that top-tier talent is likely to pay to be listed on a job board.

Caveat: I have not personally used TheLadders as part of my recruiting efforts, but did briefly have a subscription as a candidate.

The really niche job boards like the one at JoelOnSoftware do a good job at pre-qualifying the candidates through self-selection, but maybe too much so.  I’ve listed a few jobs on this site for opportunities in Austin that generated almost no response. I suspect this is a better tool if you are in a bigger market like NYC or the silicon valley.

Actually Joel’s board does have a compelling strategy to draw higher quality candidates:

  • Trim back recruiter nonsense by forcing the advertiser to disclose in the ad who the candidate would actually be working for.
  • Asking advertisers to post their Joel’s Test score. Candidates who care about this are more likely to be passionate about their craft.

Despite my limited success with it, I’d still recommend the site given that there really is no financial risk.  I can personally attest to Joel’s “If it doesn’t work, you don’t pay” guarantee. We got our money back promptly with no hassle when the listing didn’t net any interview-worthy candidates.

3. Use LinkedIn Strategically

I have it on good authority that LinkedIn is a pretty strong source of candidates who are only passively looking and currently employed, which are generally traits of the better candidates. However, programmers don’t seem to frequent the job board on this site  as much as sales and management types.

That said, I  can’t really vouch for its job board when looking for developers based on my experience. However,  never before have you had such unprecedented access to the innards of another company’s org chart as LinkedIn provides. A few quick searches containing the name of  other companies in your industry will usually reveal developers with relevant experience in your industry.  This site is also used as a stealth way of looking for another job for people who don’t want their employer to catch them on a job board.

I was just NETWORKING, I promise!

4. The best candidates aren’t going to come to you.

There are exceptions to this, but I’m betting that you wouldn’t have read this far if you are recruiting within a company that the best programmers already yearn to work for. This advice is for the rest of us who don’t have the luxury of offering a job that would be a showstopper on a resume or turn heads at RenFest / Comic-Con.

Some managers, especially new ones, whose only experience with recruiting has been as a candidate desperately seeking an audience with a choice company, have the impression that their role as a hiring manager is akin to sitting atop a throne as candidates compete for their favor.  Not exactly.

There is a pool of candidates who are going to come to you, and their names will quickly become familiar because they will apply to every job posting you open even over several years. In most cases, there is a reason that someone else hasn’t snapped up these people and absent evidence to the contrary you probably don’t want to hire them either. If you aren’t willing to be proactive in your search and sometimes take on a more subservient posture when dealing with candidates, you are eventually going to force yourself to choose from this pool.

The top guns may only hit the open job market once in their careers, and from that point forward get subsequent jobs through networking, which brings me to my next point.

5. Networking is as essential for you as it is for the candidate.

Networking as a job-hunting strategy is a no-brainer, right? So what are you doing to make sure you are on the other end of that network for the right candidate?

Your existing team of developers is often a great entry point into a pretty substantial network of developers. Referral bonuses are the tried and true way to enlist employee help with the recruiting process, but often the prospect of working with a favored peer is a more powerful motivator.

Other benefits of this approach include:

  • The person who made the referral will to be invested in the success of the employee and likely will take an active role in bringing the new person up to speed.
  • Barriers to acceptance into the team will be reduced because the new person already has a relationship with at least one person.
  • You are more likely to get a true picture of what you are getting with the candidate without as much puffery as you might get interviewing strangers.

Warning: This doesn’t work so well with the mediocre programmers. The best developers try to hang with people smarter than themselves. Mediocre ones will seek out people to make them feel smarter. Don’t hire the wing-men.

6. Focus your search on finding developers, not job hunters.

Employers are going to hang on to their best people and keep them away from recruiters, recruiting events, and by extension you.

I’m not trying to imply that their bosses are actively prohibiting them from these types of contacts, but rather that they work hard to keep them happy and busy enough to not even try.

Developer conferences and user groups are a great way to contact engaged developers who may not be actively looking for work. They even triage themselves into sessions so you can more readily identify them by their area of expertise.

The best emissary to send to such an event is a development manager or supervisor. HR types are going to scare away the fish by being too sales-y and saying things like “Do you know Sea Pound?” and many programmers tend to be too introverted to make a lot of contacts.

I’ve a friend who recounted a tactic that had worked well at these events for him. He wore a t-shirt to the conference that read: “I’m hiring developers.”

7. Programming competitions

If you need a lot of developers and want them to triage themselves by skill AND aptitude, you might try sponsoring a programming competition. I’ve no personal experience with this approach, but I’ve seen a number of companies try it.

It definitely sounds good, but be careful to understand what you are looking for. These competitions seem to appeal to people who love puzzles, and those are types of programmers can often exhibit a pathology where they like tinkering and optimizing at the expense of getting a good-enough solution out the door.

8. Don’t expect to pay median salaries for top talent.

Often I see companies that claim to hire only the best, but their HR people argue that they should only have to pay the median salary as determined by salary surveys. Try that argument at a jeweler or sports car dealership and let me know how that works out.

How can you charge $200K for that diamond necklace when I can prove that the average piece of jewelry retails for $150?

If you want the top 10% of developers, you should expect to pay at least in the top 25 percentile, and you are only going to get off that cheap if you bring something else to the table like a cool product to work on,   good benefits, private offices, or some other perk.

9. Get the muggles out of the process as early as possible.

If at all possible, don’t force the candidates to endure even a phone interview with a non-technical person. If you can’t avoid it, at least strip out any technical questions from the interview script that the person performing the interview doesn’t understand well enough to talk about competently.

Let HR/Recruiters manage the scheduling, resume screening, benefits discussions, etc. , but don’t give them a phone interview script with technical questions and let them lose on the candidate.

10. Be flexible with your requirements.

If you need a .NET developer, don’t be a stickler for C# or VB.NET. The best programmers can become quickly proficient in just about any language, make sure that the person screening resumes understands what keywords are acceptable substitutes for the ones in the job description.

11. Branding is not just for cattle and marketing.

Branding is the act of creating and maintaining a positive image to grease the skids for selling people on your team or company. It is often confused with advertising, but it is a distinctly different animal. Branding is about managing your reputation and advertising is just one means to that end.

Creating an identity for your team that is attractive to potential recruits not only helps with sourcing candidates, but also adds ballast to your side of salary negotiations.

Brand characteristics that resonate with developers:

  • We have and hire the best developers – Top developers want to work with other top developers.
  • We work on cool products that your friends and family will be familiar with.
  • Our company is a meritocracy that values technical know-how above politics.
  • Our team keeps up with the latest technology and invests in training for developers.

Some techniques for advertising and reinforcing your brand:

  • Sponsoring developer conferences and events
  • Developer Oriented User Groups – Often you can get a plug on the cheap by buying the pizza or contributing a few give-away items like t-shirts or books.
  • Support Open Source Projects under the name of the company.
  • Offer unusual perks that appeal to programmers and then submit a press release about it to local media outlets.

12. Understand your needs and recruit for that.

This seems too obvious to mention, but is probably the easiest mistake to make. Clearly define what you expect the new hire to do every day and hire someone that can do that job every day and enjoy it.

Some guidance in this area:

  • Don’t hire based on interviewing skills unless you need a sales guy.
  • Don’t hire based on management skills unless there is potential for them to lead or manage in the near term.
  • Don’t hire a clone of yourself or your best employee, you already have that. Hire someone that complements what you already have.
  • Hire for what you need NOW, not what you think you will need later.

13. Ignore your instincts during the interview

Your tendency during an interview is to form an opinion quickly at the start. Your mind is wired to preserve its own worldview and will often fight against all evidence to protect that initial judgment.

To remain objective and overcome jumping to conclusions, consciously decide to go harder on the people you like and easier on the ones you don’t. Otherwise you will be inclined to do the opposite and just reinforce a your initial impressions and waste a chance to learn more about the person in front of you.

14. Trust your instincts when making the final hiring decision

Trust your gut whenever you are the slightest bit uneasy.  At my own peril I have several times learned the hard way that losing a good candidate is far preferable to hiring a bad one. For the dozens of people I have hired in my career, there have been a number of people I was sure would be great and turned out to be just so-so, but  I have never hired someone that I was unsure about that turned out to be a great employee.

At each step of the process separate your candidates into two piles:

Yes: From what I know so far, I could hire this person without reservation.

No: Everyone that doesn’t pass the criteria for the yes pile. Includes anyone who is a “Maybe” or a “Yes, but…”

15. Just say no to puzzle problems.

First, see item 7  about the problem with logic puzzles.

Second, these things tend to annoy really good programmers who don’t like make-work or meta problems.

Don’t kid yourself that “you just want to see how they think.” Knowing that someone can come up with a clever way to estimate the number of boat trips required to determine which switch turns off Mt. Fuji is fun conversation, but a waste of everyone’s time.

Alternative approaches to evaluating a candidate:

  • Rough-out an application architecture on the white-board for this scenario.
  • Role-play with them a troubleshooting scenario for a challenging problem you have worked through.
  • Get code samples.
  • Ask them to describe an application they have built and ask probing questions to make sure you understand their level of contribution to that project.

16. Write an interview script and test it on your current team

Write interview scripts (for each job title/level) and keep your notes for each candidate.

Good reasons to use standardized interview script

  • Less room for ad-hoc questions helps you avoid favoritism (see #13).
  • Documentation of  equal treatment of candidates to defend against potential hiring discrimination claims.
  • Easier apples-to-apples comparison of candidates..

Tips for refining your interview script

  • Test it on current employees – Did it draw out the important positive and negative aspects of that employee? Tweak it until it does.
  • Get current employee feedback on the script – Any offensive/insulting questions? Do they think it would help or hurt the perception of the company for the interviewee?
  • Review your interview notes one year after the hire. Were there any surprises? Tweak the script to prevent similar surprises next time.
  • Review your script for and remove questions that require  specialized knowledge that only a current employee would have.

17. Don’t leave people hanging.

If your company’s recruiting process is interminably slow and out of your control, take it upon yourself to call your short-list candidates and frequently re-assure them that things are progressing. The best developers are going to be highly recruited. Don’t assume that just because someone submits a resume that they are somehow locked-in and will be forced to give you first right of refusal.

I’ve heard and been part of stories of companies calling back EIGHT MONTHS after a resume was submitted to ask for an interview. This is crazy. Even if by some miracle that person was still on the market after that long, clearly they have been passed over by just about everyone else in the interim. Why would you even want them after so much time has passed?

18. Recruit former employees

Face it, your top people get recruited heavily and eventually will jump ship to see if the grass is greener, even if it isn’t.

Good employees that have left your team in are a great source of new hires for several reasons:

  • You know what you are getting and so do they.
  • Previous employees can become productive much more quickly.
  • You can recoup some of your previous training investment.

Even if you can’t convince them to come back, the fact that you want them back is an ego boost for them and will often create some goodwill and improve your branding by creating an advocate that works with a lot of other developers who you might be interested in recruiting.

Some preemptive steps to increase your  odds of re-hiring a good employee later:

  • Give them a final chance to give honest feedback about the aspects of the job they didn’t like and communicate your desire to fix those things for the rest of the team.
  • Organize a happy hour and give them a great send-off.
  • Give them a souvenir of their employment to take with them that will remind them of their friends at the job.
  • Keep in touch, and not just when you need something.
  • Call to ask how their new job is going and solicit advice on things they like about the new job that you could try.
  • Continue to make sure they are invited to happy hours to keep the ties with their former co-workers strong.

I have re-hired several employees during my career as a software development manager who have turned out to be some of the best programmers on the team.

19. Mind your karma and don’t make enemies

Don’t be an ass when developers leave the company, whatever the circumstances. It doesn’t matter if you never want to see this person darken your doorstep again. Also, treat every candidate who took the time to apply with respect, even if they were completely unqualified. Word of mouth is a powerful thing and this industry isn’t as big as you might think. Chances are that these people will talk to someone about your company that you one day will want as an employee or customer.

Wanted: Universal Key to Open Our Front Door

This requirement came across my desk recently as part of an RFP from a government agency that will remain nameless.

4.20     Data Decryption

The agency may request the service of decrypting of source materials for which the decryption algorithm and/or decryption keys are unknown.  The Offeror must provide a list of decryption protocols for which they can offer this service and any other restrictions their tools or methods create (e.g., AES256 decryption).

To provide some context, this wasn’t part of military or intelligence effort to snoop on foreign governments or a white-hat project to validate the security of encryption protocols. No, this was an administrative agency that had collected a bunch of documents from its employees and possibly from other agencies/companies and needed to import them into a content management system.

The implicit assumption is that there is an industry standard tool that can decrypt an arbitrary file and do it quickly enough to run it against an arbitrary number of files in a reasonable amount of time at a reasonable cost per document. They just need a company to run that tool as part of an import workflow.

I’m by no means a cryptography expert, but even assuming I had absolutely no knowledge of security or computers beyond the definition of encryption I think I could detect the major problems with this request.

Translating out the techno-geekery makes the paradox quite apparent.

Translation: We have used technology to secure our files so that no outside person can unlock and read them without our secret key. We are looking for an outside person to unlock and read these files for us without the key.

Mr. Obvious says: If you really believe this capability is readily available and can be done cheaply why do you bother encrypting files in the first place?

Mr.  Paranoid says: Is the RFP a pernicious plot to lure black-hat hackers into the open so they can be escorted to Guantanamo promptly by a guy in an overcoat?

Mr. Sarcastic says: If a black-hat hacker had this technology, wouldn’t he/she be better off using it to hack into the bank and just take the Government’s money rather than bidding on a contract?

The unspoken truth about managing geeks (Article Review)

Just finished reading “The Unspoken Truth about Managing Geeks” written by Jeff Ello and was blown away by how insightful his assessment of the psychology of IT workers was and how gosh darn practical his advice was on structuring an organization and managing technical people to maximum effect.

This is not just another blog article that rehashes something we already know, it is a refreshing new look on the consequences and reasons for behaviors and attitudes that we observe and identify with in our careers programming or managing programmers.

I encourage you to read the entire article, but here are some choice bits that really hit home for me.

“Few people notice this, but for IT groups respect is the currency of the realm. IT pros do not squander this currency. Those whom they do not believe are worthy of their respect might instead be treated to professional courtesy, a friendly demeanor or the acceptance of authority. Gaining respect is not a matter of being the boss and has nothing to do with being likeable or sociable; whether you talk, eat or smell right; or any measure that isn’t directly related to the work. The amount of respect an IT pro pays someone is a measure of how tolerable that person is when it comes to getting things done, including the elegance and practicality of his solutions and suggestions. IT pros always and without fail, quietly self-organize around those who make the work easier, while shunning those who make the work harder, independent of the organizational chart.”

Ego, as it plays out in IT, is an essential confidence combined with a not-so-subtle cynicism. It’s not about being right for the sake of being right but being right for the sake of saving a lot of time, effort, money and credibility. IT is a team sport, so being right or wrong impacts other members of the group in non-trivial ways. Unlike in many industries, in IT, colleagues can significantly influence the careers of the entire team. Correctness yields respect, respect builds good teams, and good teams build trust and maintain credibility through a healthy projection of ego. Strong IT groups view correctness as a virtue, and certitude as a delivery method. Meek IT groups, beaten down by inconsistent policies and a lack of structural support, are simply ineffective at driving change and creating efficiencies, getting mowed over by the clients, the management or both at every turn.”

The victim mentality — IT pros are sensitive to logic — that’s what you pay them for. When things don’t add up, they are prone to express their opinions on the matter, and the level of response will be proportional to the absurdity of the event. The more things that occur that make no sense, the more cynical IT pros will become. Standard organizational politics often run afoul of this, so IT pros can come to be seen as whiny or as having a victim mentality. Presuming this is a trait that must be disciplined out of them is a huge management mistake. IT pros complain primarily about logic, and primarily to people they respect. If you are dismissive of complaints, fail to recognize an illogical event or behave in deceptive ways, IT pros will likely stop complaining to you. You might mistake this as a behavioral improvement, when it’s actually a show of disrespect. It means you are no longer worth talking to, which leads to insubordination.”

“Insubordination — This is a tricky one. Good IT pros are not anti-bureaucracy, as many observers think. They are anti-stupidity. The difference is both subjective and subtle. Good IT pros, whether they are expected to or not, have to operate and make decisions with little supervision. So when the rules are loose and logical and supervision is results-oriented, supportive and helpful to the process, IT pros are loyal, open, engaged and downright sociable. Arbitrary or micro-management, illogical decisions, inconsistent policies, the creation of unnecessary work and exclusionary practices will elicit a quiet, subversive, almost vicious attitude from otherwise excellent IT staff. Interestingly, IT groups don’t fall apart in this mode. From the outside, nothing looks to be wrong and the work still gets done. But internally, the IT group, or portions of it, may cut themselves off almost entirely from the intended management structure. They may work on big projects or steer the group entirely from the shadows while diverting the attention of supervisors to lesser topics. They believe they are protecting the organization, as well as their own credibility — and they are often correct.”

“Unlike in many industries, the fight in most IT groups is in how to get things done, not how to avoid work. IT pros will self-organize, disrupt and subvert in the name of accomplishing work. An over-structured, micro-managing, technically deficient runt, no matter how polished, who’s thrown into the mix for the sake of management will get a response from the professional IT group that’s similar to anyone’s response to a five-year-old tugging his pants leg. What IT pros want in a manager is a technical sounding board and a source of general direction. Leadership.”

Finally, executives should have multiple in-points to the IT team. If the IT team is singing out of tune, it is worth investigating the reasons. But you’ll never even know if that’s the case if the only information you receive is from the CIO. Periodically, bring a few key IT brains to the boardroom to observe the problems of the organization at large, even about things outside of the IT world, if only to make use of their exquisitely refined BS detectors. A good IT pro is trained in how to accomplish work; their skills are not necessarily limited to computing. In fact, the best business decision-makers I know are IT people who aren’t even managers.”

The unspoken truth about managing geeks

The Programmer’s Guide to Getting Hired: Cover Letters

The good news for job seekers, at least if you trust this poll, is that the requirement of a cover letter appears to be waning somewhat. This most likely has a lot to do with the shift towards sourcing by querying resume databases in lieu of the traditional correspondence directly with a hiring manager approach.

Here is some advice from my perspective as a technical hiring manager regarding cover letters.  Understand that this advice is completely based on my own experience and perspective and may not apply in all situations. Hiring managers and HR people are unique individuals each with their own preferences and biases that may differ from my own.

Send a cover letter when…

  • The job posting specifically requests it.
  • You have names to drop: Someone referred you, or you have a connection at the company that can vouch for you.
  • You are a really good persuasive writer and showcasing your writing skills in a document other than a highly formatted resume will help your chances.
  • You want to call out something specific on your resume.

Things to avoid:

  • Never apologize for things or call out negatives.

“The 2 your gap in my career was because…” – Bad

“I don’t have this skill you were asking for, but…” – Bad

  • Don’t write a thesis. Hiring managers have enough to read. Have a point and get to it quickly.
  • Don’t bother saying you are a perfect fit for the position, everyone says that and it just wastes space. Demonstrate it by mapping the job requirements to your experience.
  • Never send a cover letter than looks like a template or form letter. It should look like you wrote it in response to the specific job you are applying for. Those templating tools for cover letters on Monster.com and Dice where you can apply to a job with one click are the Devil.
  • Never address them to “To whom it may concern.” Do some digging and find out who the hiring manager is. In the age of LinkedIn it isn’t all that hard.

Things to consider:

  • If you feel you must include a cover letter, but don’t have any value to add in it, keep it very short (transmittal letter style).

“I would like to be considered for the XYZ position that I saw posted on Monster.com. Attached is my resume. You can contact me at…”

  • Have someone proofread your cover letter, not just your resume.
  • Getting a proofreader is doubly important if the cover letter isn’t in a language that you are extremely proficient in. Broken English resumes do untold harm to candidates.

Further Reading

This article is part of  a the  “Programmer’s Guide to Getting Hired” series.  If you enjoyed it, you might also like these: