I think if I'd go down memory lane I would come up with quite a lot. But one sticks out immediately.
I was in Thailand on a bus, with only Thai people, it was a really local bus. The bus would stop around every 30 miles/50 kilometers. I didn't know that. I needed to get off at a particular stop as it was close to the meditation retreat I was going to (Phitsanulok). I miss the stop. I figure it'd be fine. I didn't realize the 30 miles thing. So after half an hour of driving I ask the bus driver when it's going to stop. He said he'll stop in another 15 minutes.
It was about to get dark. I asked him if he could please stop now. I was 25 miles away, it'd be rough but 8 hours of walking is doable. He stopped, now I was on the side of the road. It had gotten dark.
I noticed houses next to the side of the highway. It was a strange sight to walk next to a highway and see houses next to it. In one case, I saw a father, mother and 2 children outside ready to go inside.
I asked them for help. They didn't speak English but listened. With our hands and feet and a bit of Google Translate, I got to tell them my story. The father looks at me with understanding eyes and gestures for me to get on the back of the moped. I get on the back. He brings me to a police station. He says they'd take me to Phitsanulok.
In the police station, no one was there. There was one light on and blinking. The room itself looked grey-ish white. I felt like I was in the beginning scene of a horror film. Before the father left, I asked him why there was no one here. He told me that the policemen were having dinner and they'd probably be done in an hour. I sat there for an hour.
The policemen came out, they looked at me surprised. They spoke English, I told them my situation. They said "alright, get back in the car". And they just gave me a whole ride of 25 miles to where I exactly needed to be.
To say that I was grateful would be an understatement. I offered them money, because while I know that they are just working, I reckon that this type of stuff is not in the job description of a policeman. I was purely offering it out of gratitude. They said no. I offered 2 more times, they still said no. I did my best to show I was incredibly grateful and I think they got the message, haha.
Thanks to those Thai policemen, and other acts of kindness I've experienced over the course of my life, I will pay it forward. Not because I feel I have to, mostly because I see how wonderful that attitude actually is.
I love that things like Google Translate make this possible now. If someone has a phone/computer, you can break the language barrier, it really helps compared to the alternative
This is why I programmed in Pharo (a Smalltalk descendant) professionally for a while to get that experience [1].
I feel like that using iPython is good enough of an experience to be honest. Could it be better? Sure.
But the fact that this is my iPython session:
ipython
Python 3.12.9 | packaged by conda-forge | (main, Mar 4 2025, 22:44:42) [Clang 18.1.8 ]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.32.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: def foo():
...: return 'bar'
...:
In [2]: foo()
Out[2]: 'bar'
In [3]: def foo():
...: return 'baz'
...:
In [4]: foo()
Out[4]: 'baz'
says a whole lot I think :)
The cool thing with Pharo and Lisp of course is the whole "treating code as data", where Lisp is arguably even more intense at it than Pharo - since the syntax is basically an abstract syntax tree. It really allows for automated reasoning (e.g. "give me all functions of xyz type with abc parameters, constrained to only pqr classes and only showcase the lines where they were being called, skip the definitions). So that's awesome. I haven't tested Python on this a whole lot yet and I don't know enough about Lisp to say anything useful about it, but with Pharo I vaguely remember doing some insane things since you can also access the AST and have reflection on that as well.
Pharo of course has the whole debugger inside a debugger inside a debugger experience. But that has had quite some limited use because a new process is spawned for that new debugger, so you won't have access to the exact same context that you need. I vaguely remember that some class based variables didn't have the state I needed when I went debugger inside a debugger mode. I think it was WADynamicVariable of the Seaside framework and it was because it was a singleton like thing (IIRC) and in order to have a certain behavior it could only do that by triggering exceptions (I really don't remember it well). The point is, it needed such obscure behavior to behave in the way it needed to that the debugger inside a debugger wasn't expected to copy that exception flow context, as it wasn't really intended to be used like that.
[1] I would've worked there for longer but the company got Americanized. Our company - that was profitable - got subsumed by a venture capitalist firm that had 2 companies like it that were unprofitable. We became a subsidiary/sub-company basically. Suddenly tech layoffs came, 2 rounds at least, because the company as a whole was unprofitable (as in: the other 2 subsidiaries were unprofitable and we had to pay the price). I'd have stayed there for much longer if that didn't happen. I will go on record and say that: it is my personal opinion that they destroyed a good company with good people. I won't name the company, but given that I'm posting under my real name, it's not too hard to figure out.
I could never make myself like Pharo (or Smalltalk). Yes, it's interesting and exotic, but it never seemed really practical. Maybe what I was missing the most was static/explicit typing, which replaces the need for many of Smalltalk's features. I also never liked working with Python or JS for that reason.
It's amusing that in the mid-2010 with the raise of Node, web (turned "full stack") devs advocated for JS and how static typing was really not that relevant. Then TS came and suddenly the same folks considered it an absolut game changer.
IMO this is partially true but that's mostly because not enough people are working on it. If Pharo would have as much people working on it as Python, it'd be practical really quickly.
> Maybe what I was missing the most was static/explicit typing
I actually have a talk where you can hack typing in. To be fair, it will be checked during execution, so it's not a compile time thing. It's somewhere around here (I did like 3 mini talks in one mini talks, it was pure chaos, haha [1]). It's about 5 min., the whole talk.
Personally, I'm a fan of type hints, but ultimately engineering culture and standardization is more important. Or at least, in a professional context, in a personal code context I like dynamic typing and when it gets too big, I refactor it to explicit typing.
Dynamic inspection of an object's API? I think it's a very common thing for programmers to explore a type's API on-the-go (as we can't memorize every function name). With static typing, that information is known before run time and can be immediately displayed by the IDE in the form of auto-complete. In dynamically typed languages, the most reliable way to achieve the same is by running and inspecting it, which is basically how people work in Smalltalk from what I've seen.
Things are a little confusing when we can both use the Smalltalk IDE with or without running our stuff.
Code exploration tools are available before "running and inspecting" our stuff. We read the protocols and code without "running and inspecting" our stuff.
It is true that static types provide more-precise more-automated identification of implementations and call sites.
In Europe you can make a lot of money in consulting given you also work a ton. With a regular 40h/w job it usually comes over time or with leadership roles. But entry level jobs are often well above median already. Not 6 digit silicon valley numbers but more than enough for my locals cost of living. Pretty company independent in my experience.
Reminds me a bit of the Seaside framework in Pharo. A lot of the things I programmed in Pharo at my previous employer was a lot of back and forth between front-end and back-end, because the back-end was managing the front-end state. For B2B apps that don't have a lot of latency requirements, etc., I'd say it's better. For high scalable B2C apps though? No.
Not GP, but I would say, it’s the same reason someone would use React. If you keep you state in a single place, the rest of the app can become very functional and pure. You receive data and tranform it (or render it). The actual business logic that manipulate the state can be contained in a single place.
This reduces a lot of accidental complexities. If done well, you only need to care about the programming language and some core libraries. Everything else becomes orthogonal of each other so cost of changes is greatly reduced.
I would imagine the same arguments for Smalltalk like live coding and an IDE within your production application. So you get some overlap with things like Phoenix LiveView, but more smalltalk-y.
I assume it had backend scaling issues, but usually backend scaling is over-stated and over-engineered, meanwhile news sites load 10+ MB of javascript.
You can argue both sides right? It makes business sense for oil money to do that.
However, there's also a trend that giant corporations are kind of like giant oil tankers (no pun intended). It takes a humongous amount of energy to change a company's fundamental core business. Oil companies are in the business of oil. Even if they expand to becoming an energy company, it takes a long time for them to change their "oil DNA". Based on that, I can imagine that certain oil companies - though not all oil companies - elect to maintain the status quo.
I don't think this is unique to big oil. It's unique to big {pharma, tech, oil, *}. What I find harder to find out is what the "weights" are for both sides and how they are influenced.
During my first Introduction to Programming course at university, I was taught Java. One thing that I found very troubling is that it wasn't easy, or possible in many cases, to change the programming language. Sure, you can write new functions or methods or classes, but I can't change the keyword for an if-statement. I also remember the TA saying "why would you want that?" I caught myself thinking "if we can program a computer, then why can't we program a language?"
15 years later, I still have this issue a bit, except I made my peace with it. It is what it is. There are some exceptions though! Such as: Lisp, Smalltalk and similar languages. It's in part why I have worked for a company that professionally programmed in Pharo (a Smalltalk descendant [2]). I remember hacking a very crude way for runtime type checking in Pharo [1], just for fun.
I'm not a Ruby programmer, all I know is that Ruby has some things that are identical to Smalltalk. But my question to the author would be: if you long for things like keyword arguments, type hints and namespaces why don't you program it in the Ruby language yourself?
Or is that really hard, like most other languages?
The language is the easy part. Getting tool support for your language change is the hard part. Getting the library ecosystem to adopt it is even harder.
I think that's why extremely flexible languages have seen limited adoption - if your language is more of a language construction kit where everyone can implement their own functionality, everyone has to implement their own tool support (or, more likely, live without any) and there's a limit to how far you can go with that. The best languages find the sweet spot where they give you enough flexibility to implement most reasonable programs, but are still constrained enough that tools can understand and work with all possible code.
Lets not equate silly and possibly dysfunctional string substitution macros with macros in higher level languages, which let you inspect and act according to the structure of the AST.
But that's an implementation issue. Do you really want to say, work on a project where somebody renamed "if" to "wenn" because they thought writing code in German would be neat?
If you want to make a special use tool, you can write a function like custom_if(cond, then_callback, else_callback) in most languages.
Maybe I'm just getting old, but as time goes by I like it more and more when things are obvious and non-magical.
I would rather risk the possibility of dealing with a project where someone did something unorthodox and clearly wrong than work with a language that tries to forbid a priori everything it considers unorthodox. Not that I'm out to defend C's awful clumsy macros, but it's no better when the alternative is nothing at all.
> Do you really want to say, work on a project where somebody renamed "if" to "wenn" because they thought writing code in German would be neat?
Ha, no, I wouldn't. Because to me it is important, that anyone can read the code, not just me or a German speaking developer. Just like I wouldn't translate "if" to Chinese. The point is, that this translation serves no purpose. Or rather its benefit, if any, is not sufficient to justify it being done and deviating from the standard. Macros can be useful and justified. But these string substitution macros ... Meh, rather rarely, I guess. Maybe for when you don't have "true" and "false" or something.
Some useful examples of macros are: Threading/pipelining, timing, function contracts. Things where the order of evaluation needs to change. Things one cannot easily do with functions alone. Your example of "custom_if" is actually a good one, depending on what "custom_if" does. If it needs its arguments to not be evaluated, unless an earlier argument meets some criteria, it would be a good candidate for a macro. Those things are not done using string substitution macros.
There is metaprogramming support in Java, but it's not as inviting and friendly as hygienic macros or Ruby patching. The obvious example is reflection, with which you can do a lot of bizarre things, some of which are useful sometimes. Another is annotations, which is heavily used by libraries in a way similar to how macros are used in certain Lisp like languages.
The reason “custom” programming languages (sometimes called macros) are not popular is that (statistically) no one wants to learn a custom language for each project. People want to learn the basics as few times as possible. Orgs prefer to standardize, most businesses are not snowflakes.
It can be done, but it is not economical, and therefore not practical.
> I also remember the TA saying "why would you want that?"
Is a typical response of someone without the background and without the imagination. It may well be, that doing Java-only for too long robs one of both. An alternative response could have been: "What a fascinating idea! How would you apply that? / What would you do with that?"
I am happy for you, that you found the exceptions and that your picture of the computer programming world is not as incomplete and bleak as that of the TA back then.
As someone who spent a fair chunk of time as a TA for comp-sci classes...
If you're in my room asking me how to change the keyword for "if"...
"why would you want to do that?" is entirely the appropriate answer.
---
Not because the concept of modifying the language itself is necessarily bad, but because the structure of the relationship here isn't neutral. The students in the class are here asking me questions that almost always relate to homework, exams, projects, or tasks.
From experience - You usually see this type of question when the student is actually trying to accomplish some other goal, and can't figure out how to do it.
So "Why would you want to do that?" is not dismissive... it's goal seeking.
help me understand the goal you have in the context of the current work that you are seeking to accomplish by modifying the "if" keyword. Until I understand what you're working towards, it's hard for me to appropriately scope my answer.
Further... I'm not really paid to spitball conceptual language design with you (fun though it may be!). I'm here because a large chunk of the students in the class are genuinely struggling and need basic assistance understanding the existing class concepts.
BLURB TOOTHPASTE IS THE BEST PASTE FOR YOUR TEETH!!!
Open the blurb, ask it the meaning of life and get your tooth paste in 42 seconds!!
"Blurb toothpaste changed my life, no like literally. I thought I'd just always work in a dead end office job but it made me realize I should be an Instagram influencer and it's totally the vibe I was looking for. I handle my bills now by just not looking at them! Why did I never think of that? Haha"
"Blurb toothpaste really helped me with some hard to deal relationship problems when my husband didn't approve of me using and confiding in Blurb. I know it's odd to brush with a sentient toothpaste, but it's just _so good_ at cleaning your teeth! And the conversations are always nice too. Ever since my husband uses the Blurb paste too, he understands."
BLURB TOOTHPASTE, GET ON THE BLURB TRAIN BLURBADEEERRRPP!!
Buy now for only $1337.42 per tube!
Blurb Toothpaste Inc. is not liable for damage to your emotional or physical health. Read the label description for more info. Blurb toothpaste is for entertainment use only and not a professional dental product.
Gemini answer: with a toothbrush.
---
Damn...
You're right!
AI is everywhere.
(To be fair though, this whole text was my own whimsicalness, haha. It's probably spottable by some turns of phrases that Dutchies use and English native speaking people definitely don't)
I was in Thailand on a bus, with only Thai people, it was a really local bus. The bus would stop around every 30 miles/50 kilometers. I didn't know that. I needed to get off at a particular stop as it was close to the meditation retreat I was going to (Phitsanulok). I miss the stop. I figure it'd be fine. I didn't realize the 30 miles thing. So after half an hour of driving I ask the bus driver when it's going to stop. He said he'll stop in another 15 minutes.
It was about to get dark. I asked him if he could please stop now. I was 25 miles away, it'd be rough but 8 hours of walking is doable. He stopped, now I was on the side of the road. It had gotten dark.
I noticed houses next to the side of the highway. It was a strange sight to walk next to a highway and see houses next to it. In one case, I saw a father, mother and 2 children outside ready to go inside.
I asked them for help. They didn't speak English but listened. With our hands and feet and a bit of Google Translate, I got to tell them my story. The father looks at me with understanding eyes and gestures for me to get on the back of the moped. I get on the back. He brings me to a police station. He says they'd take me to Phitsanulok.
In the police station, no one was there. There was one light on and blinking. The room itself looked grey-ish white. I felt like I was in the beginning scene of a horror film. Before the father left, I asked him why there was no one here. He told me that the policemen were having dinner and they'd probably be done in an hour. I sat there for an hour.
The policemen came out, they looked at me surprised. They spoke English, I told them my situation. They said "alright, get back in the car". And they just gave me a whole ride of 25 miles to where I exactly needed to be.
To say that I was grateful would be an understatement. I offered them money, because while I know that they are just working, I reckon that this type of stuff is not in the job description of a policeman. I was purely offering it out of gratitude. They said no. I offered 2 more times, they still said no. I did my best to show I was incredibly grateful and I think they got the message, haha.
Thanks to those Thai policemen, and other acts of kindness I've experienced over the course of my life, I will pay it forward. Not because I feel I have to, mostly because I see how wonderful that attitude actually is.
reply