443 karma · joined March 14, 2015
I've experienced this exactly. I have a philosophy degree. I floundered a bit career-wise post undergrad, self-studied for a practical entry vector into a programming job, and 8 years later have a super rewarding career as a software engineer. I felt my humanities undergrad, especially the critical thinking and writing skills I developed, have helped me advance much more quickly.
If I were to change anything, I would have liked to do a CS minor.
This is very, very far from my experience, having worked extensively with both of these particular examples.
At my current job I deep dive into a lot of years old, kinda sketchy Elixir code, and it's almost always less effort to learn/fix something than I've found in other languages, especially other dynamic languages. Except when macros are overused.
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.
That said, Canadian politics and crony capitalism are a grind sometimes, but looking over the fence it’s not totally obvious that other systems aren’t trading one set of intractable problems for another.
There are a number of powerful tools for BEAM runtime tracing. I prefer this one because the API is simple enough to commit to memory, and it protects against some common foot guns.
I actually prefer when the candidate has some sort of uncontrollable distraction that comes up during the interview. It provides a good opportunity to see how they handle the real world challenges of remote work. For anyone not sure how to handle this, interrupting with "excuse me, I'm going to mute for 20 seconds while garbage truck passes" is completely reasonable, even in a fairly formal situation.
If anyone is curios and wants to get a high level overview, this conference talk by Darin Wilson provides a helpful intro to the patterns Ecto uses that differ from other popular ORMs.
Secondly, since the Squamish Nation doesn't need to follow a bunch of the typical city rules, they can do away with things like required parking spaces, and build more pedestrian space between towers with smaller footprints, and be open that they don't expect people living here will own cars. If the project and neighbourhood are successful, it could prove to be a pretty interesting counter point to the broadly successful development policies of the city that seem at risk of keeping up with the densification of the region.
I could probably write a novel about the things I like about Elixir, but here's what I'd caution about for someone looking at adopting it over another alternative.
- Elixir is not statically typed and probably won't be. If static types are a tool you value, Elixir's success typing and runtime assertions might feel inadequate.
- Pattern matching requires discipline to not create heinous coupling. Pattern matching is wonderfully convenient for control flow and helps a ton with readability and avoiding deep nesting in complex situations. It's so convenient, though, that it invites reaching through abstractions into data structures in ways that make code brittle. The language doesn't really provide any guards against this, so it requires care and policing to keep things manageable.
- Because OTP is so powerful, it's tempting to avoid industry standard tooling and "just do it in Elixir." This is great for moving fast, but has the risk of pushing problems down to the line to the point that bigger system rework might be necessary. Background processing is a good example here. In Elixir/OTP it's easy to do everything in memory, but once you start needing failover guarantees, or need split out worker processes from a web server for independent resource utilization, you may end up getting rid of the initial implementation and doing the work to move over to a setup similar to what you might using for Ruby or Node anyway.
Learning to be productive in Elixir isn't really a huge investment, even for someone with a strict OO background. It's pretty light conceptually compared to other FP languages, can be written in an imperative-ish style if needed, and has clear, simple patterns for code organization. For every place you would consider mutating, you tend to find primitives that make working with immutable data structures quite convenient.
I've recently been working in Electron, and I find having app logic in both browser JS and Node to be more of a frustrating uncanny valley than a help. I suspect I'm in the minority on this one though, at least amount people with workaday skill set in client side JS.
JS is a notoriously quirky and inconsistent programming language. Clearly it's sufficiently usable for writing complex, powerful and reliable programs, but it's error-prone for non-experts and encourages programming patterns that make importing accidental complexity the norm.
For many programming situations it'd be easy to just pick a different language, but obviously thus isn't the case for writing browser-based programs.
The best possible scenario for me would somehow involve deprecation and removal of the nasty parts of JS, and a path towards a smaller, simpler, more consistent language. Right now it feels like the cost of backwards forever compatibility is paid every day, in every project, and it's completely wasteful, given that transpile and polyfill is widely considered best practice.
Whether this could the job of TC39 or some other institution could go either way for certain.
I agree, this is super important. My inclination whenever I did into a JS project has been to use lodash/underscore everywhere for everything, assuming that it is popular enough that someone will be able to maintain it without much headache, and I can actually get stuff done without breaking my brain over JavaScript's notorious quirks. I'm curious at what point this stops being a good practice. It certainly was 4 years ago.