At my current job I'm doing solely Java with vanilla JS to maintain a google maps like product. Heavy stuff. But this year, I also did about 10 hours of Wordpress because our website is on Wordpress and the guy who programmed it barely responded to finish some stuff. And I wrote a Wordpress plugin 10 years ago so I had some experience.
F' me, no? Time to throw my CV in the bin amirite?
"The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offense."
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
- Edsger W. Dijkstra
Maybe php and node are the cobol and basic of our generation?
COBOL is from a different time and family of what we ( mainstream ) understand today as "programing languages". How many "crimes" are committed today writing business rules in Java or C#, etc?
Dijkstra's statement, like anything else has a time and context and I hope something solid from the COBOL family existed today.
So you see a thriving ecosystem of millions of developers and you choose to nit about some quirky library? I definitely assume the worst of elitist statements like that.
The question I'd ask is whether they're up front about it. It's one thing to ask and see whether someone knows how to check if a number is odd or even - for that matter, it's one thing to use it as a programming quiz! Probably better than Fizzbuzz, everybody knows that one anyway. That's fine.
What would not be fine is to just quietly have that attitude and assume without checking that no one who uses Node a lot has any idea how to do basic things without relying on a library. It's not terribly uncommon for people to think that at least here on HN, I suppose, although I have yet to run into it in an interview or an engineering culture. But if your engineering culture is host to such attitudes, it's best for all involved to be open about that. You'll avoid wasting both candidates' time and your own.
It's particularly absurd. I work on a product that has tens of millions of users built on Node with a team of
dozens of talented developers. The aforementioned library checks both the number version and the string version of a number, to indicate it's "even" or "odd". That Node.js makes it easy and cheap to package up small utility libraries like this is a feature, not a bug, and quite in line with Unix-philosophy. Very easy to troll through a list of millions of packages on a marketplace that's as big and broadly used as NPM, which covers not only backend dev, but also front-end dev since the front-end ecosystem is largely powered by NPM these days. So it's a particularly ignorant hot take.
Eh. Evenness is a property only of integers, so if someone's going to pull in a library to check it, I could argue it makes sense for that library to enforce that the comparison only be attempted over values where it's defined.
Granted that this seems a lot of effort to put into analyzing the contents of a Github repo tagged "troll-bait", from the user "i-voted-for-trump". But hey, this is HN, so it's whatever I guess.
Yeah we forgot it years ago because it was only an issue for a few hours and then lock files were introduced into NPM along with a CLI warning system for vulnerabilities.
Lockfiles don't fix a fundamentally broken dev ecosystem. Users of left-pad fell into one of two categories: people who don't understand the most basic programming tasks, and people who do understand these tasks but are so apprehensive about their own ability that they pull in random libs without even glancing at the source (a single glance would have informed them that they didn't need it). These are both signs of inexperienced programmers.
Amateurishness is normal to some extent, but JS has the ecosystem where beginner mistakes are often seen as the right way to do things.
Or maybe even people who have made ungodly contributions to the science of computing (Dikstra, not the Twitter Twat) aren’t immune to being full of shit from time to time also?
I deliberately omit C# from my resume because while the language is fine, the kind of programs C# programmers tend to write are an AbstractAggravationFactoryPattern of misery.
This posting is extreme but any time I'm interviewing a Java/C# programmer I'm definitely watching to see if they've been brain damaged by the horrible aesthetics and loopy engineering cultures that those languages seem to have for whatever reason
Most of my experience is in C++ and C#. I adore C#... but I agree: it’s as though developers have difficulty getting to the task at hand when using it.
Maybe it’s because attempting even simple abstractions in C++ can foot-gun yourself in some esoteric way? In comparison, the cost to build unnecessary abstractions is lower in C# so many live on.
The ability to gauge the right level of abstraction is the mark of a good developer.
That being said I rather rework an over abstracted C# codebase then a hyper templated , singleton using, multiple >5 inheritance, no STL, void pointing C++ madness.
These systems in my country are still used a lot. Go to a store, look behind the counter and you will see Windows 10 with opened only a maximized window of a green/black terminal connected to an AS/400. I've seen it even on store opened this year! And as they tell me programmers are even well paid since more and more retire every year and the young one doesn't know these systems.
The funny thing is that I'm not even that old, reading my initial comment you would think I'm talking about the 80s or 90s, but I got my experience with COBOL in 2009-2013 (not 4 years straight, I did other stuff too) when working at an insurance company. At the time almost the entire company was run from a few AS400 (and A LOT of office-people doing insurance stuff, of course).
You are probably not getting paid your worth then, experience with these is gold and all the new upstart programmers can't even compete with you on the high-paying jobs that rely on this knowledge.
Im not sure thats true. Last year when the unemployment systems got overwhelmed, I read a state was desperate for cobol developers and was offering some laughable salary. Searching for 'cobol developer average salary' seems to confirm it's not worth much.
These systems are now so old that the only people running them are those that have consistently under-allocated resources to IT. Penny pinchers arent known for paying out huge salaries to people.
Much more likely they'll continue paying as little as possible, and then award a huge contract to Oracle et al to rewrite it when they cant find anyone.
The state might be, however they’ll likely contract the work out and the company who’ll pick it up will pay a lot especially if they taking on that specific contract to get their foot in the door.
You also have a lot of financial institutions, insurance companies, health providers and big retail/manufacturing companies that have a lot of legacy systems and they pay quite well.
I don’t know about that specific case but quite often government institutions are locked into salary tiers they can’t offer more nor do they actually expect to find anyone for that position it’s just often a requirement proper to issuing a tender.
Basically it goes like this “we tried and we can’t find anyone for $56,000 per year to fix our system, we issued a tender and got proposals for $350-400K so that’s the budget we need”.
I suppose that is fair, though I still think the skillset is a valuable and marketable skill worth noting you have. I work in an environment that has both IBM mainframe and modern technologies, and familiarity with both would presumably count as an asset.
I work in a primarily C# shop. I am often quite annoyed at some of coworkers code due to it being what I feel is needlessly over abstracted. I don't know if it's my lack of experience with this style of code, or perhaps I don't know the concept of OOP as well as I should. But it is quite aggravating.
I think it's the frameworks. If you are using something like .Net Core it really encourages you to break everything up into services that can be selected via dependency injection and you naturally seem to end up several layers.
I'm sure there are times when that's absolutely the way to go, but something simpler that solves the problem directly will often do.
The way Asp.net encourages inscrutable code through spooky action-at-a-distance dependency injection patterns is one of the things I actively dislike about working with C#. Fortunately, you can avoid most of it and be more explicit if you want, it's just not the idiomatic way. There's almost always an escape hatch to ditch the overblown abstraction layers and get down to what's actually happening.
If all else fails there's dotPeek and Reflector...
If that pattern is required for proper unit-testing, I don't want to do 'proper' unit testing.
You can write code where your dependencies are injected and can be swapped out for testing without buying into a framework that makes it that difficult to reason about what code is actually being run and in what order.
I don't have experience with .NET core but taking example of Spring in Java (which gets targeted a lot for this sort of thing), you can get away with putting the logic at the outer levels without using services. However, more often then not, you end up using similar chunks of related functionality that then gets put into some common class to avoid repeating it everywhere. If you are already doing that, then why not put them in a service - its just a class with a @Service annotation that the dependency injection can take advantage of. Further, the fact that services are logical containers of such related functionality, creating them actually follows the principle of least surprise (viz. audit related stuff goes in AuditService) and testing/mocking etc becomes cleaner.
Of course, if you are writing a simple utility, then none of this is necessary - you'll probably not use Spring for it anyway and just core Java is fine.
While this was certainly true for C# that was written a decade ago, that is no longer the case with frameworks like .NET Core. Hate it all you want, but no other language does async/await as well as C#. Its ubiquitous in C# unlike all other languages out there. It's surprisingly easy and concise to write but doesn't come with the performance penalty associated with languages like Python. It also runs without any hiccups on Linux now. The only thing that seems to work against it, is it's reputation.
I got started in Ruby by following “Rails Tutorial”. Back then I was a bit arrogant about it and parroted a bunch the DHH bunk.
My charitable reading is they are looking for someone who sees the language as a framework around the OS.
That’s the kind of programmer I feel like I am now. It comes more than anything from learning Objective-C where the fact that the language is a construct is obvious once you encounter an `objc_msgSend()` alongside a [myString uppercaseString]; (or any other message send.)
I have carefully avoided VB, VBScript, Bash, Perl, JavaScript, and Python. I used to do C/C++ but now refuse to touch either.
If it's trivial, I'll just use PowerShell. If C# isn't fast enough, I can always use Rust. If Rust or C# don't have some library I need, Java probably does. If I want something abstract, I'll get around to learning F# or just roll up my sleeves and get back into Haskell. Worst case, if I need to throw the kitchen sink at a problem I'll get back into writing substantive code in Mathematica.
I can't help but feel that this job posting subtly reveals deep-seated ageism in the industry already knee-deep in fashioning and championing latest tech regardless of its merits when in reality these decisions and choices are rooted in tech-bros feeling inadequate and insecure, which also kind of exposes the reason behind a blatant lack of respect for what came before because being a thought-leader is a path way to being a 10x eng-influencer or something.
Not sure you can reach for ageism as the answer when "node" and "Ruby" are on that list. Over the past 5 years those have been two of the hottest bootcamp languages churning out resumes with those keywords on them. I'm shocked to see it, but I would say its more likely they are targeting bootcamp grads than older developers.
If your candidate mentions a certain technology that is awful it is hard to not think it's an awful candidate. Especially if this is not central to the problem at hand.
Yes, CVs mentioning ClearCase go to the bottom of my pile
Mentioning CMMI, SAFe, ITIL or other acronym made to take money out of clueless managers also are heavy clues that you'd be not a good fit.
Dear god why? They're a fin-tech company for God's sake. It's just a database, and a damn good one at that. Sure it's not trendy like Postgres, but the founders will be in for a shock when they scare off big bank they're trying to sell themselves to, because the bank's CTO won't have any clue what the hell DynamoDB is.
I get that they want to avoid code monkeys who've been stagnating in a big bank writing P/SQL reporting software for the last 5 years. But that's why you read CVs. Obviously you need to holistically look at each candidate.
I work at a startup that uses Oracle just for that reason; banks care about that kind of stuff. Auditors will ask basic questions like, "is their data consistent". If the tech team gives the auditors a spaghetti diagram of how their data might be eventually consistent, they'll face an uphill battle being acquired.
I cant speak to ASP and PHP. I've programmed .NET in Mono a little, back on the Aurora OpenSim client (emphasize a little). I can see that reaction to .NET, I had the same reaction to folks who liked DCOM.
Node and Ruby can be used to create pragmatic programs though, but those are typically created by programmers that came to those language from other, more typed, languages. Once you have three or more languages under your belt you start to look for and find each language's pitfalls and architecture astronautics - every language has them. Every language shapes the mind of someone who learns, none more so than the first language you learn. Some anti-idiom pitfalls are found in multiple languages: monkey patching, everything exposed as getters/setters rather than exposing the behavior, AbstractFactoryServiceClientFactory, etc.
However, I don't consider abstraction a dirty word. It has its place, if not overused. I try though to use what I call the 2-4 principle.
I have either 2 levels of abstraction (interface-implementation), or 3 (Abstract, Logical, Concrete) or 4 (Abstract, Logical, Concrete, Functional), and no more. I also try to use the lowest number of levels that makes sense. The You Ain't Going To Need It (YAGNI) principle goes hand in hand with this. I will go back and look at old code to see what I could have done better. Where I've gone wrong with abstraction is usually due to premature anticipation of future architecture.
71 comments
[ 4.3 ms ] story [ 141 ms ] threadF' me, no? Time to throw my CV in the bin amirite?
At this point most people don't even care, just chuckle.
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
- Edsger W. Dijkstra
Maybe php and node are the cobol and basic of our generation?
COBOL is from a different time and family of what we ( mainstream ) understand today as "programing languages". How many "crimes" are committed today writing business rules in Java or C#, etc?
Dijkstra's statement, like anything else has a time and context and I hope something solid from the COBOL family existed today.
What would not be fine is to just quietly have that attitude and assume without checking that no one who uses Node a lot has any idea how to do basic things without relying on a library. It's not terribly uncommon for people to think that at least here on HN, I suppose, although I have yet to run into it in an interview or an engineering culture. But if your engineering culture is host to such attitudes, it's best for all involved to be open about that. You'll avoid wasting both candidates' time and your own.
You're saying that like it's some kind of defense of the library. In the real world it isn't.
Granted that this seems a lot of effort to put into analyzing the contents of a Github repo tagged "troll-bait", from the user "i-voted-for-trump". But hey, this is HN, so it's whatever I guess.
Amateurishness is normal to some extent, but JS has the ecosystem where beginner mistakes are often seen as the right way to do things.
[0] - https://github.com/avinassh/gg-flip
Sure it’d take 15 seconds to write a method but why if you don’t have to
On is-odd! The actual implementation of is-even starts with
(That said, the implementation of is-odd looks like it covers some subtle cases that people might mess up rolling their own...)This posting is extreme but any time I'm interviewing a Java/C# programmer I'm definitely watching to see if they've been brain damaged by the horrible aesthetics and loopy engineering cultures that those languages seem to have for whatever reason
Maybe it’s because attempting even simple abstractions in C++ can foot-gun yourself in some esoteric way? In comparison, the cost to build unnecessary abstractions is lower in C# so many live on.
That being said I rather rework an over abstracted C# codebase then a hyper templated , singleton using, multiple >5 inheritance, no STL, void pointing C++ madness.
These systems are now so old that the only people running them are those that have consistently under-allocated resources to IT. Penny pinchers arent known for paying out huge salaries to people.
Much more likely they'll continue paying as little as possible, and then award a huge contract to Oracle et al to rewrite it when they cant find anyone.
You also have a lot of financial institutions, insurance companies, health providers and big retail/manufacturing companies that have a lot of legacy systems and they pay quite well.
I don’t know about that specific case but quite often government institutions are locked into salary tiers they can’t offer more nor do they actually expect to find anyone for that position it’s just often a requirement proper to issuing a tender.
Basically it goes like this “we tried and we can’t find anyone for $56,000 per year to fix our system, we issued a tender and got proposals for $350-400K so that’s the budget we need”.
I'm sure there are times when that's absolutely the way to go, but something simpler that solves the problem directly will often do.
(not to say that this wouldnt be a good thing)
If all else fails there's dotPeek and Reflector...
You can write code where your dependencies are injected and can be swapped out for testing without buying into a framework that makes it that difficult to reason about what code is actually being run and in what order.
Of course, if you are writing a simple utility, then none of this is necessary - you'll probably not use Spring for it anyway and just core Java is fine.
I got started in Ruby by following “Rails Tutorial”. Back then I was a bit arrogant about it and parroted a bunch the DHH bunk.
My charitable reading is they are looking for someone who sees the language as a framework around the OS.
That’s the kind of programmer I feel like I am now. It comes more than anything from learning Objective-C where the fact that the language is a construct is obvious once you encounter an `objc_msgSend()` alongside a [myString uppercaseString]; (or any other message send.)
If it's trivial, I'll just use PowerShell. If C# isn't fast enough, I can always use Rust. If Rust or C# don't have some library I need, Java probably does. If I want something abstract, I'll get around to learning F# or just roll up my sleeves and get back into Haskell. Worst case, if I need to throw the kitchen sink at a problem I'll get back into writing substantive code in Mathematica.
“Must not have VB.Net experience in the last 5 years” isn’t nearly as outlandish as “No .Net is the last 5.”
Edit: For all the people who upvoted me, you can click the photo and see the whole job description. It wasn't cropped like I (we?) thought.
If your candidate mentions a certain technology that is awful it is hard to not think it's an awful candidate. Especially if this is not central to the problem at hand.
Yes, CVs mentioning ClearCase go to the bottom of my pile
Mentioning CMMI, SAFe, ITIL or other acronym made to take money out of clueless managers also are heavy clues that you'd be not a good fit.
Dear god why? They're a fin-tech company for God's sake. It's just a database, and a damn good one at that. Sure it's not trendy like Postgres, but the founders will be in for a shock when they scare off big bank they're trying to sell themselves to, because the bank's CTO won't have any clue what the hell DynamoDB is.
I get that they want to avoid code monkeys who've been stagnating in a big bank writing P/SQL reporting software for the last 5 years. But that's why you read CVs. Obviously you need to holistically look at each candidate.
Node and Ruby can be used to create pragmatic programs though, but those are typically created by programmers that came to those language from other, more typed, languages. Once you have three or more languages under your belt you start to look for and find each language's pitfalls and architecture astronautics - every language has them. Every language shapes the mind of someone who learns, none more so than the first language you learn. Some anti-idiom pitfalls are found in multiple languages: monkey patching, everything exposed as getters/setters rather than exposing the behavior, AbstractFactoryServiceClientFactory, etc.
However, I don't consider abstraction a dirty word. It has its place, if not overused. I try though to use what I call the 2-4 principle.
I have either 2 levels of abstraction (interface-implementation), or 3 (Abstract, Logical, Concrete) or 4 (Abstract, Logical, Concrete, Functional), and no more. I also try to use the lowest number of levels that makes sense. The You Ain't Going To Need It (YAGNI) principle goes hand in hand with this. I will go back and look at old code to see what I could have done better. Where I've gone wrong with abstraction is usually due to premature anticipation of future architecture.