Thinking of yourselves as someone who is a writer of a certain programming language is self constarining and missing the point.
Thinking of yourselves as someone who is a writer of a certain programming language is self constarining and missing the point.
I definitely learned some good lessons and recognized some patterns along the way, but I think the "just pick it up and learn it" attitude contributes to poor code quality in a commercial context since jobs usually time-box things. I'm a fan of picking something up that I can get expert feedback from, which there again, requires expertise.
I was shocked at how hellish compiling and releasing a large iOS app was compared to deploying a web service, not to mention setting up the development environment and installing dependencies.
Don’t think of it this way. Learning new tools is almost never a waste of time, you just don’t know when you’ll need the lessons learned next. But you will.
Compare that to understanding C or UNIX. There are skills that decay much slower than others.
It sounds like you got stuck learning more trivial things before you had a good foundation in something more substantial (like C or UNIX).
If it weren't for the rampant ageism in the industry, that job might be a perfect fit for someone in their 60s who has already written a few million lines of C and is happy to help less experienced people just get unblocked.
Instead it often falls to the "junior senior" because the "senior seniors" are all pushing 30 and need to work on portable skills.
(Just my observation of the industry, maybe your own case was different.)
Correct! Knowledge around C, Linux, CPUs and optimization last many decades.
Knowledge of tools and libraries in high-churn languages last years at best.
Your point about wasting your finite life dealing with webpack still stands, but just want everyone to know that there is a ray of light in frontend.
That still takes time. If someone is already experienced in an (complex) ecosystem, he or she will be way more effective in it, than someone who has just general skills. I guess I am a very good problem solver. But if I suddenly would have to do a C++ project with all its footguns, I am not aware of (last time I coded in C++ was in university)? I would suck in it for quite a while. This would not be effective at all, unless I would want to change my skillset to the C++ ecosystem.
Yes. I want to work somewhere that shows they're committed to the long term, not somewhere that's focused on how much I'll get done in my first week.
I'm not sure. I'd guess very few companies that hire more than 20 devs a year would have any language requirements. But I don't know what % of jobs are at companies of that size.
Prior experience is almost a curse these days. I learned Go by having the Go team review every one of my CLs for a year. Now I do Go code reviews and think "that simply isn't done, I would never have been allowed to check that in", but often have a hard time supporting my arguments. (When Effective Go, Code Review Comments, and Test Comments fail me, I usually resort to snippets from the standard library. "This pattern appears 0 times in the standard library, I don't think we should use it." It's a lot of work, but I will say that a few things I thought were simply never done are actually done. And that's my standard; I hate it, but Go itself did it to implement Go, so you can too.)
Side rant: I guess the Go team stopped doing this. Read Kubernetes for the current state of Go at Google. Wow.
As opposed to companies which consider them as glorified factory workers, who are insufferably hard to manage and monitor.
I'm currently working with RoR, which I'd never used before, and what matters is that I know algorithms, SQL beyond ORM, how to write code which won't be a nightmare to maintain in a couple of years, etc. All those skills are the same in Rails, in Django, in C++.
There is power in saying No.
> think of yourself as a problem solver, rather than a programmer of a specific language
would be to
> steer away from problems that are boring to you
E.g., there are very cool programs being written in Objective C, so I wouldn't write off a job just because it was in Objective C
There's value in being able to go in, fix a little problem, and make things better for your customers. But you have to balance that against becoming the guy who works on the unimportant projects. That's real bad. If there's growth potential for the forgotten app, you have to get buy-in from the business and not just sideline yourself away from the things people care about.
Often these tarpits were contractually mandated. One customer wants a particular integration, so a developer builds it, and it works for the customer and everything is fine until another customer comes along wanting a similar integration and now the original dev is gone.
But the question would be if one wants to be the go to guy for keeping old cobol things running.
If you have just a bit of bad luck, you may have a carreer with no real deep involvement with anything, not even talking about the fact that the language is just one aspect of your productivity.
Although I’d suspect there isn’t a lot of refactoring going on in some of those code bases you describe.
You just don't want to be the person tasked with work that's only done because some contact got signed. Identifying the difference is hard.
The thing about this is that this isn't just a language change, this is an ecosystem change. It's one thing to go from writing Python based web apps to Ruby based ones, because web dev has a lot of concepts that will apply no matter the language. Objective C might be something you can pick up no problem, but having the learn all about mobile development and that ecosystem is a much larger task, and I could absolutely see that getting exhausting if you're hopping from web, to mobile, to desktop, to embedded, etc.
Ecosystem switching requires a lot more of a knowledge shift than just a language does, IMO.
I have another perspective, I think code quality are pretty uniform across languages, either all of ones code quality is poor or it will be fine across all language one writes.
Most of the code quality stems from logically dividing the building blocks and making it readable. Hence it should be logically traceable and uses the basics whenever possible. This is good, readable code.
Obviously some languages demands greater knowledge (e.g. C, Haskell) to master and use appropriately but they are a minority.
Being an expert at a single general-purpose language will often make you more productive as you can focus on the business problem at hand rather than spreading yourself thin across different languages where you'll perform worse until you become an expert at them (which is unlikely for anything more than a handful of languages and even that requires working with them regularly).
To me, that's a reasonable investment to make.
Edit: This does require a certain persona in the space of "reasonably good dev". People who have spent their entire life focusing on a single language or paradigm are a lot less likely to be able to shift gears. People who have broad exposure to different concepts are more able to say "How do I do X in Y?" and stop fighting their new language.
The quality just isn't even close. Recently I outsourced a project to two groups of people. A jr dev who had 2 years of experience but all of that experience was with the tech stack, and 2 sr devs (10 yrs experience) who had < 6 months experience with the tech stack. And the jr dev (who was an inferior dev in general) blew them out of the water because of the tech stack experience.
And honestly in terms of raw talent I think the sr devs were better, but it just didn't make up for the lack of tech stack experience.
So the Sr devs wrote a bunch of really funky react code and the jr dev just wrote normal looking react code.
Original poster used the term fluent for someone with a few weeks to months of experience which both Sr devs had.
Job specialization is good. I mostly write TypeScript, and I can usually contribute the most value to the company by writing TypeScript and sticking to frontend things. Sometimes though, the fastest way to solve a problem is for me to dive into the backend, and I have no qualms with doing so.
Some people on my team treat the “other side” as totally foreign, however. This leads to willful ignorance and glaring inefficiencies. For example, someone asked my senior frontend teammate a question, and the answer could be found trivially by someone with an inkling of backend knowledge. Yet, this person threw up their hands and dragged a backender into the conversation because they couldn’t be bothered to learn a single thing about the backend in the 5 years they’ve been with the company.
Please just be a problem solver. Don’t be just a “backender”, and definitely don’t be just a “Nim developer”.
But that's not at all what the OP asked for. Maybe they're already making >400K slinging JS at Facebook or Google. Lots of people do!
I put certain languages in a general negatives bucket along with noisy offices, stack ranking, heavy process, etc.
(whisper voice) kotlin
1. Not every shop will let you use it
2. Kotlin has a bunch of the same limitations.
Yes, Kotlin/Scala would stop driving you crazy. No, I don't see nearly enough Bay Area companies deprecating Java in their favor for new services :( They are probably betting on the next LTS to come soon enough (with pattern matching and hopefully Loom).
I also can’t center a div on a web page or do much of anything other then what I do.
Specialization IMO is key to highest job satisfaction and highest salary in this industry
I mostly develop on a computer which isn’t connected to the internet (so no Google, Stackoverflow etc…) and I often think how miniscule fraction of “full stack” developers could perform even the most menial task in any of these “stacks” they apparently know
Accounting for taxes and moderate expenses, at the end you should be sitting on close to 2m USD. That's more money than the vast majority of people make in their lifetime (after taxes). If you don't plan to live to a hundred you'll be fine even if you don't do any higher-risky investing, slowly spending it.
> Ask HN: How do I learn real-world COBOL? https://news.ycombinator.com/item?id=31906829
How does one learn to do what you do (write COBOL in the real world to make a great living)?
I work in a team with a codebase split 50/50 between C# and C++, and if you're not proficient in one of those then the chances of you getting hired, even if you're an incredible programmer, are slim.
Our industry went to the trouble of inventing a whole new language (Rust), which is now being championed by major industry players, because those footguns are so non-obvious. "Trusting" smart people to "just not make mistakes with pointers" was clearly the wrong choice.
If you haven't used C and C++ before, it's reasonable to think you're going to make those first-time mistakes with your code inside their codebase. That's a good argument for not hiring you and only hiring experienced C/C++ programmers.
In practice, that's exactly what those companies do.
Employers and companies can't find enough developers to satisfy the demand.
They should provide a bit of wiggle room and train internally as well. Three months getting into a new language/framework is not that much compared with the cost of hiring.
Sure think of yourself as multi-lingual and able to learn anything (which you probably are). But don't market yourself that way, especially if you're a contractor. People want someone who knows their tech stack and they want you to be productive yesterday.
I'm not sure becoming a high paying/good software engineer are necessarily relevant to the stated goals of the OP's question. There can be inherent reward in working with a set of less popular, well crafted tools. Yes you might grow faster as a professional by working with a group of industry best JS programmers, but working with a small team building in Elixir and moving fast without ever hitting a NaN can be a pretty rewarding experience.
I rather say "be a generalist on the long term and a specialist on the short term".
This is all my opinion and comes from my personal experience, though. Take it with a grain of salt.
Knowing a language is helping you read/write the code in a good quality. Knowing the ecosystem and solutions in this language is your sellingpoint. Take any language and tell me one can be productive in no time without knowing the ecosystem around it.
Within our team we use 5 different mainstream languages to accomplish different goals within our system.
We handle a single service, but we manage the full stack using many different languages and frameworks.
We don't have to be expert in the frameworks, we just need to be experts at what we are building. And we learn each framework to the point where we can accomplish that.
The "selling point" that we value is to be able to deliver.
Whatever work you do, you will forever be the person who has done that work. Next time something needs to change in that domain or language, you might find yourself talked about as a specialist!
The moral is to choose and pick your projects carefully. Vocalizing your experiences with your manager goes a long way for shaping your future: like “I liked working in X and I want to do that more” and “I am glad I got to try Y, but I really didn’t enjoy it.”
More specifically, it's probably not useful advice.
I'm a generalist in a few languages, and I'm painfully aware of my lack of 'depth' of insight into the languages I use when I'm not 'knees deep'.
For some niche languages, you can't just 'read a book' and 'check stack exchange'.
I think we should all be 'multilingual' but it really helps to have depth of expertise.
They can lead to what I call "rabbit hole" jobs, which make it very hard to change disciplines thereafter.
Now most recruiters, and even hiring managers, rarely have an idea of the nuances of development during the interviews I attend... Because usually their a buddy of executives within the company more often than being there for their capabilities or educational background. When the technical component comes, I also often get paired by another dev within the company, or a person with a technical grasp that's totally outside of what they know, so keeping my knowledge diverse, and being able to adapt to what I don't know is key in order to be worth a good salary.
Adapt and improvise, manage their expectations of you, but most importantly, know how problems get solved correctly. The tools used don't matter if the house built is well done.
As an experiment, one can create two resumes with different identities where the first one is listing Nim as a skill and the other one is listing Java and Spring as skills, and apply to the same jobs. I wonder what the ratio of replies will be.
I have created a lot of Nim projects and implemented much of its stdlib. My full-time job isn't using Nim, but the experience I gained through my work in Nim has helped my career significantly.
The keyword here is good. Even then, this isn’t largely true. It is quite hard to convince companies to hire for a skill that you already don’t have experience in. In most cases, there are gatekeepers - those lovely recruiters who don’t know the difference between a computer and a washing machine.
True, but most companies care more about using popular language rather than an innovative one. You might get hired but you won't be using Nim at work.
[0] "A language that doesn't affect the way you think about programming is not worth knowing." -- Alan Perlis
Some languages contort and constrain your thinking in bad or silly ways.
> Thinking of yourselves as someone who is a writer of a certain programming language is self constarining and missing the point.
I find this view tends to lead to only using popular languages anyway because you don't seek out any specific language, so the effect of this belief itself is self-constraining.
For example I took a position to do mostly infrastructure work. Most of their services are written in PHP which I haven't used since the early 2000s. I wouldn't classify myself as a PHP developer. Sometimes I find myself diving into the code to self-solve issues I have that are infrastructure related. My thought process is if I can solve a problem and it's within my scope of things to do I'd much rather just do it than add extra work to another developer on the team. In the worst case scenario someone with actual PHP experience who does the code review will offer suggestions to make the code better.
I don't really know PHP but I can look around and navigate the code without issues. There's nothing that looks too foreign and the code is easy to grep to find stuff. It's also not too bad to trace code in a large app and understand the logic. There's also a massive amount of Google results for almost any problem you can think of. It really means for a lot of cases you can combine previous experience and be productive in a similar language without really knowing it. Enough to contribute real code that gets shipped to production.
I ended up doing this yesterday where I added an IP whitelist address exempt config option to one of our apps. I wanted to at least toy with the idea of doing IP range detection within a CIDR block.
In Python this is really easy, the standard library has functions to do this with 1 line of code. Ruby's implementation is even easier and built into the language. For PHP I had to Google around but found a pretty small custom function to use in less than 2 minutes. For Elixir? Well you have to use a 4 year old+ third party dependency or dive down into Erlang and understand pattern matching and write a bunch of code to manually do the comparisons. Maybe there's a good Elixir solution but it wasn't on the first 3 pages of Google when searching for similar terms as I did for Python, Ruby and PHP. Weirdly enough if you search for "elixir check if ip address is in cidr block range" most of the top results are StackOverflow posts for other languages. There's no contest in comparing the amount of effort it took to get a solution.
I know this is 1 just example but I also know when I tried learning Elixir (and did end up writing about 10k lines of code of it) I kept running into situations that took half a day or longer to figure out while actively trying hard to learn and use the language. These problem could be fully solved in a production ready way in 5-10 minutes with Python or Ruby (and I guess PHP too) either by knowing how to solve it in an imperative way or finding nearly a perfect solution when Googling that's digestible enough to where you can fully understand it and apply it back to your problem.
Can we please stop using “4 year old+” as a generally applicable rule to reject libraries?
I know “4 year old” seems like forever ago in Ruby or Node (I can’t talk about Python or PHP), but other ecosystems such as Go and Elixir take compatibility seriously and “4 year old” libraries most often just mean they are done: they work for their intended purposes and there are no breaking changes in the language or tooling forcing frivolous updates.
I have used 8 year old Erlang libraries in the past with no issues whatsoever.
Nope, I only looked up the Elixir solution for the sake of my reply here. I haven't worked with Elixir in like 9 months.
Based on the docs it says IP.Subnet.is_in only supports IPv4. The Python and Ruby solutions transparently support both. That kind of sums up my Elixir experience (ie. something might partially exist but to really use it will require a lot of extra work). It's also impressive at how infrequently the Elixir docs come up in Google searches. It's strange considering how many words are there and it's the official source of information for the language.
Honestly my experience with python has been "the solution you're looking for probably exists, but using it will require a lot of effort, and heaven help you if you need to debug someone else's code", but I have mostly dealt with Django which is a nightmare of hidden code and tensorflow. Maybe it's just I've worked with shitty python devs and on the other project Google's notoriously bad engineering practices in some of their public facing OS projects (angular, tf)
Does that mean you can do something to make it transparently support IPv4 and IPv6 even though the docs mentions it only supports IPv4? Will it be more than 1 line of code?
> Honestly my experience with python has been "the solution you're looking for probably exists, but using it will require a lot of effort..."
I found it to be the opposite approach. The last time I wanted to increment a counter outside of a nested loop in Elixir it sprawled into a multi-week conversation with the author of Elixir, a git repo with 100+ programming language examples to solve the same problem[0] and a proposal on potentially altering Elixir itself to make this process a bit easier. The Python solution was about 2 minutes typing into my code editor and moving on with life.
Elixir solution: https://github.com/nickjj/nested-data-structure-traversal/bl...
Python solution: https://github.com/nickjj/nested-data-structure-traversal/bl...
I'm not saying either language is better than the other but there's certain things that can done a lot easier in Python and on the flip side I'm sure there's things you can do a lot easier in Elixir.
I found in practice for me personally when building typical web apps I kept running into roadblocks left and right with Elixir where as I never had these issues with Python or Ruby. That's why I stopped using Elixir.
> I have mostly dealt with Django which is a nightmare of hidden code
I think that'll happen with any big framework, especially if you haven't contributed a ton of code to it. The Rails code base can be intimidating too and Phoenix's code isn't any more approachable to someone who isn't already at the high end of expert with the language.
[0]: https://github.com/nickjj/nested-data-structure-traversal
I don't think the data structure was that crazy or rare. It boiled down to looping over 2 lists and wanting to keep an independent count of each one.
I do not need a high paying job for various reasons, but I still want(/need?) to do something fulfilling and wouldn't mind getting paid for it.
I like research. I have been doing academic research for the past few years, so I am still considering a PhD. I definitely do not have to worry about a high salary there! But I also like plain old solving problems with programming, so I am considering going out and getting a job as a programmer (again).
Since I don't care much about high pay, and I do care about enjoyment and self-fulfillment, it seems that I should be picky if I am going to look for jobs. I do not find fulfillment in high compensation, though I understand that others might. I would rather do something fun, interesting, or unusual, while avoiding features I already know I dislike.
For example, I learned OOP a bit in college during my first-ever programming course (Java). It didn't stick and all I learned was that I don't like OOP. Surely this suggests I should avoid jobs/languages that require an OOP paradigm?
Like, sometimes I think I should just go back and hardcore brush up on my C programming and go get a job writing C somewhere. Or see if I can translate my academic R/Python skills somewhere. Or go learn some functional language and see if I can get a job doing that.
> Thinking of yourselves as someone who is a writer of a certain programming language is self constarining and missing the point.
I totally get where you are coming from. For example, many people do jobs they dislike or don't care about knowing that it enables activities/experiences/purchases they do like or care about. But really, does this not fully depend on what each person subjectively thinks "the point" is?
The point for me is that I would like to enjoy all of my life, not hate my work time and only enjoy my leisure time.
Maybe I'll figure it out someday.