Comment by xwolfi
3 years ago
Yes but I interview for a role where we dont have set languages: we're a small optimisation team working across system when they reach capacity bottleneck and we do JS, C#, Java, C++, PL/SQL fixes completely transparently, we've slowly learned that languages really dont matter all that much for performance tuning as much as programmers mishandling which are identical in all of them (hash map loops, abusive recursion, over abstraction leading to extreme indirection, serialization laziness producing giant message transfers, database transaction mismanagement, zero profiling skills, and the main one: please stop frigging saying it's the garbage collector and look at your crap for real lol).
When we recruit we ask "if we tell you no more Spring and we'll work on any language as long as there's a problem to solve, how do you feel". Most either say they d feel horribly sad, or dont even comprehend how it's possible. Some are indifferent because they need the job. Still looking for the guy that says "anything can be learned in a reasonable amount of time" so it s not that obvious I suppose :(
I think both sides of the argument have reasonable points. There are advantages to having deep experience with a tool, but I have also solved bugs in languages I didn’t know.
What I think is missing is there are serious diminishing returns with more experience in a specific language or framework. 10 years of experience split 3 in Java and 7 in C# is very similar to 7 in Java and 3 in C#.
But the two languages are very similar. I get your point though, it's not clear how much you gain by doing 20 years of PHP over 10. I think this isn't unique to programming - is a lawyer with 20 years of experience necessarily better than one with 10? An accountant? A nurse? And so on and so on. I do think looking at myself I am much better in my 10th year than I am in my 5th - not only in specific technical tools but how I approach things, how I relate to others etc. So some of the gains are in soft skills which are super important to be effective. However will I keep improving at this pace? Probably not. Who says I have to keep improving exponentially?
Actually yes I would expect them to. They should keep up to date with changes - laws change all the time. New equipment is created for medicine all the time. These might be pretty fundamental and are not soft skills.
Maybe the base "lawyering" or "nursing" does change but they'll have seen a lot more examples and be able to pattern match quicker.
Also I'd rather a 20 year nurse was the Charge Nurse rather than a 5 or 10 year one, I'd expect they'd know more how to lead others (although time served isn't always an indicator of a good leader).
1 reply →
This sounds like my dream job, actually.
It's what I do at work for fun, in between my "real" development / support tasks. I profile and optimize our internal application, its loading time, user interactions, etc.
Sometimes when it's a long term I make a proof of concept and ask for permissions later, so for a while optimization becomes my actual job. Just finished a couple of months of performance tuning, actually, which I did in parallel to other tasks.
TBH there are plenty of easy, low hanging fruits since the team who wrote it wouldn't recognize a performant code if it smacked them in the face. Or they concentrated on very minor optimizations in rarely executed parts of the code and tended to bikeshed them for hours instead of actually checking what the real problems were.
I actually almost never use an actual profiler when starting, I just run under the debugger and pause the application at random instances when it appears to be stuck.
In almost all cases I find it's executing some unnecessary batch of queries, or reading from a table using an unindexed column, or redrawing parts of the screen which shouldn't be updated, or throwing and catching exceptions that were used instead of if statements, or blocked when it could run in parallel to some other computation, or doing some other unnecessary O(n^2) loops instead of using a hash table. A combination of such improvements will sometimes gain up to 20%-40% speed or even more.
When I'm done with these simple cases I start using a profiler for the that extra optimizations for those extra percentages.
Agreed about the dream job, that's pretty much what i explicitly answer every time i am asked about my preferences in terms of stack/tech to recruiters and engineers i interviewed with. I lucked-in into such a situation at least once, and I can confirm that I still enjoy it.
I can definitely see why some people might hate that situation, because it feels like nothing is working and you dont know anything at first. But if you aren't demoralized by that, and instead find joy in learning/figuring out all those new things on a regular basis, it all feels extremely rewarding. Like, why would I dislike being paid to essentially learn a bunch of new stuff regularly and solve actual real world impact problems using that new knowledge.
my gosh this was my first real developer job back in the day, just like this. we were a so called "hit squad" and brought in to fix longstanding issues (this was a Fortune 100 company, where they had more internal software than developers to manage it, some of which was actually mission critical for the departments it served)
I learned so much in that job, and probably would have kept it had they not relocated it to Santa Clara.
If you can work in an environment like this for a few years you definitely should, that's my advice to everyone. You'll learn so many things that will be useful over the rest of your career.
If you are doing optimizations I would say you need at least a few years experience in the language. You often see people say they switched from language A to language B due to performance, then some guy optimizes the same lib/functions in language A and it gets 10x faster then the optimized version in language B... and people say: Yeh, but that guy has several years of experience. Once you know the layout of the minefield almost all languages are usable and performant.
Depends of the level of maturity of the system. I d agree you need to be a C genius to accelerate the linux kernel a bit, maybe.
But most software aren't the linux kernel, they're small systems solving a class of specific problems as fast as possible with rotating teams, so it sometimes is just a matter of profiling this stupid hashcode function or asking why the mouse is freezing during high trading volume on the C# GUI :D
You wouldnt believe how common optimization problems are and are not related to GC, a belief I have to disprove very often (look 300ms of GC a day, but hey, you're checking an unindexed table each calculation for a trivial non essential decision, what if we fix it)
Agreed. I once "optimised" an in-house software that took minutes to process a single report, down to seconds, just by adding an index to the database (Microsoft Access, mind you) table. Not all developers know what they are doing [1].
[1] https://news.ycombinator.com/item?id=26296339
2 replies →
Eh, there are a few language-specific gotchas, but if you're good at optimization it's really nothing too tricky to figure out within a few weeks. The core problems are the same, depending on the class of language: far from the metal, allocations and GC are almost always what kill you. Close to it, cache misses.
Beyond that, it's just making sure you do less stuff, and being really aggressive with profiling (what looks like it takes the most time in the code almost certainly isn't what's really taking the most time).
Anything can be learned in a reasonable amount of time, but I already have a job. Good luck in finding your candidate though, sounds like a great environment to work in :)
I hear you. I'd also ask what seniority you're asking. My relatively young friend group routinely scoffs at Java and C# shops for making a big deal out of experience in one language, while the two languages are slowly converging to be nearly identical in most places that matter. But I definitely see this attitude more around the 10+ YoE crowd.
>> "anything can be learned in a reasonable amount of time"
I routinely say something to this affect in jobs for which I a interviewing. I tell them I am not an expert in anything, but I feel I can learn anything given enough time. The caveat is in some businesses time is the limiting factor and the business doesn't have the time for me to learn.
But I'd love to work for your company or one like it.
Anything can be learned, but not necessarily in a reasonable amount of time. Some things are easier to pick up, some are just impossible. Example, I was doing PHP for 11 years then jumped to Go 9 years ago (wow it has already been 9 years), Go was good for me because it lifted a lot of mental burden of the OOP craze and wrong concepts applied back then. On the downside, it didn't have an ecosystem. But it was easy to pick up.
k8s surfaced and I tried to learn about it, but it's just too complicated. After I had spent 2 weeks of intensive mind bashing at it, I still wasn't able to manually set up a 3 node initial control cluster. I gave up on it, never looked back.
Spring boot time and again, medium difficulty picking up, mostly because of the exclusive Java community, if something like that even exists. Very arrogant bunch that speaks in implicit ways and assumes you just magically know stuff.
Android is similar, always in flux, despite the many resources offered by Google you don't know what to pick. New Jetpack compose or old, ancient seeming xml layouts and configuration and navigation configuration. It's a hot mess. I tried to use AppAuth OIDC client, has a few questions, asked, the response was "We assume some prior Java and Android knowledge". Well, ok thanks for nothing.
Angular, aside from rxjs, which was royal pain in the ass to learn, straightforward, albeit a bit overly complicated and typescript gets in the way more than it should.
Jumped to Vue. Oh dear god, it's so nice and easy. None of the rxjs stupidity, no forced typescript and a large ecosystem. I can be super productive with it and create SPA, PWA, SSR, Electron apps, browser plugins, even hybrid mobile apps with it.
Rust, my arch enemy. I tried to get into it, I was drawn by hype and the promise of more performance. But knowing Go, which is just good enough for the backend, and where things make sense, Rust doesn't make sense for me. For someone coming from C++ it must seem like the 2nd coming of Jesus, for me - the Go guy - it's an abomination. Yeah I get the basics, but imports don't make any sense, structure doesn't make any sense, erorrs don't make any sense. I feel like a freaking transporter always worrying about crates and boxes and who they belong to. Not fun at all. Handle with care, careful breakable. UGH.
Yeah anything can be picked up but it depends on me being interested in what's to be picked up, the willingness of others to teach and the justification of why I need this added complexity.
I write monoliths and I'm happy with that. Now all jobs postings require Microservices and EDA. I'm unhappy with that because I don't see the need for it in most cases. Now I have to learn expensive cloud on my own, which I have ZERO motivation for. I have to make everything extra complicated, it's hard enough as is getting a project done start to finish, client and server, the monolith way. If I'd have to go Microservices I'd never finish anything and even if, when launching until people actually use my service, 3 years later I'd be bancrupt. So where am I supposed to learn about this unless employed by those people who want Microservice EDA? But they won't employ me because I have no experience with that.
See I feel you have missed a lot of points, it’s like you’re pragmatic as hell are creating stuff but by the choices you seem to have made it seems like you have got quite a surface level understanding of some very well thought out stuff that has good reasoning behind it because you want to make stuff with ease regardless of how maintainable it is it how much tooling can help you. I wouldn’t chalk stuff entirely up to hype.
I think some skills are more valuable than others because they don't change that much. Java is valuable. Go is valuable. PHP is valuable. C is amazing. JS frameworks...not thanks. I think of moving from full stack development to backend due to this..its a bit more sustainable.
> please stop frigging saying it's the garbage collector and look at your crap for real lol
Because if the garbage collector is the bottleneck you need to fix your code to not produce so much garbage.
The first issue I tackled at one of the jobs I had was slow JSP page performance.
The code had some sizable chunks of JavaScript in Strings and looked at each authorization the user had. Its been awhile, but in dynamically generating that JavaScript (ICK!) it generated several megabytes of garbage Strings by doing `script = script + "little bit more";` way too many times. This was done for each page load. 8am and hundreds of people click the page to get their start of day stuff... and... server has problems.
That particular issue was fixed by changing it all to a StringBuilder.
I've yet to see any sloppy garbage creating that is on the same order of magnitude as that JSP was.
Must have been a long time ago. It's been almost a decade since that code pattern started getting compiled into calls to StringBuilder by javac.
1 reply →