[HN Gopher] Elixir at Ramp ___________________________________________________________________ Elixir at Ramp Author : judicious Score : 114 points Date : 2023-11-24 15:20 UTC (7 hours ago) (HTM) web link (engineering.ramp.com) (TXT) w3m dump (engineering.ramp.com) | sb8244 wrote: | This is from 2021. I'd be curious if Elixir is still in use, or | has expanded at all. | | Side note: Pablo's blog posts are always quite good. | thibaut_barrere wrote: | I also wondered about this but could not find anything | definitive on that. | | They seem to be a bit "stealth" about the technologies in use | at least based on reading their job offers: | | https://jobs.ashbyhq.com/ramp/6a5108f4-8605-4a67-9446-ea05f1... | | > Proficiency in Python, Go, or Java | paulbgd wrote: | I'm not sure why, but the internship role seems to be the | only one listed that has an accurate list of our tech: https: | //jobs.ashbyhq.com/ramp/29663a4b-c457-4a38-bbdf-069f18... | | The article goes into a little more detail too, we haven't | significantly changed anything in the last 2 years. | judicious wrote: | Yeah, I'm definitely curious too. From what I know Ramp is | primarily a Python shop on the backend. | | I just love to see functional programming being used in | industry and seeing the thought process behind it. | | Also, I agree. I'm a big fan of Pablo's posts. | paulbgd wrote: | Yep it's still being used as our card authorizer service! The | features have expanded, although the primary backend monolith | is still in python. | judicious wrote: | Do you foresee a larger scale migration to Elixir in the | future? | | Or would you say that Elixir lends itself to some services | and Python others? | jstummbillig wrote: | And if so: Why is that? Sometimes I read a glowing review | and wonder "Why not Elixir everything?" What's the catch? | srpablo wrote: | Author here; I have a lot of other posts in my personal | blog about this, but: the current trends in VC-backed | tech companies are about minimizing risk and following | fashion, rather than any technical merit or | experimentation. Said another way: if an Elixir company | dies, it's "damn, shouldn't have picked Elixir!" If a | Python company dies, it's "startups are hard," with no | investigation behind what Python cost you. | | I go into it a bit here | https://morepablo.com/2023/05/where-have-all-the-hackers- | gon... and here https://morepablo.com/2023/06/creatives- | industries.html | | Elixir has real technical downsides too, but honestly | they never come up when someone advocates against it. And | this is fine, building companies and engineering culture | is a social game at the end of the day. | codesnik wrote: | offtopic, but are your "remote" positions available for | developers outside of US? | srpablo wrote: | Thanks for the kind words! Another comment mentions it, but | last I checked Elixir is still powering the Authorization | service. | | You might be interested in a "making of" post I wrote on my | personal blog, going into the intentions and crafting of this | https://morepablo.com/2023/03/technical-storytelling-making-... | judicious wrote: | I loved reading the "making of" post. I'm very interested in | getting into technical writing and your post, really helped | me understand your thought process behind "Elixir at Ramp". | colesantiago wrote: | (2021) | | Unfortunately Brex doesn't use Elixir anymore | | https://medium.com/brexeng/building-backend-services-with-ko... | judicious wrote: | Kotlin, definitely an interesting choice for backend | development. But I love to see idiosyncratic language choices | being made. | vvpan wrote: | Doordash uses Kotlin for backend as well. I suppose they want | FE/BE to be in the same language. And when your main product | is a native app Kotlin starts to make sense. | ceras wrote: | Neither the iOS app nor the web app use Kotlin at DoorDash. | Kotlin was picked for other reasons (consistency with the | Android app wasn't mentioned): | https://doordash.engineering/2021/05/04/migrating-from- | pytho... | brink wrote: | Having spent considerable time in both Java and Elixir, I | would also choose Kotlin (or Java) over Elixir as a backend | language. | | I worked in Elixir for over a year, and frankly was quite | disappointed with it. Elixir has a lot of good ideas, but | falls short in some crucial points in execution. Relying on | shapes instead of types to identify results / objects, weird | syntax choices (You use both <%= %> and {} to interpolate in | phoenix templates, depending on where you are), no ability to | write custom guards, a lot of language concept overlap - for | example behaviors / protocols should be one implementation | instead of two separate ideas.. Elixir is an okay language, | but I think it's just a fad, not good enough to have staying | power. I think a better language written on the BEAM will | come along and be the language that Elixir should have been. | Just my personal opinion. | vvpan wrote: | This one is quiet actively developed but it seems like by | only one person https://gleam.run | benzible wrote: | Types are coming... | | * https://news.ycombinator.com/item?id=36311875 | | * https://news.ycombinator.com/item?id=35766126 | | Re: "You use both <%= %> and {} to interpolate in phoenix | templates, depending on where you are" - no need for EEx | anymore for web development, just use HEEx, which has | standardized on {}. You can use HEEx for LiveViews and | "DeadViews" (server-side rendered Phoenix) | tessierashpool wrote: | I remember when Jose Valim first came up with it. I thought | it might just be a fad, or a toy language to test out some | ideas. | | that was in 2012. | davidw wrote: | > custom guards | | I don't recall 100%, but I think this is a BEAM feature | that exists because they don't want to run arbitrary code | as part of guards that could have side effects, delays and | so on. I don't remember the specifics. | bostonvaulter2 wrote: | Since Elixir 1.6 it is possible to create custom guards | with `defguard`: | https://hexdocs.pm/elixir/Kernel.html#defguard/1 | elbasti wrote: | It's true that you can create custom guards, but they are | still _very_ limited, and they can only be made of a | small list of allowed expressions [0]. | | [0]: https://hexdocs.pm/elixir/1.6.6/guards.html#list-of- | allowed-... | PhoenixReborn wrote: | It's likely that they just chose Kotlin as "better Java" - | many companies do this and I can understand why. | benzible wrote: | "Moving to Kotlin first" is a long way from "doesn't use | anymore". I suspect that they're still running a lot of Elixir | code in production. This was the case more than a year after | this announcement, per a conversation with one of their | engineers. | Dowwie wrote: | Ramp and Divvy (Bill), both in the expense management space, | chose Elixir for a portion of their payment systems. | sesm wrote: | When I worked with Erlang outside of Ericsson, I've heard the | following from our tech lead: OTP built-in distributed process | and failover mechanisms assume much lower latencies than usually | exist between datacenter VMs and the underlying protocols consume | a lot of bandwidth. I didn't dig deep enough to verify this, but | I can confirm that typical Ericsson hardware is several boards | connected with high bandwidth 'backplane' and OTP failover was | designed for this environment. VMs communicating through LAN is a | different environment, and VMs living in different data centers | are very far from this. I wonder if anyone else tried using OTP | outside of Ericsson and what is their experience. | throwawaymaths wrote: | You should probably reach for something like ra for anything | but trivial stuff. If latency is not a concern, global module | is probably fine but double check the quorum membership. | rhodin wrote: | ra for those interested: https://github.com/rabbitmq/ra ("A | Raft implementation for Erlang and Elixir that strives to be | efficient and make it easier to use multiple Raft clusters in | a single system.") Used by RabbitMQ for quorum queues + | Khepri (the new metadata store) | toast0 wrote: | Welp, my browser ate my longer response. But in short, when I | was at WhatsApp, dist worked fine over WANs, I think the WA | contributed pg addresses the issues we saw with pg2. It was | obviously not ideal, or normal, but sometimes our WAN | connections would get bandwidth limited due to congestion or | other issues, and things would generally keep going without | unexpected problems: replication got behind when the change | stream was more than available bandwidth and there's no | separation of dist traffic, so if replication has minutes or | hours of delay, so does any other traffic in that direction, so | interactive traffic will timeout, net_adm ping will take | minutes or hours, etc. I guess technically the connection ticks | must not quite suffer the same queuing, because the connections | would not be severed by tick timeouts. | | The other issue related to WAN that we'd see is when you start | a mnesia node, it loads all of the tables from peers if peers | have copies of the tables, but out of the box it doesn't have a | concept of LAN vs WAN peers, so it may load your half a | terrabyte or whatever worth of data from WAN instead of LAN. | Loading all that data from LAN might be undesirable too, but | that's another story; you could probably maybe come up with a | way to store and later replicate changelogs for offline mnesia | peers, but that doesn't come out of the box, and WA didn't | build it either. | | The community at large often reported maximum dist cluster | sizes that were way less than what we ran in production, and | comments about WAN distribution that didn't match our | experience either. _shrug_ It does help to have a very solid | private network between nodes though. Dist in general, but | mnesia specifically, don 't like for nodes to disappear. pg2 | has some quirks too, but pg resolves them, afaik, as I | mentioned earlier. Some of pg2's issues were rooted in global | locks, you've got to be careful about those if node lists are | rapidly changing and there's contention on the locks. | hosh wrote: | Dist Erlang worked fine in today's environments for the | application we were working on -- nothing like real time audio. | (Although people are using Elixir for real-time audio and video | processing and muxing). | | I saw an example of something OTP is also good at -- | coordination across _unreliable_ nodes and networks. IoT is | obvious ... but so are mobile point-of-sale and payment systems | on food trucks. | keep_reading wrote: | They epmd protocol is designed to be replaceable and that's | what Partisan is for | | https://partisan.dev/ | freedomben wrote: | > _My hot take about most dynamic languages is that they are a | poor fit for startups who have intentions of being long-term | businesses: you 've created an environment that's optimized for | your founding engineers to build something quickly in the first 7 | months, but the price is a set of recurring obstacles which your | engineers will pay down over the next 7 years._ | | I've been saying this for years, so it feels really good to the | confirmation bias to see it said by someone else! | | Though, the language and frameworks definitely matter, but you | can easily write short-term-over-long-term code in any | language/framework. Founding engineers tend to be the worst as | well, because they love and sometimes only ever experienced | greenfield development, and they are trying to move _fast_. That | 's not a bad thing as without that the startup may die on the | vine, but it is something that I wish more founding engineers | would be cognisant of, because little things (json schemas, and | unit/integration tests for example!) can make a big difference. | | Elixir (and Phoenix) really do get the best of both worlds. It's | highly productive like Rails, but the built-in way of doing | things will give you validations on your data in and there are | plenty of tools like Ecto schemas that can be used anywhere and | everywhere the data matters. Tests are also first-class citizens | and have to be actively ignored to avoid them. | | The one area where IMHO the jury is still out is LiveView. It | takes a lot of battle-hardened approaches of React, and my | initial feelings on it are very good. However I've not yet had a | natural organization structure emerge with it, so I'm not sure | how maintainable it will be in the future for people that didn't | write it. Anybody have experience with that? | imachine1980_ wrote: | does elixir have type checking like typescript does ?( you can | add types ?) | hmmokidk wrote: | The hottest news in the Elixir community is that it is | currently experimenting with set theoretic type / gradual | typing. Some french PHD is working on it. | | It is past the RND phase and in development at the moment. | | It is highly experimental and not guaranteed to ship with the | next version of Elixir. Right now the idea is to see if it | offers any value in the first place. There are a lot of | statements about what types offer. What the Elixir team wants | to do is actually experiment to see if there's a benefit. | Which is a really neat thing for a lang to do...to actually | experiment like that is incredible. | | As for right now, in a sense yes. It has this thing called | Dialyzer - https://www.erlang.org/doc/apps/dialyzer/dialyzer_ | chapter.ht... which is a static analysis tool. This offers | some non runtime type guarantees. But it is still a | dynamically typed language. And the community is split on it | IME. The errors are cryptic and there are some other issues. | There's also Norm. | | There are some things you can do to guarantee types during | runtime, like match a function to a type. So when called with | a string the implementation is different than with a boolean. | So there are some run time type guarantees. | | example of matching (return a diff string if bool or if nil): | | def do_thing(n) when is_bool(n): "some boolean" | | def do_thing(n) when is_nil(n): "nil" | | There's also the concept of a struct which is like a typed | object / map / key value pair thing. | hmmokidk wrote: | I feel the same way about OO tbh. When everything is just | functions + data types it's all much more easy to reason about | and maintain. | | I have no clue have LV scales. But I have yet to see a React | application that doesn't drive me crazy with the amount of | indirection and complexity! | judicious wrote: | Totally agree, when is everything is functions and data, it | makes life a lot easier. I especially find it useful when | refactoring code while trying to keep an existing function | signature. | pphysch wrote: | >> _My hot take about most dynamic languages is that they are a | poor fit for startups who have intentions of being long-term | businesses_ | | If you know _exactly_ what you are building, down to the | datatypes, sure, use static typing. But 99% of startups aren 't | like that. Business development is a highly dynamic process. | | Once you hit $1M revenue, rewrite it in Rust or whatever. | judicious wrote: | This is unironically my plan/playbook with ideas I have for | startups. Start with Python, node, or whatever. Then go to | Rust once product-market fit has been established. | | Rust really hits that sweet spot with memory-management, | programming paradigm flexibility, and speed. It's precisely | great for what I need because it's essentially an ML with | good imperative constructs. | elbasti wrote: | > The one area where IMHO the jury is still out is LiveView. | | Agree 100%. Unfortunately LiveView is quickly becoming _the_ | way of doing things, which I think is ill-advised. It makes the | language larger, and is still too much in flux (it 's not even | v1 yet). | | LiveView is great, but it's not perfect and has real drawbacks. | hellozomo wrote: | As a user, Ramp's web interface is absolute trash. I've submitted | reimbursement requests only to get an error message and then have | them go through later, creating duplicates. | | CC transactions queue up, requiring a response and there's no way | to go through them efficiently. The UI pops up a weird modal and | is horrible to use. | | It feels like a legacy enterprise application and it's basically | a new product. I wish my company didn't use it. ___________________________________________________________________ (page generated 2023-11-24 23:00 UTC)