The Mid-Career Crisis of the Perl Programmer
modernperlbooks.com
modernperlbooks.com
This is a general rule for everything. The animals that survive are the ones that best adapt (well constantly adapt) to an ever changing environment, since change is the only constant.
This is the one major thing I got out of being a computer science major: the language doesn't matter and you shouldn't tie yourself to just one language (i.e. be language agnostic). They drilled into us that we should constantly learn new languages for both fun and profit.
For a reasonable definition of the word productive, I've never found it terribly difficult to pick up and be productive in a new language. Sure, a year later I'll look back and say "man, I was so silly back then" but that's not the same as being useless. We routinely hire people at work who don't have experience in our primary language and it's never been an issue.
One of the things that irritates me the most about our industry is the fetishization of the difficulty of switching languages. In my younger days people would say that the syntax was too difficult to pick up. Now that people realize that's hogwash they've moved on to saying that the frameworks are too difficult to pick up.
My travels indicate to me that "proficiency" grows from understanding the mental models that go into programming. Within a linguistic family (and most of the languages in heavy use are either dynamically-typed OO or statically-typed OO), the differences are marginal and mostly unimportant. If I had to go write Node ("like Play but without a working type system!") tomorrow--well, I'd quit, but before I did I'd be proficient in a week.
C++/C#/Java, less so Ruby, are really all kind of the same, OO languages, 3 statically typed and one not. But basically, they use similar ideas with different syntactical sugar.
I've recently moved to using Clojure/Lisp and I kid you not when not just the language but the tooling allows me to be an order of magnitude more effective when shipping production code.
I'm basically ruined, and now find it hard to get a job because I refuse to code in any other language. Because I want to be able to: spend time with the family, walk the dog, go surfing at 6am every morning, go to live jazz....._and_ still make sure I ship quality stuff on time. Clojure/Lips lets me do this :)
I loved the article because it was basically everything I've realised in the last decade; I am way more effective in one particular set of tools than another, and I don't want to have to learn python or Go or whatever, and all their associated libraries, community and quirks. I just want to use the shit I know and go do something else with my life :)
This is MHO and like I said milage will vary.
Oh about the job thing, I decided to start my own company so I could build it how I know I will be best able to do it.
I'm not unfamiliar with Clojure or Lisps in general; personally, I can't think as well in that mode and it doesn't map well to what I do (either in terms of work or personal projects), but I get it. They're nice, for a certain kind of thinking that I don't find myself needing that often.
I didn't mean to imply that there aren't tools where I'm more effective, because they're better tools, to be sure, (by my lights, Ruby is a better tool than Python and carving bits into a spinning disk with my teeth is a superior option to Go) but I find that after a certain point within an environment I've put together in my head a sufficient playbook where missing certain things here or there doesn't diminish my enjoyment of the process of building something. Libraries, quirks...meh. I went back to PHP a few weeks ago after not touching it for years and it all came back in fifteen minutes or so. Maybe I'm just wired for it? I dunno.
I know for myself, when I got a chance to code professionally in Erlang, I was hooked, and could not see myself going back to Java or a mainstream scripting language. Having to think and model problems concurrently, think about failure, etc, is so natural a fit for my brain that trying to fit a language that doesn't have those as first class constructs feels stifling, and having to eschew those concerns to write something that ignores the considerations Erlang prioritizes breaks my brain; I've tried it for timed coding events and it just did not work (i.e., realizing after the fact "Oh, yeah, I totally didn't need to spend time making sure that my supervisor tree made sense, that state was persisted properly, and resumable in the event of restart"). And yet it's not totally ideal, either; I care deeply about typing, and wanting to squeeze the most 'correctness' as I can from static analysis, and Dialyzer just isn't quite sufficient to fully scratch that itch.
Meanwhile I've seen some teammates who, while having the same diligence in thought, tend to be far more sequential, far more inclined toward single threaded models, reserving concurrency for the truly necessary cases, and more concerned with try/catch style error handling, than ensuring proper typing (Dialyzer) and otherwise letting it fail (at least until we know what we -really- need to handle).
Both I and my teammates have very similar backgrounds, coming from a predominantly Java background, some with a bit of .Net, Javascript, etc, with a smattering of mainstream scripting languages thrown in, and of course, we're all working on the same project. Yet our 'taking' to the language and its paradigms varies pretty drastically.
I think people, especially the HN crowd, miss that. PG's "Blub" paradox is viewed as the rule, and obviously everyone thinks they're at the top (or at least, as high up as is pragmatic for their domain), and while it's certainly true that you can't appreciate what you're missing if you don't at least understand it, people's brains work in very different ways. Languages certainly vary, and some are definitely better than others along a given axis, but I think it's unfair to take one's own experiences as objective truth. Even apart from domain differences, "This language made me 10x more effective"; yes, but is that due to the language, or due to your thought processes naturally fitting it? Will someone else who thinks differently find the methods of expressing problems in that language so naturally efficient that they'll see the same gains, or will it actually slow them down, even after learning it, because it isn't as good a fit for them?
I think PG's Blub Paradox only works to a point, as you say, and I think you nailed what regularly drives me nuts about technology: there are axes to this stuff that people mash into a continuum to feed their (rampant) insecurities--so they can look down on somebody. I think it's a sign of cultural and personal immaturity. I thought it was super-cool to issue sweeping statements about technologies at one point, and sometimes I still fall into it when I'm feeling salty, but I try not to. Which is different from sweeping statements about the craft of programming; Gary Bernhardt's twitter feed is chock-full of things that as a programmer you really should full-stop not do to your users. But technology--ehh. I goof on Go a lot, and it does drive me squirrelly when I have to debug somebody's Go project for work, but I just can't cape for any particular stack anymore. Even Java has plenty of uses. (For me, Java's useful in that I can see in my head roughly what the bytecode output of a given thing, and reason about its behaviors on the JVM better than I can Scala.)
I think the main difference to me was that Erlang was built from the ground up for fault tolerance. Everything about it is structured around that; you get process isolation and concurrency because of the need to not have one error/exception kill everything, you get distribution because you need hardware/VM issues to not kill everything. Akka's motivation isn't that; it can't do that. The JVM doesn't allow for process isolation, there's one shared heap, etc, so it really does matter what is running locally vs what is running on other machines, you have to be careful about mixing concurrency patterns and using vars, and it is possible for one process to die and take down others with it.
Akka is a little alien to me as well; things like 'become' seems a bit heavy handed (I believe it's due to the JVM not supporting tail call optimization, and Scala can't trampoline the calls if it doesn't know what you're trying to do). Similarly, the reactive nature of actors in Akka, where they don't do anything until they receive a message, while superficial, still bothers me a little bit.
My mental model of an actor in Erlang is simply a lightweight process that executes a function, that has a queue attached; at any point the process can check its queue, and if it needs to repeat itself or change its behavior, you call itself or a different function. It's a very simple mental model that all the OTP behaviors build on. Akka instead has (necessarily) various syntaxes; you're creating this ~thing~ first, setting up all the things it can do, and then it sits waiting for a message to start executing. It's trivial to transcribe one mental model to the other, but I find Erlang's is the one I think best in.
Now, that said, provided you don't need the soft realtime performance of Erlang, Scala/Akka is generally going to be more performant when it comes to number crunching; it's easier to just do it natively in Scala/Akka than have to do it externally in Erlang and open a port.
Scala/Akka benefits from existing JVM expertise which most devs have a bit of; the Erlang VM has its own deep knowledge you have to learn to run it in production (that said, the introspection you have into it is -killer-).
Scala/Akka is easier to transition people to, due to the OOness ("squint a bit and it can kinda be written like Java!"), but I think making a clean break of things with Erlang helped me; even the 'strange' syntax was helpful in that I didn't assume false familiarity due to syntax that seemed familiar (except for 'if'; everyone misuses that at least once). But if a dev finds that way of thinking alien to them, in the Erlang world they're just not going to be that productive; in Scala, you can mix paradigms and they'll likely see better productivity in areas of the code that are still very OO and imperative. I tend to feel there be dragons in OO, imperative code, but the reality is a lot of shops don't have the leisure to write everything in a functional manner, and to pick and choose who works on it based on their familiarity with that paradigm.
There are a few other odds and ends; Scala allows operator overloading which I need so rarely that opening it up is a con in my book, there's a lot of implicit stuff (apply for instance) that while really cool, allows for a lot of hidden dragons to be buried in a large, shared codebase, I really wish Erlang was statically typed as I said before, etc, but those are the main.
There's a huge gap in productivity - at least for small, exploratory, green-field projects - between C++/C#/Java and Lisp. There's a much smaller gap between Python/Ruby and Lisp, enough that a couple prominent Lispers [1][2] think that they are perfectly acceptable Lisps.
I like Lisp. I was pretty obsessed with it in college, and have gone so far as to implement a couple of them [3][4]. But my experience is that I'm perfectly fine with Python. Sure, I miss macros and conditions and CLOS. But that's all made up for by the awesome libraries available in Python, the ease with which I can express my algorithms, and the syntactic prettiness. I'm using it for my startup; I was just thinking this morning (while poking at a unit test in the REPL) that it's just as good or better than my Lisp experience ever was.
[1] http://norvig.com/python-lisp.html
[2] http://www.randomhacks.net/2005/12/03/why-ruby-is-an-accepta...
[3] http://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_H...
I like Lisp and specifically Clojure, for a number of reasons, with a lot of those reasons being because it's the _same_ .....everywhere. I read Clojure code like I read English, I can glance at a piece of Clojure and not wonder why there is an implicit argument that needs to passed and where the compiler might be finding it; the rules for Scala static implicit resolution go in and out even after reading them a few times for me.
Clojure has a lot of improvements on CLOS, I'm not sure how much Clojure experience you've had? There's enough differences that some of the arguments I noticed in the paper (which seem to be really just syntactical) on why ruby is an acceptable Lisp don't really apply to Clojure. For example, in Clojure you don't use lambda, you use "fn" to do the same thing. One of the things I really like about Clojure is that I get to run it on the JVM, which still beats hands down the Ruby VM, AFAIK, I did check a little while ago.
I'm not that familiar with the Python REPL, but Clojure's is pretty good and I love being able to jack into production when I have to and modify executing code to do tracing or debugging without having to restart it :) I know, it should never get to that point, but testing only covers so much.
Ok, I think I'll leave it at that.
Another poster on this thread made a comment around, people think in different ways, some people love thinking C++ and classes for everything....I'm not one of those people, I want to just say exactly what I want to say and nothing else; if I want a class I'll make one, else get it out of my way. I think LISP so when I type it's an almost 1-1 correspondence.
Cheers!
p.s. nice work on the Javascript port of arc, I didn't know that had been done.
[1] http://www.infoworld.com/article/2609013/java/scala-founder-...
2. It's not like you ever let really go of the languages you already learned if you keep using it.
3. It's pretty obvious when a language has run its course. It shows in the job market. Why not transition then instead of staying on the Titanic?
I've since learned to use programming languages to solve problems I care about. If that makes me the forever-novice then I'm cool with that.
Node.js - lets you share code between client and server
Docker - a more reproducible environment than a VM
Python - the most user friendly syntax of any language
You have a fake humility in your post, but I would ask you what particular things (e.g. what scripting languages) you think are "cringe inducing".
I can't comment on enterprise Windows software in itself, since I'm not a big user and have never written it, but the Windows itself could never be compared to McDonalds. Incredible skill and expertise was needed to write Windows. As to the software written on Windows, are you qualified to judge it? Have you written something similar by yourself?
I've never used Node myself, I was just assuming that people really did share some code across server and client in practice (otherwise why not just use Python for the server).
2) Maybe I offended some people when I used the term "software game". Rest assured I was making a slangy generalized reference to the software industry itself, and in no way did I mean to trivialize those who do dev for a living. In fact, I applaud you.
>Maybe I offended some people when I used the term "software game"
Yes, you did offend me. And I appreciate your clarification. My main point was that it's easy to criticize, but until you get your hands dirty, you won't really know what it's like to write software for a large user base. And it doesn't have to be commercial. If you're working of open source software with 100,000 users, your experience is as real as with commercial software.
Because I'm the USER! If we're hitting a language barrier I apologize but enterprise software is for the user. Surely this cannot be disputed.
> You could only make that sort of claim if you understood something about what it was like to write that software.
NO! IMO, this is an insane way to think about client software! The user doesn't care about the technology nor the hardships involved in shipping said software! This is why software sucks! I can sympathize if you work at a shitty company with a shitty boss, believe me I can. But no, I feel your software should die if this is your ethos. Let a company who cares about its users take those reins!
EDIT: grammar
Nope. The reason enterprise software sucks is because it isn't worth making it not suck. And the reason for that is there is a huge disconnect (many layers of management) between the person who buys the software and those that use it. Thus the sucktitude of the software is largely irrelevant for purchasing decisions because the buyer never experiences the pain of using it. This is starting to change as people get more experience with quality consumer software, and such software (e.g. Dropbox) begins to invade the enterprise.
That's what I'm arguing against. I'm saying that you can't know the reasons why software sucks unless you've worked as a programmer (or have some other equivalent way of knowing, e.g. being a product manager).
Your attempts to shut him down with "well you're not there, man" are offensive to me, and I do have the resume to hurdle your arbitrary no-complaints bar. I don't have to be the employee of an oil company to know that regulatory capture's a thing, he doesn't need to be writing a bunch of leet node.js to know that few people working on anything in tech gives a single solitary crap about him or anybody else using their stuff past the buying point.
He's right to be mad about what we, as a culture, foist on our users. It reflects poorly on us that we are not likewise angry. We should be angry about many things and we are not.
As a 'hobbyist' programmer who makes his money outside of the software game, ... the programming tech treadmill is one of the most cringe inducing phenomena I've ever witnessed - particularly in scripting languages...
I've since learned to use programming languages to solve problems I care about. If that makes me the forever-novice then I'm cool with that.
Saurik had a great post not too long ago[1] that made me think about how Github and the public nature of open source feels almost competitive now. I'm not at all immune to it; when I started running into teeth-pullingly irritating problems with Terraform (written in Go, which I, uh, "don't like" at a minimum), my first thought was "well screw it, I'll go rewrite it in $X and show them!". Fortunately, my good sense prevailed and I wrote a hat on top of Terraform to add some of what I would editorially consider "sanity"[2] on top, but a lot of what I see out there seems to be people succumbing to the siren song of "well, I'll do it myself and it'll be awesome and I'll get all the credit."
E.g. lots of people use node.js because its in a language they're familiar with and it fills a niche (lightweight process that can accept and process many incoming requests). I use Erlang for those needs, which actually existed before node.js. But it's a "weird" language so most people don't use it.
I like Python more than Ruby. I've learned both but never use Ruby anymore. Other than preference or mandate I'm not sure why I would use one over the other.
Lots of people used to writing in scripting languages seem to be discovering the wonders of a speedy language like Go. You could obviously use speedy languages before Go but their preferences made them not want to use them. For whatever reason Go is attractive to them.
If languages are close enough, then yes, familiarity or popularity will influence usage.
>I like Python more than Ruby. I've learned both but never use Ruby anymore. Other than preference or mandate I'm not sure why I would use one over the other.
Never used Ruby, but my impression is that like Python, Ruby is a slow interpreted language with a good set of libraries and user friendly syntax. So you're probably right that there's not much between them.
>Lots of people used to writing in scripting languages seem to be discovering the wonders of a speedy language like Go. You could obviously use speedy languages before Go but their preferences made them not want to use them. For whatever reason Go is attractive to them.
I think that attraction of Go is that there is one build system, one debugger, one linter, etc. Having all these things be take responsibility by the language developers is a big plus as it avoids buck-passing and inconsistencies. While Go doesn't excite me at an emotional level, there are some things that it seems really good at.
Our industry is filled with tens of thousands of professionals carrying on quietly developing software boring and exciting, and inundated with loud mouths acting and speaking in ways strongly suggestive of a certain " gaminess."
Considers +2 "XML Mace", but requires level 15 Java Brute Force skills to wield. Reconsidering player "cast", selects +3 "RegEx Dagger", which better matches level 18 Perl Dexterity. Upon leveling up, considers how many XP to spend on "management persuasion" craft skills. :<>
> programming on programming itself ... does seem a bit
> 'meta' and removed from why we're all doing this in the
> first place.
I heartily disagree, and think that tools vs. "actual problems" is a false dichotomy. Software design/engineering is very much its own discipline. A good API/framework/whatever can lower defect rates and generally make your software more coherent and maintainable. That saves time, money, and headaches. We should absolutely care about the tools we use, because nobody else is going to, hence "programming on programming." Attributing that to a quest for "celebrity" is cynical, and I don't see how you can blame programmers for seeking a good professional reputation by creating tools for their peers.This onion is the only way we can deal with the ever-widening diversification and combinatorial explosion of hardware platforms, communications channels, types of users, geographic dispersion, data sources, problems to solve, etc.
Improvements at one layer demand adaptations at another; accumulate enough options at one layer and you need to encapsulate them in another. And the bigger these onions get, the more leverage they provide to anyone who uses them, meaning any improvement you make to some part of the onion is contributing to solving a thousand, or a million "actual problems" simultaneously.
If solving end-user problems is "why we're all doing this in the first place," a toolmaker who can solve 50% of each of a million different problems simultaneously is contributing more than those of us who solve the remaining 50% of just one.
Just because you need asynchronous I/O doesn't mean that you should exclusively use node.js. And a lot of the hype tends to ignore the underlying CS concept that makes the software worth using. You don't need ElasticSearch because of "search and analytics" but because you have queries that benefit from an inverted index.
But you can find yourself spending too much time coercing technology to do things that it was never designed to do. If you have huge SQL queries to implement basic faceting you should probably just learn ElasticSearch. If you need to completely retrofit a language to do async networking maybe just learn Go.
He was a stand-up guy, a professional in an environment where most weren't. (It turned out that the company was already having trouble making payroll when they hired me.)
The perl dev group's focus on testing was impressive and very forward thinking. But at the same time, the Golden Hammer anti-pattern was evident to me: matching your tool to the client's problems, as opposed to placing the client's problems at the center of your focus.
I believe that my CS background helped me take that client- and problem-centered approach. And led me to create several proofs-of-concept in different languages before settling on Python/wx (largely unknown to us) as the best way to meet the project's requirements.
pick something, work on it, find work doing it and get paid the most.
if the work goes away and you need to pick a new field, then what you've learned isn't wasted, you'll still know how to solve problems, just you won't know the idiosyncrasies or the eco system as well as you did. but you can learn that pretty fast.
point being, learn one thing and stick at it, that way you'll get more money.
I had been a Perl hacker, and CPAN author (kraehe) ages ago, but time moves on. I learned coding with papertape and punch cards. I wont get any good job, if I would restrict myself to COBOL or Perl.
Perl has its strong sides, especially the CPAN culture of testing and documentation is unmatched in any other language. I still use Perl, if there is a module that solves my needs. But my portfolio of languages grows constantly. I dont want to write Perl the rest of my life.
You're not wrong so much as perhaps just more experienced to the point where caring about the idioms isn't much of an issue any more, not because idioms don't matter, but because you're writing code that's good enough. i've found the 'standards' and 'idiomatic code' to be useful not so much as a benchmark for "you're 100% wrong if you don't do this" but "you're creating another set of problems for yourself if you're not careful".
"Ember or Angular? Don't care. Ruby or Python? Don't care. C# or Java? Don't care"
Well... you may need to care, because one of the problems you may have to consider is long-term maintenance as well. Using Ruby for "project X" in a team of 15 .net developers with extensive C# experience, simply because "Ruby is best for this problem" is probably just trading one problem for another.
I'd like to reiterate this point. At some point, somewhere down the road, a different programmer than you is going to have to read your code and try to figure out what it does. If you don't learn your languages well enough to be idiomatic, then you'll be contributing to technical debt load instead of helping to pay it off.
Unless you're doing big enterprise consulting. That's an entirely different sport.
I've gotten into this argument frequently with coworkers over the years, usually surrounding situations where we have some side code in a language where the common idioms, style guides, etc are vastly different than our main language. They end up writing X as if it were Y with different syntax, to which I object. Their take is always that it makes the code more readable, but that's not really true - it's only more readable to a Y programmer, not the space of X programmers.
I recently sat down to learn Python a bit. Inside of a week I had useful code up and running. I'm sure it was non-idiomatic and I'll laugh from embarrassment a year from now, but screw it, it works, and real people ship.
The last code I wrote before that was in Java. I had to relearn it after a decade of non-use. Real people ship.
More recently I wrote some more Python code, it's all hacky and terrible, I can feel it, but you know what, it shipped and has kept a half-dozen people employed for another few months. Real people ship.
Most recently I had an issue to solve, not wanting to fight Python's 2.x's stupid typing issues, I hacked it out in Perl. The solution shipped. Real people ship.
GSD (get shit done) and move on. It doesn't really much matter what it's written in. It's all bits and bytes, 1s and 0s in the end.
Real people ship.
(also, don't work for free)
It's funny, we mock MBAs who believe they have the generic skill of managing anything, but how many programmers think that they can write programs in any company or industry?
You do this for long enough without ever cleaning up after yourself, and you're left with a massive, steaming pile of garbage that you have to then support and maintain. Maybe you're lucky enough to be able to write fire-and-forget code, but in my experience, writing hacky terrible code to ship something just means that I'll have to spend 3-5x time on the phone troubleshooting with a customer, analyzing logfiles and then writing the code the right way in the end, than if I had just done things right to start with.
If you're having to maintain your own code long-term, absolutely. But that's not every job. It's good to get a feel for what's required from your boss and to keep in mind that the requirements can change from project to project.
If you find a good client, you treat him or her like a combination of the Pope, the Queen, and the Dalai Lama, because a trustworthy client who pays you on time and doesn't argue over little details of the contract is better than gold.
The system works a certain way, you do not want that, fair enough. You then continue how you do not want that consulting thing either. So you go back and basically say, that you want to be hired by a company, which produces a product of your interest. They should use a technology that does not advance while there are other choices, which would lure in coworkers, who are interested in using it.
It does not matter whether Perl is technically a reasonable choice. There are other more important metrics for a company. When you get hired as a programmer you got to program. If you want to make bigger choices, stay your own boss.
I get, that it is hard to move on from a beloved community and something that defines yourself. But really, I do not think, that Lua, Ruby, Python - you name it - or even PHP are so different, that you could not use some of those 20.000 hours of experience productively in them. Also, you can go back to Perl anytime.
I think you wrote that rant, because you were faced with making a decision and wanted to wallow in memories of the good old times. I hat this once on a much smaller scale when I switched from PHP to Python. As many people already suggested: Identify yourself as a programmer not a Perl programmer. You will highly increase the likelihood of getting into an environment that satisfies you when language choices is not important to you anymore.
When I sold it due to personal reasons I was not yet ready to retire. In that time and especially in Europe buy-outs were quite modest. I started doing consultancy until I would have a new idea and start working on that one. Indeed the golden cage of consulting can be dangerous. I'm already consulting 5 years and didn't start anything new.
I don't consult as a programmer anymore. I implemented Agile in my own company and now I'm an agile coach in large enterprises. Programming I still do in my freetime just to keep me sharp.
But here in Belgium 99% of the projects are CRUD projects so I'm not really missing out on anything. Most of the times senior developers go to architect roles not because they want to stop coding but because they're tired of writing CRUD code.
When I look at the programming world, my primary instinct is that if something is popular, then there must be something good about it. Take JavaScript. In spite of its limitations as a language (the worst of which is not having a canonical OOP style) there is no easier way to create a single GUI for 3 platforms, as JS. I could make similar comments about Python and C++.
I don't really understand the point of view that using [old language] is an indication of really knowing how to program. Apart from some minor details, all imperative and OOP languages are fundamentally the same.
To take a concrete example, Python has very user friendly syntax. This allows people to quickly iterate on code. Another advantage of Python is its complete standard library, and availability of other libraries. But these things probably would not have existed if Python was not such an efficient language to program in.
- It was the only way to throw together a webapp easily for a long time.
- It is actually pretty efficient for this purpose.
- Much later Python and Node became viable alternatives.
- As soon as they did, people started shifting to them, and today few people would start a new project in PHP.
So according to my (not very informed) understanding, the history of PHP supports my claim that inherent quality (relative tot he alternatives) is more important than network effects.
(Note that I'm not saying you're accurate in your assessment as to reasons why PHP became popular, just that your reasoning as to why it has inherent quality is interesting)
i kinda think that google got a 100% monopoly because at the time they were the best search engine (and remained so). and as soon as someone comes along who is better, the monopoly will end (i use ddg but i'll admit it's not as good. i like some of the cool hacks and features so i'm trying to stick with it). am i wrong?
Emphasis on -best-. Compared to all the others. I.e., altavista, yahoo, ask.com, msn, lycos, infoseek, etc". Google came into the party late, and -displaced- the existing players, by offering a superior product.
Swatow stated that when PHP came on the scene it was the "only way to throw together a website easily", that it's now being displaced by other tech, but because for a time it was the only way to do it easily, it somehow had inherent quality. That would be like saying that because Archie was the first search engine, it had inherent quality.
At the risk of sounding like I'm doubting you, I honestly think you have no idea what you're talking about.
And do people transpile to JS because the language is bad, or because the interpreter and runtime are good?
A. the barrier to entry for other languages is too high (Javascript for the browser, Objective-C and Swift for iOS, etc), and so there is no evidence that there is anything good about it (you just lump it and accept that's the way things are done).
or
B. Because it is still a generic, C-style, imperative, possibly somewhat OO language that feels very similar to a language you already know, and which is a reasonable choice for nearly any problem (rather than ideally suited to a subset of problems), and you are probably selecting it based on that merit rather than any real technical merit the language offers. (Note that this can be a reasonable business decision, but oftentimes people delude themselves. "We use the best tool for the job"...so long as that tool is Java or Javascript)
As you say, all imperative and OOP languages are fundamentally the same; for me it's when languages veer off that path that they start getting interesting and really differentiate themselves.
As a note, too, 'there is no easier way to create a single GUI for 3 platforms, as JS' is not a testament to how good JS is, but a testament to Netscape being in the right place at the right time. It was a language written in a week, whose syntax was forced by suits to be 'Java like' because that was what was popular at the time, and which had no competition.
> Moose is probably the singular reason there are any significant new projects in Perl in 2014.
There is another side of that story: Moose is probably one of the things that contributed to Perl's decline, along with modern Perl, Perl 6 and overall focus on all the wrong things.
Anyways, I wouldn't take chromatic's words too seriously. Learn Go guys :)
To me it seemed like a bunch of Python and Ruby fans came out of the blue and started endlessly chanting "Perl sucks", or "Perl is line noise", and that apparently was enough to turn a lot of people away from Perl and on to the newcomers.
Sadly, these chants often came from and were directed at people who'd never used Perl themselves, or didn't know much about it at all. So it was really a case of the blind talking to the blind.
Not that I love Perl. It's got some warts. But so do Ruby and Python, and every time I try to pick either of them up, I notice a ton of things that are as bad or worse than Perl. And that just makes me sigh.
I think that was a side effect of experienced Perl developers publicly explaining why Perl was not that good and why they chose another language. Others respected their authority and started repeating and so on. So, the bigger problem was: experienced developers were fed up with Perl for various reasons and started to speak up. And they were not wrong.
Many years ago there was a perl compiler, but at the time when everyone was moving towards virtualization and ease of deployment was particularly important - it got abandoned. Performance and memory consumption were never considered as problematic either, but they always were. Even simple log processing was not viable for anything, but personal homepage sized logs. It was very disappointing for many people.
As for Moose, etc., Perl had a perfectly good object system. Everyone knew how to bless a reference and make it into an object. It was hard to abuse it, nobody encouraged OOP, things were good and manageable. And yet, community decided to go farther into OOP, promote Moose, promote new syntax features, promote new ways to build modules. Things got messy in the process. Perl still didn't address any real problems, but it was a pretty much new language and a burden on everyone. Suddenly people found themselves in a position, where they needed to decide of whether they want to learn all the new things in Perl or not and learn some other language instead.
> But so do Ruby and Python, and every time I try to pick either of them up, I notice a ton of things that are as bad or worse than Perl.
I don't see them as alternatives to Perl. I think they are in decline too.
This is also the P6 problem.
Many years ago there was a perl compiler...
... but it never worked very well. Certainly it didn't save memory and it rarely saved much startup time.
Perl still didn't address any real problems...
I think there's something like the Expression Problem in programming language design. How do you allow people to solve new problems and explore new patterns and paradigms in a language without encouraging them to create a series of incompatible forks (Tcl, Lisp, Common Lisp, Forth, Smalltalk, heavily macroed or otherwise preprocessed C or C++), limiting the scope of your language to small or relatively isolated projects (Lua), bringing ideas into the core library where they slowly bitrot (Python, Perl), or facing a dramatic rewrite (Perl, PHP)?
For better or worse, Perl's answer in the past few years has been to prototype new ideas on the CPAN, let the community use them and reimplement them and compete, and eventually enable them with the minimal core support possible. The strategy is decent, but it's not fast and it relies on the ability to find people willing and able to do this work in the Perl core.
Maybe through many tiny DSLs on top of a small and stable core language. People seem to be ok with DSLs, but not so much with constantly changing language and growing feature set.
The sad thing about Perl 5 is that it's actually pretty fast for a scripting language, it least if you are doing a lot of string manipulation, rather than physics simulations.
But, having spent a portion of the last several months going through 3000+ line perl scripts written by a person with no formal training who had figured out just enough to hack something together but not enough to efficiently use functions, nor to maintain the code they wrote, I'm feeling less then sympathetic with the OP and perl in general....
It's hard to get the good consulting jobs without establishing yourself as a specialist. Clients don't want a smart generalist who'd like to try herself out with machine learning; they want the 20-year expert (and for only $120 per hour!) But, if you specialize and get unlucky (and a lot of it is luck, because factors other than quality influence which tools win and which don't) you end up having loaded up on skills that no one needs. At the top levels of talent, the people who are actually able to evaluate it have better things to do than to judge others. So you need credentials, blurbs on the CV, credibility, etc.
...you're not dealing with VCs who underpay you and dangle ever more diluted RSUs in front of you for that 1% chance of an acquihire payout that'll slightly pay more than if they'd paid you a market rate for the start...
Here's why the VCs and career executives won. They spent as much time getting good at office politics as we did at Perl or Haskell or Clojure or machine learning or computer vision. The difference is that office politics is a transferrable skill. The stuff we learn is much more powerful at advancing the state of society, but if the industry turns against us, that time is "wasted" from an economic standpoint. It's not actually wasted; it has still made us better at our jobs, but it doesn't make us better on paper, which is what matters if you're a consultant in a rough economy who needs to eat.
Eventually, the VC model will break. What's interesting about it is that the numbers (in funding amounts) appear large, but the expectations mount so fast that these companies are actually being run on a shoestring budget (relative to what's expected by Year X, and because the rapid-growth expectations pretty much mandate a next round of funding rather than a stable let's-get-some-revenue strategy). A $5 million investment seems like more than you'd need, until you realize that you're going to need 25 more people to appease your investor-boss and that's going to put you in front of investors again, depriving you of the time or freedom to do anything else (like build a business, maybe?) in about a year.
How do you keep programming fresh?
That's a hard one, because humans tend to create pyramidal structures and what that means is that there are fewer positions for 10-year programmers than fresh grunts who are still excited by the CRUD projects, and at 20 years... you're either doing R&D in an AI research lab usually with a "Fellow" title that is VP-equivalent and therefore gives you a right to be old... or you've moved into a management role... or you've missed at least one boat.
At 7 years, you've learned everything general you need to know for 99% of corporate programming. Sure, there's the treadmill of new frameworks and new dresses on old concepts, but you're pretty much maxed out unless you can convince business types that you're something other than "just a programmer"-- perhaps a machine learning expert or "data scientist", perhaps an architect, perhaps a Dir/VP-equivalent elite programmer ("Principal" or "Distinguished" or "Fellow") who has the clout to work on what he wants, perhaps a manager, perhaps a founder. The good news is that, for most of us, it's not actually that hard to do. Not all "business types" are morons, and many are good at what they do and make your life easier-- if you can convince them that you're a cut above the commodity programmers who "deserve" to be corporate subordinates.
The problem is that, while learning office politics is a lot easier than plenty of technical things that we gladly learn just for the challenge, it is a huge distraction, and those lessons often come at random when you'd rather be learning other things. If you expect a 40-year career working only on hard technical problems, you're not going to get one, because the days of Bell Labs are over and, anyway, modern academia is far more political than most corporate jobs. You're going to have to learn the politics of business, because (channeling Trotsky) you may not be interested in political fights, but they are interested in you.
Exactly. (I believe I wrote that explicitly the previous time this was posted.)
Part of the problem is that programmers believe we're special snowflakes and can't possibly be seen as fungible Taylorist cogs. Another part is that we chase language and library fads more than we pursue deep domain knowledge.
Deep domain knowledge, of course, includes a good understanding of business in general.