http://www.perlmonks.org?node_id=638927

Yeah, me too. But I'm a capitalist, so I like to see what people are writing checks for. As I'm fed up with the various unsubstantiated claims, I've whipped up a little graphic that will hopefully cheer you up. I'll try to keep it updated regularly.

If nothing else, it'll give us all something to watch as we're overtaken by our Ruby and Python overlords.

Update:
Hmm, based on my weblogs, this seems to have generated a little buzz. Anyway, after a night to sleep on it, I've made some minor changes to better indicate my motivation. I'm not just trying to pimp Perl. I really want to know what the situation is, without all the FUD and religious debate. After all, the chart isn't all good news for Perl: the upticks in Ruby and Python in the past 10 months are important to watch when plotting a career path or making project decisions. It'll be interesting to see the direction of the trend (thnx to perrin for the indeed.com link below).

I've been asked to provide the code, so here it is; be advised the DICE screen scrape is pretty brute force, and highly subject to any CGI or format changes DICE might apply in future; and the FTP code has been altered:

Update 2: posted revised code that produces a better looking chart.

Update 3: yet another code revision:

use Socket; use Net::FTP; use LWP::Simple; use DBI; use strict; use warnings; my %queries = ( 'Perl', [ 'http://seeker.dice.com/jobsearch/servlet/JobSearch?LOCATION_OPTION=2& +N=0&Hf=0&Ntk=JobSearchRanking&op=300&values=&FREE_TEXT=perl&Ntx=mode+ +matchall&AREA_CODES=&AC_COUNTRY=1525&WHERE=&RADIUS=64.37376&ZC_COUNTR +Y=1525&COUNTRY=1525&STAT_PROV=0&METRO_AREA=33.78715899%2C-84.39164034 +&TRAVEL=0&TAXTERM=0&SORTSPEC=0&FRMT=0&DAYSBACK=10&NUM_PER_PAGE=50&x=3 +3&y=14', 'http://seeker.dice.com/jobsearch/servlet/JobSearch?LOCATION_OPTION=2& +N=0&Hf=0&Ntk=JobSearchRanking&op=300&values=&FREE_TEXT=perl+and+%28ph +p+or+python+or+ruby%29&Ntx=mode+matchboolean&x=50&y=8&AREA_CODES=&AC_ +COUNTRY=1525&WHERE=&RADIUS=64.37376&ZC_COUNTRY=1525&COUNTRY=1525&STAT +_PROV=0&METRO_AREA=33.78715899%2C-84.39164034&TRAVEL=0&TAXTERM=0&SORT +SPEC=0&FRMT=0&DAYSBACK=10&NUM_PER_PAGE=50', 'http://seeker.dice.com/jobsearch/servlet/JobSearch?LOCATION_OPTION=2& +N=0&Hf=0&Ntk=JobSearchRanking&op=300&values=&FREE_TEXT=perl&Ntx=mode+ +matchall&SEARCH_TITLE_ONLY=1&AREA_CODES=&AC_COUNTRY=1525&WHERE=&RADIU +S=64.37376&ZC_COUNTRY=1525&COUNTRY=1525&STAT_PROV=0&METRO_AREA=33.787 +15899%2C-84.39164034&TRAVEL=0&TAXTERM=0&SORTSPEC=0&FRMT=0&DAYSBACK=10 +&NUM_PER_PAGE=30&x=40&y=8', ], 'PHP', [ 'http://seeker.dice.com/jobsearch/servlet/JobSearch?LOCATION_OPTION=2& +N=0&Hf=0&Ntk=JobSearchRanking&op=300&values=&FREE_TEXT=php&Ntx=mode+m +atchall&AREA_CODES=&AC_COUNTRY=1525&WHERE=&RADIUS=64.37376&ZC_COUNTRY +=1525&COUNTRY=1525&STAT_PROV=0&METRO_AREA=33.78715899%2C-84.39164034& +TRAVEL=0&TAXTERM=0&SORTSPEC=0&FRMT=0&DAYSBACK=10&NUM_PER_PAGE=50&x=33 +&y=14', 'http://seeker.dice.com/jobsearch/servlet/JobSearch?LOCATION_OPTION=2& +N=0&Hf=0&Ntk=JobSearchRanking&op=300&values=&FREE_TEXT=php+and+%28per +l+or+python+or+ruby%29&Ntx=mode+matchboolean&x=50&y=8&AREA_CODES=&AC_ +COUNTRY=1525&WHERE=&RADIUS=64.37376&ZC_COUNTRY=1525&COUNTRY=1525&STAT +_PROV=0&METRO_AREA=33.78715899%2C-84.39164034&TRAVEL=0&TAXTERM=0&SORT +SPEC=0&FRMT=0&DAYSBACK=10&NUM_PER_PAGE=50', 'http://seeker.dice.com/jobsearch/servlet/JobSearch?LOCATION_OPTION=2& +N=0&Hf=0&Ntk=JobSearchRanking&op=300&values=&FREE_TEXT=php&Ntx=mode+m +atchall&SEARCH_TITLE_ONLY=1&AREA_CODES=&AC_COUNTRY=1525&WHERE=&RADIUS +=64.37376&ZC_COUNTRY=1525&COUNTRY=1525&STAT_PROV=0&METRO_AREA=33.7871 +5899%2C-84.39164034&TRAVEL=0&TAXTERM=0&SORTSPEC=0&FRMT=0&DAYSBACK=10& +NUM_PER_PAGE=30&x=40&y=8', ], 'Python', [ 'http://seeker.dice.com/jobsearch/servlet/JobSearch?LOCATION_OPTION=2& +N=0&Hf=0&Ntk=JobSearchRanking&op=300&values=&FREE_TEXT=python&Ntx=mod +e+matchall&AREA_CODES=&AC_COUNTRY=1525&WHERE=&RADIUS=64.37376&ZC_COUN +TRY=1525&COUNTRY=1525&STAT_PROV=0&METRO_AREA=33.78715899%2C-84.391640 +34&TRAVEL=0&TAXTERM=0&SORTSPEC=0&FRMT=0&DAYSBACK=10&NUM_PER_PAGE=50&x +=33&y=14', 'http://seeker.dice.com/jobsearch/servlet/JobSearch?LOCATION_OPTION=2& +N=0&Hf=0&Ntk=JobSearchRanking&op=300&values=&FREE_TEXT=python+and+%28 +php+or+perl+or+ruby%29&Ntx=mode+matchboolean&x=50&y=8&AREA_CODES=&AC_ +COUNTRY=1525&WHERE=&RADIUS=64.37376&ZC_COUNTRY=1525&COUNTRY=1525&STAT +_PROV=0&METRO_AREA=33.78715899%2C-84.39164034&TRAVEL=0&TAXTERM=0&SORT +SPEC=0&FRMT=0&DAYSBACK=10&NUM_PER_PAGE=50', 'http://seeker.dice.com/jobsearch/servlet/JobSearch?LOCATION_OPTION=2& +N=0&Hf=0&Ntk=JobSearchRanking&op=300&values=&FREE_TEXT=python&Ntx=mod +e+matchall&SEARCH_TITLE_ONLY=1&AREA_CODES=&AC_COUNTRY=1525&WHERE=&RAD +IUS=64.37376&ZC_COUNTRY=1525&COUNTRY=1525&STAT_PROV=0&METRO_AREA=33.7 +8715899%2C-84.39164034&TRAVEL=0&TAXTERM=0&SORTSPEC=0&FRMT=0&DAYSBACK= +10&NUM_PER_PAGE=30&x=40&y=8', ], 'Ruby', [ 'http://seeker.dice.com/jobsearch/servlet/JobSearch?LOCATION_OPTION=2& +N=0&Hf=0&Ntk=JobSearchRanking&op=300&values=&FREE_TEXT=ruby&Ntx=mode+ +matchall&AREA_CODES=&AC_COUNTRY=1525&WHERE=&RADIUS=64.37376&ZC_COUNTR +Y=1525&COUNTRY=1525&STAT_PROV=0&METRO_AREA=33.78715899%2C-84.39164034 +&TRAVEL=0&TAXTERM=0&SORTSPEC=0&FRMT=0&DAYSBACK=10&NUM_PER_PAGE=50&x=3 +3&y=14', 'http://seeker.dice.com/jobsearch/servlet/JobSearch?LOCATION_OPTION=2& +N=0&Hf=0&Ntk=JobSearchRanking&op=300&values=&FREE_TEXT=ruby+and+%28ph +p+or+python+or+perl%29&Ntx=mode+matchboolean&x=50&y=8&AREA_CODES=&AC_ +COUNTRY=1525&WHERE=&RADIUS=64.37376&ZC_COUNTRY=1525&COUNTRY=1525&STAT +_PROV=0&METRO_AREA=33.78715899%2C-84.39164034&TRAVEL=0&TAXTERM=0&SORT +SPEC=0&FRMT=0&DAYSBACK=10&NUM_PER_PAGE=50', 'http://seeker.dice.com/jobsearch/servlet/JobSearch?LOCATION_OPTION=2& +N=0&Hf=0&Ntk=JobSearchRanking&op=300&values=&FREE_TEXT=ruby&Ntx=mode+ +matchall&SEARCH_TITLE_ONLY=1&AREA_CODES=&AC_COUNTRY=1525&WHERE=&RADIU +S=64.37376&ZC_COUNTRY=1525&COUNTRY=1525&STAT_PROV=0&METRO_AREA=33.787 +15899%2C-84.39164034&TRAVEL=0&TAXTERM=0&SORTSPEC=0&FRMT=0&DAYSBACK=10 +&NUM_PER_PAGE=30&x=40&y=8', ], ); my %baseline = (qw/ Perl 4150 PHP 1073 Python 665 Ruby 232 /); my @ltime = split /\s+/, scalar localtime(); my $ltime = join('-', $ltime[-1], $ltime[1], $ltime[2]); my %results = (); my ($k, $url); my $localin = 0; my $localout = 0; foreach (@ARGV) { $localin = 1, next if ($_ eq '-f'); $localout = 1 if ($_ eq '-n'); } if ($localin) { open INF, "langjobs.csv" or die $!; my @jobs = <INF>; close INF; chomp $jobs[-1]; pop @jobs and chomp $jobs[-1] while (@jobs && ($jobs[-1] eq '')); ($ltime, $results{Perl}[0], $results{Perl}[1], $results{Perl}[2], $results{PHP}[0], $results{PHP}[1], $results{PHP}[2], $results{Python}[0], $results{Python}[1], $results{Python}[2], + $results{Ruby}[0], $results{Ruby}[1], $results{Ruby}[2]) = split ';', $jobs[-1]; } else { $results{$k} = [ fetchCount("$k only", $url->[0]), fetchCount("$k plus", $url->[1]), fetchCount("$k titles", $url->[2]), ] while (($k, $url) = each %queries); # # now append the results to the CSV file # open INF, ">>langjobs.csv" or die $!; print INF join(';', $ltime, @{$results{Perl}}, @{$results{PHP}}, @ +{$results{Python}}, @{$results{Ruby}}), "\n"; close INF; } my $dbh = DBI->connect('dbi:Chart:', undef, undef) or die "Can't connect for charting: " . $DBI::errstr; $dbh->do('create chart currjobs (language varchar(60), total integer)' +); $dbh->do('create chart basejobs (language varchar(60), total integer)' +); $dbh->do('create chart titles_only (language varchar(60), total intege +r)'); $dbh->do('create chart mixedjobs (language varchar(60), total integer) +'); my $sth = $dbh->prepare('insert into currjobs values(?, ?)') or die $d +bh->errstr; $sth->execute($_, $results{$_}[0]) foreach (sort keys %results); $sth = $dbh->prepare('insert into basejobs values(?, ?)') or die $dbh- +>errstr; $sth->execute($_, $baseline{$_}) foreach (sort keys %results); $sth = $dbh->prepare('insert into titles_only values(?, ?)') or die $d +bh->errstr; $sth->execute($_, $results{$_}[2]) foreach (sort keys %results); $sth = $dbh->prepare('insert into mixedjobs values(?, ?)') or die $dbh +->errstr; $sth->execute($_, $results{$_}[1]) foreach (sort keys %results); $sth = $dbh->prepare("select image, imagemap from (select barchart from currjobs where COLORS IN ('gold', 'lblue', 'lgreen', 'lred') AND SHOWVALUES=1) current, (select barchart from basejobs where COLORS IN ('gray', 'gray', 'gray', 'gray') AND SHOWVALUES=1) baseline, (select barchart from titles_only where COLORS IN ('lorange', 'blue', 'green', 'red') AND SHOWVALUES=1) titles_only, (select barchart from mixedjobs where COLORS IN ('orange', 'dblue', 'dgreen', 'dred') AND SHOWVALUES=1) mixed where WIDTH=550 AND HEIGHT=450 AND X_AXIS=' ' AND Y_AXIS='Total Jobs' AND TITLE='DICE Results For $ltime (10 Days/No restrict/all locs)' AND FORMAT='PNG' AND SHOWGRID=1 AND MAPNAME='langjobs' AND MAPTYPE='HTML' AND X_ORIENT='HORIZONTAL' AND KEEPORIGIN=1 ") or die $dbh->errstr; $sth->execute; my $row = $sth->fetchrow_arrayref; open HTMLF , ">langjobs.html" or die $!; print HTMLF <<"EOHTML"; <html> <head><title>Dynamic Language Jobs Barometer for $ltime</title></head> <body> <table border=0> <tr><td align=left> <i>The rumors of my death have been greatly exaggerated.</i></td></tr> <tr><td align=right>- Mark Twain</td></tr> </table> <p> <h2>Dynamic Languages Jobs Barometer</h2> <h3>Total Jobs For Dynamic Languages on <a href='http://www.dice.com'> +DICE</a> for $ltime</h3> Each language has <ul> <li>a light bar for its overall total, <li>a gray bar for a baseline value from Nov. 15, 2006 <li>a medium bar for titles-only search results <li>a dark bar for listings which overlap any of the other languages. </ul> <p> <img src='langjobs.png' usemap='#langjobs' title='Barchart of job list +ings by language' border=0> <p> A comparative trendline is available at <a href='http://www.indeed.com/jobtrends?q=perl%2Cpython%2Cphp%2Cruby& +l='>indeed.com</a> <i>(thanks to <a href='http://www.perlmonks.com/?node_id=104919'>perri +n</a> for the link)</i>. <p> <p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='http://www.presicie +nt.com'>[ Presicient Home ]</a> <!-- BEGIN AREAMAP --> $row->[1] </body> </html> EOHTML close HTMLF; open IMAGEF, ">langjobs.png" or die $!; binmode IMAGEF; print IMAGEF $row->[0]; close IMAGEF; unless ($localout) { # # now ftp it up # my $ftp = Net::FTP->new('ftp.somedomain.com', Passive => 1) or die "Cannot connect: $@"; $ftp->login('userid','password') or die "Cannot login ", $ftp->message; print "Connected, sending HTML\n"; $ftp->ascii(); $ftp->put('langjobs.html'); print "Sending image\n"; $ftp->binary(); $ftp->put('langjobs.png'); $ftp->quit; } sub fetchCount { my ($k, $url) = @_; sleep 3; my $result = get $url; warn "** No result for $k" and return 0 unless $result; $result=~tr/\n/ /; $result=~s/\s+/ /gs; my ($count) = ($result=~/\b1\s*-\s*\d+\s+of\s+(\d+)\s+jobs/); warn "Can't find count for $k\n" and return 0 unless defined $count; print "***$k: $count\n"; return $count; }


Perl Contrarian & SQL fanboy

Replies are listed 'Best First'.
Re: Tired of "Perl is dead" FUD ?
by perrin (Chancellor) on Sep 14, 2007 at 02:34 UTC
      Ahh, thanks for that. I was looking for some trending data, but had no idea where it might be got (for free, anyway).

      I'm going to try and dig up some datapoints I had from about a year ago, and put them in my chart for comparison.


      Perl Contrarian & SQL fanboy
      Easily compared with this
Re: Tired of "Perl is dead" FUD ?
by kyle (Abbot) on Sep 14, 2007 at 04:06 UTC

    I'd be interested to see the details of the mixes. That is, if employers want Perl and something else, what is the something else, usually?

      Unfortunately (at least where I live) perl is usually required (along with shells, databases) not for programming jobs, but for nasty, boring, system administration jobs. :-(

      -David.

        I've been doing nasty, boring system administration jobs for over 20 years now. At least the last several years doing the job with the help of Perl have been far more productive and interesting than what went before. :-)

        Cheers,

        JohnGG

        After changing jobs from software developer to database developer, I find many more cases where Perl is a perfect tool because I'm now working closer to databases. While I have no wish to move to a full DBA or system administration job, this is working out well with about 70% development and 30% DBA work.

        It seems that some DBA jobs are actually interesting Perl developer jobs in disguise.
Re: Tired of "Perl is dead" FUD ?
by blazar (Canon) on Sep 14, 2007 at 13:39 UTC
    Yeah, me too. But I'm a capitalist, so I like to see what people are writing checks for. As I'm fed up with the various unsubstantiated claims, I've whipped up a little graphic that will hopefully cheer you up. I'll try to keep it updated regularly.

    Claims Keynes that "Capitalism is the absurd belief that the worst of men, for the worst of reasons, will somehow work for the benefit of us all." So why are you sharing this graphic with us? ;-)

      Under capitalism, man exploits his fellow man; under socialism, the reverse is true. – Robert Anton Wilson (I believe; at least that's where I recall reading it)
        The quote is attributed to "Ben Tucker, a famous Vaudeville comedian"; but appears to refer to Benjamin R. Tucker, a famous Anarchist. However, I am unable to find any quotes by Benjamin Tucker that approximate that sentiment. It could be that RAW wrote it and made up the attribution.

      That's just one more piece of evidence that Keynes didn't understand capitalism. That's pretty amusing, considering he actually was a capitalist. He just wasn't a free market capitalist.

      He probably meant to say that about free market capitalism, and wasn't clear enough in his head about economic systems to differentiate between that and capitalism in the generic. In any case, capitalism is not the absurd belief that the worst of men, for the worst of reasons, will somehow work for the benefit of us all. Instead, it's the belief that wide-scale economic managers are no better than other people, and as such will overall do much worse for "the benefit of us all" than the emergent properties of natural economic processes -- and will have to violate individual rights in the attempt at economic management.

      Back on topic:

      So why are you sharing this graphic with us?

      Maybe it's because, regardless of what Keynes may have thought, it's still useful information for people interested in making money with their Perl skills.

      print substr("Just another Perl hacker", 0, -2);
      - apotheon
      CopyWrite Chad Perrin

Re: Tired of "Perl is dead" FUD ?
by wolfger (Deacon) on Sep 18, 2007 at 13:17 UTC

    <MontyPython>I'm not dead yet!</MontyPython>

    While Perl certainly isn't dead, I think it's seriously declining. New flavors of Linux seem to all be preferring Python. Perl isn't getting the love it once did.

      I'd be interested to see the family tree of these new Linux flavors that favor Python over Perl.

      Most Linux flavors start as a branch from existing ones. They only change what is most important to differentiate themselves. If they're derived from Mandrake/Mandriva, they likely use Perl very centrally. If they are derived from something that uses Python for installation and package management, they'll likely use that too. This says, I think, more about the success of a main branch of Linux distributions than about Perl or Python specifically. Only if someone rips one out in favor of the other is it very important to language popularity.

      I've yet to see a distribution that doesn't offer perl. Some include it as part of their developers packages. Some offer it as its own item. Some don't allow you to deselect it, because it's considered vital to the system. Python is also being offered on lots of distros, but I'm not as certain about where it might not be since it's not on my must-have checklist for trying a distro.

        I've yet to see a distribution that doesn't offer perl. Some include it as part of their developers packages. Some offer it as its own item. Some don't allow you to deselect it, because it's considered vital to the system.
        I remember seeing some polite discussion on the subject of removing perl dependencies from Debian, where the conclusion was essentially "fergetabodit".

        I occasionally toy with the idea of developing an intentionally perl-centric linux distro (probably Debian or Ubuntu based), tentatively named "Oyster".

        The idea would be to have the ultimate perl-development linux-distro available out of the box, without hunting around for the pieces. There's also a lot of cool mod_perl-based web apps out there (Bricolage, Slash, etc) that could be glued together into a websever version of Oyster.

        And for extra credit, we could look into things like re-writing that mess of init shell scripts as a monolithic perl script (I bet it would boot a lot faster for laptop use).

        You're on the right track when you say "They only change what is most important to differentiate themselves." From what I've seen, Python's getting used to write software management systems and installation systems more often than Perl (Gentoo's Portage and Fedora's Anaconda, respectively, come immediately to mind). Perl's still used to maintain and improve a whole bunch of older software management and installation systems. I think things are reaching a leveling-off point, though, where Python's encroachment is slowing down.

        It's only natural that Python looks like it's "taking over" for a while, because in order for Python to get any traction it has to get some "market share" from somewhere -- and Perl pretty well dominated the niches where Python would be most effective for a long time. Now that Python has been expanding a little bit into some areas where there are more people who would like Python's way of doing things than Perl's, I suspect any further conversion will slow to the point where both Perl and Python will grow faster through expansion of both languages' capabilities into other "markets" than through any contesting over already claimed territory.

        Ruby is just starting to get in on the action, from what I've seen, and when Ruby 2.0 hits it will probably accelerate slightly. It will probably take ground from both Perl and Python in the sysadmin arena, as it already has in a few cases (such as its growing use in ports management software for FreeBSD, for instance). Eventually that, too, will reach a state of equilibrium with Perl and Python. So it goes.

        I've yet to see a distribution that doesn't offer perl.

        It would be a strange Linux distro indeed that didn't offer Perl at least through its software management system. I seem to recall that FreeBSD removed Perl from the base system a while back, but I think that's just because the FreeBSD folks are interested in minimizing the number of interpreters that are part of the base system altogether. I don't recall Lisp, Lua, Python, Ruby, or Scheme interpreters being part of the base system either. This would be why, every time I write a Perl or Ruby script (and I've even written a couple of Python scripts lately -- le shudder), I find the interpreter in /usr/local/bin/$foo rather than in /usr/bin/$foo (though there is a symlink from the latter to the former, while there are not similar symlinks for Python and Ruby, by default).

        Of course, officially the problem with including Perl in the base system was related to FreeBSD discussions on whether to differentiate between the interpreter and the Perl standard distribution libraries when determining what's in the base system. The ultimate official opinion seemed to be that including all the libraries in the Perl standard distribution along with the Perl interpreter itself would be too big a wad of stuff for the FreeBSD base system, so it has been relegated to ports instead. I still think FreeBSD may have a "fewest interpreters in the base system possible" bias, however.

        Interesting note: In the midst of browsing through FreeBSD ports, double-checking to make sure I wasn't misspeaking, I stumbled across an interesting port called ruby-perl. The description:

        This is a Ruby extension module to use the functions of Perl from Ruby +. You can also call Ruby functions back from within the Perl code. Author: Yoshida Masato <yoshidam@yoshidam.net> WWW: http://www.yoshidam.net/Ruby.html#perl

        For someone that likes both Ruby and Perl so much, I sure do seem to be ignorant of some stuff that would be right up my alley. I had no idea this thing existed. Unfortunately, I seem to have discovered it in time for the message on its homepage "This library is not maintained now."

        print substr("Just another Perl hacker", 0, -2);
        - apotheon
        CopyWrite Chad Perrin

      New flavors of Linux seem to all be preferring Python.

      I would say that that is because of the GUI toolkits. Disclaimer: I have never done anything with any of the GUI toolkits, so I may be completely off the mark. All I know is that Tk seems to be the only stable/widely used choice for Perl, and every Tk application I see looks awful, while the Python stuff looks great.

      I've tried to install the Gtk modules, but just got failures. I'm assuming the Python bindings are easier to install and use, which is why we see more productivity in this area. This is sad - I've got a hankering to try my hand at a desktop based application, but (and maybe I'm just believing the hype) I feel that I should probably learn Python to do that.

      Please somebody correct me.

      Clint

        Perhaps take a look at Wx for a Perl interface to the wxWidgets (http://wxwidgets.org/) library. (Or would you call it a framework? ;)

        I've implemented a couple of GUI apps with great success using wxPerl.

      A reply falls below the community's threshold of quality. You may see it by logging in.
Re: Tired of "Perl is dead" FUD ?
by apotheon (Deacon) on Oct 01, 2007 at 20:52 UTC

    You're probably about to get a fair bit more traffic to that page. I noticed it hadn't been submitted to reddit, so I corrected that oversight. I imagine it'll get a lot of attention there.

    print substr("Just another Perl hacker", 0, -2);
    - apotheon
    CopyWrite Chad Perrin

A reply falls below the community's threshold of quality. You may see it by logging in.