Hacker News new | ask | show | jobs
by schroeding 1385 days ago
Elixir, Haskell et al. require concepts that are not required at all in e.g. Java. The functional programming module at my university had the highest failure rate after the math and statistics classes.

Even something like C can require new concepts. I was a tutor for a university C programming course and students that had no problems with Java struggled hard with direct memory manipulation, pointer arithmetic etc., because those were foreign concepts at that point.

You can't expect Devs to self-teach each other those concepts on the side, that (advanced into their studies, third-year) CS students struggle with hard. If you want your OOP Devs to learn e.g. functional programing, you have to give them dedicated (paid) time for this, IMO.

11 comments

This is a bit overblown, IMO.

I'm currently in the process of interviewing and hiring for a dev to work on an Elixir code base and I barely care at all whether or not a candidate has ever used it before.

Last year I worked with an (excellent) ex-Bridgewater dev whose experience was mostly JVM and JS and he ramped up on Elixir and Phoenix very quickly. We pair programmed a couple of hours a day and he was productive in a few days and over 90% of the way there in terms of picking up needed frameworks, libraries, etc in a month. Learning lower-level concepts with C/C++/Rust is a bigger challenge, but still not that big if someone is using it all day at work.

I'd be very concerned about devs who can't self-teach, regardless of whether or not they have a CS credential. That said, I do believe in mentorship on the job and some slack during paid hours for people to learn and improve.

In many ways, learning is the job of a software engineer.

> some slack during paid hours for people to learn and improve

A key ingredient missing in the blog post, IMO. :)

Yeah... short-termism is a real problem.
What would have happened if your team didn't already have a bunch of experienced Elixir users on it? You'd have the blind leading the blind.
For the project last year, it wasn't a bunch. It was just me and the ex-Bridgewater guy who was learning.

Also, I taught myself back in 2017 while working on my own startup. Even back then, the docs were good and there were lots of helpful people on the internet.

You're very fortunate to have the opportunity to learn "on the clock" then. Most developers are lucky if they can block out a week to learn something that isn't directly connected to "a feature".
No. I'm afraid you misread. I self-studied in 2017, while working on my own startup (and living on under $1k/month).
In that case they should have probably not picked Elixir?
A working dev should be well beyond the understanding of a third-year CS student. This is not "advanced" from the perspective of someone in practice, it is the requirement to get in to the practice.

(I know people get programming jobs without CS degrees, but if you can do that, you can teach yourself how pointers work)

I don't have CS degree but I do have 7 years commercial experience with Python/Django Rest Framework and I have no idea how pointers work.
Right, there’s no reason you’d need to know in Python.

How quickly could you pick it up if you had to?

https://en.m.wikipedia.org/wiki/Pointer_(computer_programmin...

I am in a similar situation having a lot of working experience but only in a specific domain (web), and no formal CS education.

I only used pointers in one specific context, while working for about 3 months on a Go codebase. I was able to get my code working without too much trouble, but pointers were a source of some headscratching for me out of ignorance and tbh I didn't work there long enough to fully learn or internalize it... I vaguely remember adding a * or & here or there to make things work.

I've been interested in some kind of class or learning reference for some of the more "CS" topics that I don't use but would still be nice to learn. I started an OSSU course or two but haven't made much progress since I get bored when they go over some fundamentals that I already feel confident on.

If you need to understand what Python is doing under the hood, you’ll have to have some understanding of pointers.

Not having a decent mental model of what’s happening a few levels below severely limits the kinda of problems you can solve.

That's a bit harsh.

I'm familiar with C/C++ and how pointers work, but that part of my mental knowledge never comes into play when I write python code, whether Django or not. And I've written substantial code in these two environments, they don't really intersect.

I mean, maybe once in a couple years you'd run into some weird problem that requires deep knowledge to solve, but "severely limits" might be a bit of an overstatement. (And might be some form of unwarranted gatekeeping IMHO.)

Everyone has limits/gaps in their knowledge, while C and pointers are part of the standard curriculum for CS degrees, not everyone has to be such cookie cutter devs (as long as they do their job and their employers are happy)

When the OP said they "have no idea how pointers work", I took that to mean they don't know know anything about how memory works. Why does does copying this array, not copy the contents of the array. Why does accessing a random value in a linked list take so much longer than accessing a random value in array. What happens when I reassign a local variable.

Developing an underlying mental model of what's actually happening is so much more effective than treating a programming language like a black box.

As far as "severely limits", there are many jobs where you could spend your entire wiring together libraries and asking more senior developers for help when you run into edge cases. But if you want to be one of those people who gets called in to help, you need a basic understanding of memory indirection. You don't need to understand pointer syntax in any specific language, but you need to have some understanding of what happens when you type x = [1,2,3].

At many tech companies, I doubt you could even make it passed the interview without a basic understanding of what a pointer is.

What sort of problems would you need to be doing in Python that aren't already done by libraries like NumPy which would require that sort of mental model?
The only thing that comes to mind would be memory leaks in long running applications caused by your data structures having some link to a link to a link that prevents temporary data from being garbagecollected.
I expect you're much closer to understanding pointers than you think. If you know the difference between a deep copy and a shallow copy then you understand the principle.
On top of Python's class semantics, if you understand Python's weakref class, you are about 90% of the way to pointers.
That’s not something to be proud of.
I'd go one further.

If you struggle with pointers and direct memory manipulation in C, you didn't understand Java nearly as well as you thought you did.

There's a distinction between reference and pointer in C++, but in Java they're basically the same thing with roughly the same semantics, up to and including the ability to be null.

In mathematics first year students who have started specializing already have knowledge that PhDs in other mathematical specializations don't. CS is exactly the same.

You can't teach Joy to someone who has only programmed in JS any more than you can do the reverse. The difference is that we have a lot of people who have learned only algol derivatives and don't understand just how _weird_ the zoo of non-standard languages is.

Right, "advanced" into their studies, they weren't freshman but almost done with their bachelors degree.

And yeah, I believe that most developers can learn pointers and FP, sure, but on the side with pair programming and "mob programming", while still working a full time dev job?

The point of the article here is that if it's a language your company uses, learning it is part of your dev job.
Yes.
Without using their free time?
Depends on the company. Where I work, the answer is yes. Work/life balance is heavily stressed, which has been a surprise. However, when I started my career, it was with the expectation that staying up to date with technology would require some personal time. I don't personally know anyone that didn't start a technical career without that expectation.
I respectfully disagree. I think CS students struggle with this because they have a general lack of experience rather than a specific lack. I've found that I pick up "new" concepts like functional programming easier now than in college. I chalk this up to being able to link like concepts in the brain as you learn and are exposed to more post-college. New concepts aren't usually completely novel or original. Chances are it's going to be based on something to which I've been at least tangentially exposed to in my career.
Eh, I respectfully disagree to your disrespectful disagreement. Things are just different, there is no way around that.

Citing past experience is cheating, if you had already encountered X before to the point that learning it in detail is a negligible cost to you, then you're not truly unfamiliar with X, you amortized (part of) the cost of its learning over the past encounters.

There is no way, and I mean no way, a e.g Java programmer is going to be productive in a Haskell without a 3/6/9-month (depending on how much learning is "productive") learning phase where they are, most of the time, a "read only contributer". Java and Haskell are just too different computing machines entirely. Bad practices here are good practices there, good practices here are bad practices there, how I can describe it? It's literally programming a different abstract machine, they both eventually compile down to electrons but the journeys they take are vastly different.

I think the post title must contain an implied "And be prepared to mentor them while they are being unproductive". In the jumpy 3-years-at-most-per-job world of most tech jobs, that's unacceptable for employers unless they're really desperate.

Eh, I wouldn’t necessarily correlate university students’ behaviors with those of even a mid-level dev. Their knowledge bases and even opinions and goals are entirely different.

I was certainly a much worse developer in university, and since leaving my desire to self-learn has increased tremendously.

That said, I definitely agree on paid time to learn, I think that’s a core concept that a lot of places lack. And not just for new hires where onboarding is costed in, ongoing learning that is encouraged and paid for is key.

I have just spent most of the past year learning F# as my first real functional language. All in my own time. It took a lot of my own time. I've purchased many books and sunk many hours.
Aren't you kind of paying them to learn directly by doing language agnostic hiring? More that you can't expect them to be productive quickly, but that goes for any hire right?
There is a pool of people that can invite calculus on their own.

Another for those that can learn it on their own.

Another for those that can learn it in a multi year schooling system.

Limiting yourself to hiring from the smallest possible sets is challenging.

If you only know java are you even a real (professional) dev?

I'd expect any dev wanting a job using a language he doesn't know to have some understanding all of the concepts you're talking about. It's not language specific, it's just the basics of programming.

>If you only know java are you even a real (professional) dev?

lol, if I were java dev I'd be pissed off.

honestly this unsound argument that dev which knows more languages is better just because of that needs to die.

Concepts are above languages

You don't have to know languages in order to be familiar with the concepts.

Additionally certain languages do not offer real value to the other

For example I've been writing shitton of C# and from time to time I jumped to js/lua

Messing with those languages didnt gave me anything except pain.

Meanwhile one harder project can give you times, times more - try writing browser, compiler, etc.

__________

Software engineering is deeper and more important than fancy language features and handier ways to express things.

But yea, it's easier to mess with people about their lack of understanding of monad than

arguing about system design, practices & approaches to system modeling cuz they do require context :)

"You don't have to know languages in order to be familiar with the concepts."

If you only ever coded in a language that doesn't even offer you the ability to tinker with some concepts, you can't be familiar with those. Reading one article about it without ever touching code, is not being familiar with a programming concept.

I'm not saying you should know 10 languages, but if you want to be anything more than a frontend dev or a bad web dev, you need to be exposed to more than 1 language IMHO. I'm not saying you should be an expert, or used multiples languages for years, but at least trying other languages with concepts not available in your favorite language.

>but if you want to be anything more than a frontend dev or a bad web dev,

Ive jumped from web/desktop dev

to semiconductor industry and worked with the same language.

And the biggest problem was lack of the domain knowledge, not langs.

You can find various langs being used in various places to the point that sometimes you'd be shocked

>If you only ever coded in a language that doesn't even offer you the ability to tinker with some concepts, you can't be familiar with those. Reading one article about it without ever touching code, is not being familiar with a programming concept.

I disagree, you're familiar by definition.

You're just not experienced and may be not aware of pros and cons unless the article/book/w.e showed them.

Whether experience is important is up to the thing you're talking about.

For example: stealing Result<T> from other language to replace exceptions in your language doesn't require you to use Result<T> impl. in other lang.

> If you only know java are you even a real (professional) dev?

I'm a polyglot but Java is the language I used the most and I can guarantee you there are many professional dev I met and worked with that only know Java and make their comfy living writing only Java. Java is powering the real world since more than two decades now and the JVM is some rock solid tech with extensive tooling, so they can get away with only knowing Java.

A dev can definitely focus only on Java and, for better or worse, makes all his career, from his first job until retirement (to me it's obvious Java is here to stay and it's going to dwarf COBOL's legacy), writing only Java.

Nobody said frauds can’t live comfortably.
Why on earth would somebody earning their pay by providing value and doing the job they were hired for be a fraud?

Not all programming jobs require a PhD in computer science. There's plenty of people out there writing line-of-business software, and that's the stuff that makes the world work.

Sorry, poor choice of word. I meant dilettante, not fraud.
> If you only know java are you even a real (professional) dev?

You surely are, everyone who gets money for developing applications is.

FYI, functional programing and low-level programming isn't even a part of the curriculum in some universities, let alone bootcamps.

You can go your whole professional life without being exposed to all those concepts. The fact is that different areas have different basics.

(Also, there are tons of languages that don't touch on functional programming concept at all.)

> If you only know java are you even a real (professional) dev?

"Professional" means "paid to do it", so, yeah, there's plenty of professional Java developers.

Believe it or not, people have professional dev carriers knowing only gasp JavaScript.
And that's how you get desktop chat apps that needs 8 GB of ram and 50% of your cpu to stay idle.
That sort of argument is just silly. Do you have a job you get paid for, where the primary output expected from you is code? Congrats, you're a professional dev.
> If you only know java are you even a real (professional) dev?

Hum... Do you write programs in exchange for money?

I'm inclined to agree with you. A JVM-based developer with no idea of Scala or at least Kotlin raises questions. But in the last year I have worked with at least one smart guy/productive developer who is not into either. So YMMV I guess..
> You can't expect Devs to self-teach each other those concepts on the side, that (advanced, third-year) CS students struggle with hard.

You imply that Devs are lower on a hierarchy level than third-year CS students.

> You imply that Devs are lower on a hierarchy level than third-year CS students.

I think he implies that devs have less time to devote to new languages.

Sorry, I formulated this a bit unclear, advanced in the "advanced into their studies" sense. Not freshmen. (Thus, "advanced, third-year")

I don't think Devs are lower on some kind of "hierarchy level" than CS students. But they have less time. That is all. The article wants devs to learn completly new CS concepts without also saying that they need payed time to do so, as they otherwise have to learn in their free time for their job.

I think a key skill to evaluate is the "learning how to learn". Can a developer pick up a new language and are they flexible enough to get their head around a different concept. I agree that we need to support learning - knowledge can be acquired, but the willingness to go outside your comfort zone is something that is a bit more innate.
Any decent CS degree properly exposes students to functional, low-level programming and functional programming.

Even if they didn't, a strong programmer will pick up them up in an afternoon. Ditect memory manipulation is just not that hard.

Seems like generally good policy to give (paid) time to them if you expect them to learn something new.