Comparatively, Perl doesn’t fall into a recognizable niche. The problem with that lies in the reason Perl was created in the first place. The language, created by the Larry Wall in 1987, was designed to be more of a Swiss Army knife than a language like C, which seeks to optimize memory usage. The idea behind the language was to counter the complexity of C by providing a language that was easy to use and quick to write. Jeremy Pickett, a former PayPal developer said when referring to Perl, “It is a seriously good multi-platform, easy to learn, easy to port language that can save your bacon. Centos 5.x memory debug? No problem. Windows 2k8 registry audit? Let’s go! Web server? Done and done. Pen testing tool? Don’t even get me started.”
Jeremy’s quote fits the principle of the Perl language, which is, “get the job done.” An experienced developer can immediately see the problem that then arises when you want to hire a developer who’s ethos is to use a monkey wrench to solve a problem when an elegant solution can be had. And because the barrier to competence is so low due to the one size fits all philosophy of the language, you have a pool of mediocre talent who’ve probably only learned Perl to deal with automation issues. To compound this problem of availability, the problems that Perl attempts to solve are in-house. You don’t really need a Perl developer until you need one, in a sense. Companies aren’t building their tech stacks with Perl, they’re just solving industry specific problems with the language, problems that don’t require a team of developers. This means Computer Science students eager for work, will likely ignore Perl in favor of Python or C++.
This is not to say that there aren’t great Perl developers out there. The Perl 5 community features CPAN, a library of modules created by Perl developers. You can find active developers on PerlMonks and Perl’s subreddit. Perl Mongers is a group of Perl developers who meet locally to discuss changes to the language. The talent is out there. It’s up to a Hiring Manager to know who to look for and what to ask. For example, one shouldn’t adhere to the misconception that Perl 6 is an upgrade to Perl 5. Rather, Perl 6 is more of a rebranding that allows beginner and hackers easier access to the language. Simply, Wall saw how accessible Ruby was and decided to make a Perl version of it, saying in a conference in 2000, “In Perl 6, we decided it would be better to fix the language than fix the user.”
Perl 6 fixed some issues, but the community is small and there are very few reliable modules for a developer to work with. For now, the only recourse is to focus on the current Perl 5 developers. Within that pool, you want to select developers who have matured beyond the Perl philosophy and have applied practises like continuous integration that ensure that their code is maintainable and, thus, scalable.
Aside from ensuring that your candidate has read Perl Best Practices by Damian Conway, here are some questions that chromatic provided in his blog post if you’re planning on hiring a Perl developer.
- What do variable sigils indicate in Perl 5?
- What’s the difference between accessing an array element with $items[$index] and @items[$index]?
- What’s the difference between == and eq?
- What do you get if you evaluate a hash in list context?
- How do you look up keywords in the Perl documentation?
- What is the difference between a function and a method in Perl 5?
- When does Perl 5 reclaim the memory used by a variable?
- How do you ensure that the default scope of a variable is lexical?
- How do you load and import symbols from a Perl 5 module?
- What governs how Perl 5 loads modules How can you influence the list of directories from which perl attempts to load modules?
- How do you look up error messages in the Perl 5 documentation? (Award bonus points for knowing how to enable explanations of all error messages encountered.)
- What happens when you pass an array into a function?
- How do you pass one or more distinct arrays into a function?
- What is the difference, on the caller side, between return; and return undef;?
- Where do tests go in a standard CPAN distribution?
- How do you run tests in a standard CPAN distribution?
- What command do you use to install new distributions from the CPAN?
- Why would you use the three-argument form of the open builtin?
- How do you detect (and report) errors from system calls such as open? (Award bonus points for knowing how to enable automatic detection and reporting of errors.)
- How do you throw an exception in Perl 5?
- How do you catch an exception in Perl 5?
- What is the difference between reading a file with for and with while?
- How do you handle parameters within a method or function in Perl 5?
- What do parentheses around the variable name in my ($value) = @_; mean, and what would happen if you removed them?
- Is new a builtin function/keyword?
- How do you read the documentation of a core library? A CPAN module?
- How do you access only the values of a Perl 5 hash?
If those questions weren’t enough to ease your difficulty, here are some more questions provided by a Stack Overflow user.
- What is a reference?
- How does Perl implement object orientation?
- How does Perl’s object orientation differ from other languages like C# and Java?
- Traditional object orientation in core Perl has largely been superseded by what?
- What is the difference between a package and a module?
- What features were implemented in 5.10?
- What is a Schwartzian transform?
- Explain the difference between these lines of code and the values of the variables.
- my $a = (4, 5, 6); my @a = (4, 5, 6); my $b = 4, 5, 6; my $c = @a;
- What are some of Perl’s greatest strengths?
- What are some of Perl’s greatest weaknesses?
- Name several hallmarks of the “modern Perl” movement.
- What does the binding operator do?
- What does the flip-flop operator do?
- What is the difference between for and foreach?
- What makes Perl difficult to parse?
- What are prototypes?
- What is AUTOLOAD?
- What is the Perl motto?
- Why is this a problem?
- What does use strict; do? Why is it useful?
- What does the following block of code do?
- print (3 + 4) * 2;
- Implement grep using map.
- Implement and use a dispatch table.
- Given a block of text, replace a word in that block with the return value of a function that takes that word as an argument.
- Implement a module, including documentation compatible with perldoc.
- Slurp a file.
- Draw a table that illustrates Perl’s concept of truthiness.
Perl isn’t a flashy language. But software development isn’t a flashy occupation either. Sometimes, to fix a system, you just need a language that can get the job done. For that, you need a Perl programmer who has stuck with the language despite its faults when other have run off to trending languages. They’re hard to find. But they’re out there, hacking away at modules that will optimize your workflow.