543 karma · joined July 4, 2010
if x, do: y, else: z
Or, though it's not very idiomatic Elixir, this also works:
x && y || z
In fact, applying the idea of "no free lunch in search and optimization" (https://en.wikipedia.org/wiki/No_free_lunch_in_search_and_op...), you'd kind of expect this result: sometimes big steps good, sometimes big steps bad.
To be concrete about it, I recently ported a project from SwiftUI on iOS (an ecosystem I am very comfortable with) to an Android app written in Kotlin (an ecosystem I mostly dread). I don't find ChatGPT very helpful with my day-to-day Swift stuff, but it was incredibly helpful with the Android work, from language syntax to idioms to outright translation of code.
I can work with Swift and be productive with it, but at the same time, I feel like I still encounter new patterns, gotchas, property wrappers, language quirks, language changes, type-system oddities, etc, almost every day, and I have a hard time keeping track of it all.
I haven't been involved with actual GP research for a long time, but writing a Push interpreter and GP system remains one of my "Hello, World" projects when learning a new language.
I thought these were fascinating and very difficult to answer questions.
When I would tell people about the field and these questions 20 years ago, people thought the questions were laughable, and some thought I was a fringy werido. But now, it seems like the pendulum has swung completely to the opposite side: of course machines can think and be alive.
But for me, my position hasn't really changed: I still think these are fascinating and very difficult to answer questions, and the deep learning revolution of the past several years hasn't actually done much to answer them. What LLMs are doing right now is amazing - but hasn't really moved the needle on the deeper questions, and a lot of the people who think it has are Fooled by Non-Randomness (apologies to Taleb).
The programming profession has always demanded that developers operate at higher and higher levels of abstraction and produce more/bigger/faster. I expect LLMs to continue that trend - a tool to get more done at a bigger scale.
[1] https://blog.devgenius.io/origins-of-life-building-a-hypercy...
The most unwanted song, for example, features all the thing people dislike in music (according to their surveys): opera singers rapping about cowboys, bagpipes, uncomfortably slow tempos, and choirs of children singing ad jingles among other things.
Me: You are a chess grandmaster playing as black and your goal is to win in as few moves as possible. I will give you the move sequence, and you will return your next move. No explanation needed. '1. e4'
1... e5
Me: 1. e4 e5 2. Ngxd8+
2... Ke7
This is highly repeatable - I can make illegal non-sensical moves and not once does it tell me the move is illegal. It simply provides a (plausible looking?) continuation.
If you want to hire a developer to implement qsort or whatever, ChatGPT has them beat hands-down. If you want to build a product and solve business problems, there's way more involved.
In short, these solutions take JavaScript out of the mix entirely and basically let you deal with a single logical "app", rather than a separate frontend & backend.
[0] https://github.com/phoenixframework/phoenix_live_view [1] https://github.com/dbohdan/liveviews
Some other languages on the other hand, are far less common, but because they occupy a specific niche, might actually be more "in demand" (ie, less competition for an applicant, higher salary).
"string".do_stuff() - do_stuff() is a method on the "string" class, with all of the potential gotchas that might come with an OO implementation. Does the method mutate the internal state of the object? Does the particular class override the default implementation? Is it a monkey-patched implementation (the issue raised by this article)?
"string" |> do_stuff() - do_stuff() is a standalone pure function. The data is immutable and does exactly what it says.
some_array |> do_thing() |> do_another_thing() |> do_something_else()
Even though Elixir is functional and aggressively not object oriented, if you squint at this pattern you get the readability of an OO-style method chaining API.
But there are tons of other kinds of SWE jobs out there that aren't about squeezing another fraction of a percent of profit out of some process - positions with non-profits, development jobs in medical research of all kinds, or even early stage startups where you get to play a bigger role in the product development. You probably won't make FAANG money, but you can do just fine for yourself in a position where you feel like you're doing something more meaningful.
But the interesting thing about crypto is - in my opinion - not technical: it's social, and economical. Due to the decentralization, it changes the kinds of systems & solutions that are socially and economically viable. When I say "economical", I don't mean that the solutions are necessarily cheaper in the dollar sense, but in the sense that it changes which parties can participate in and profit from those systems. DeFi, for example, lets individuals participate in, and benefit from, transactions that used to only be provided by traditional banks.
So while there are many technical types that do see this side of crypto, there are many for whom their deeper technical understanding is a bit of a liability on the topic.