I've been using Pharo professionally for about 1.5 months now, and I'm beginning to getting the hang of the language, and the culture surrounding it.<p>I'll share a couple of thoughts.<p>__General Development/Hacking__<p>0. From Pharo 9 and onwards, it runs smooth on an M1 Mac.<p>1. If you're interested in developing in Pharo professionally, we're hiring [1]!<p>1b. Other ways to learn about Pharo is to come to Smalltalk/Pharo conferences. I've been to the Pharo Days in Lille recently and I've learned a lot in those 3 days! Other than the Pharo Days there is ESUG.<p>1c. Check out the Discord channel. People have been really helpful [0].<p>2. A big part of the documentation can be found inside the image. For example, press SHIFT + enter and type "tutorial" or "exercise" and a few will come up. Moreover, when you click on any class, there's a "class comment" tab. Some class comments actually have comments and they're written out in a quite understandable fashion when they do.<p>3. You can make the following clicks and they do something different:<p>- Click: shows a context menu to showcase a particular window / tool<p>- Right click: shows "World Contents", aka objects about your GUI (I haven't used this one yet)<p>- Shift + Option + click: this shows a "halo" around a GUI<p>- Shift + Control + Click: the coolest meta click there is, it shows all objects that are directly related to the pixel you clicked on. If you clicked on a table cell item in a GUI window, you can figure it out via this click. I've used this trick to figure out where to go in order to alter my IDE to my own taste.<p>4. Pharo is one of the few languages I know where you can create like a game or application for which it's possible to immediately see the source code and interact with it. The use-case this allows for is highly hackable open-source applications. For example, here's a game that allows you to design chips [2]. It's easy to see how you could alter levels yourself quite easily, just start editing the code! IMO, that's next level open-source.<p>5. If you want to, it's relatively easy-ish to inspect the AST and see how it's mapped to the VM. Be careful of setting breakpoints here, you'll crash your image :P<p>6. A Smalltalker told me that Pharo's VM enforces everything to be an object but <i>technically</i> not everything is an object, as far as VM implementation goes. If you're not hacking on the VM, then you can assume everything is an object.<p>7. Overwriting the #doesNotUnderstand: message can lead to all kinds of fun! I wrote my custom If/Elif/Else DSL. Smalltalkers will hate me but I found it awesome because it showcases how one could hack a DSL quickly. You can see about it here [3]. Here's some example code:<p>```
If _: (someCondition) _: [ "code" ]
Elif _: (anotherCondition) _: [ "more code" ]
Else _: [ "final code" ]
```<p>As you can see, I've hacked the _: to be a separator of some sorts, but what it actually is, is an argument of a message. You can do all kinds of fun stuff with this. See [8].<p>8. When you overwrite #doesNotUnderstand then you can inspect the message and its arguments. So whether you send Object1 a:arg1 veryImportant:arg2 message:arg3, then you can inspect those arguments. In the case above, this means you can also inspect _:arg1 _:arg2 or _:arg1 _:arg2 _:arg3 ... _;argN. In other words, you can deal with variable arguments and it doesn't matter what they're called. Because of this, it's easy to create a simple DSL, if you need another separator, then simply add one. You have a lot of characters at your disposal that are quite unique [4]. I figured that out by using by using point (2) and just looking around in the environment.<p>__Web Development__<p>9. Seaside is capable of live and dynamic updating. MOOCs won't tell you this because it requires using Seaside quite differently. In short, the pattern that I see used at my work is by having server-side rendered HTML that has designated blocks as callbacks. So when you send your server-side rendered HTML, those callback blocks will transform itself into a jQuery GET/POST request. Pharo writes the jQuery for you. We also use React, but I haven't gotten around to it how it's used, I'm fairly sure we don't use anything like Redux.<p>10. In terms of testing, it's relatively easy to write tests. As with Go, it's all included and you're ready to test! Also note: if you want to use Selenium tests, you can use Parasol [5], it's quite easy to use.<p>11. The following concepts are not explained well, so I'll do it: Seaside heavily uses what we'd call middleware in NodeJS (filters in Seaside). In NodeJS/Express we also have a request object that exists during the lifetime of a request. In Seaside this is called a dynamic variable (WADynamicVariable is the class).<p>__Stuff I wrote out in the open__<p>12. I've been working on refactoring i18n in Seaside [6]. I currently find the approach Pharo uses the nicest approach, which is something along the lines of:<p>'You have some string that needs translation in your web app' SeasideTranslated<p>When you want to export a catalog file of all the strings you want to translate, then you send exportCatalog new exportCatalog and it will look through the whole image and find every tagged string and export it into a catalog (.pot) file that you can edit with POEdit (a free Mac app [7]).<p>13. I wrote a simple animation that shows the definition of sin and cos [8]. Most of the code is shown in that video, IMO it gives a good enough sense how to use it.<p>__Bottom Line Thoughts__<p>14. I think Pharo is a production-ready language for SaaS apps where you can easily scale by adding instances. I am not sure if it'd be production-ready for consumer facing web apps with many concurrent users.<p>15. It's an amazing language to create desktop applications for.<p>16. The debugger capabilities are awesome and there's active research on it. Time travel debugging is currently in its PoC phase (source: Pharo Days).<p>17. It's also a good language for live music making (source: Pharo Days where someone demo-ed some live coded acid music).<p>[0] <a href="https://discord.gg/QewZMZa" rel="nofollow">https://discord.gg/QewZMZa</a><p>[1] We're hiring developers able to work in Europe and based in a European time zone. The way we use Pharo is IMO the real deal, it goes far beyond what any MOOC can teach you.<p><a href="https://yesplan.be/en/vacancy/full-stack-software-engineer" rel="nofollow">https://yesplan.be/en/vacancy/full-stack-software-engineer</a><p>[2] <a href="https://github.com/pavel-krivanek/PharoChipDesigner" rel="nofollow">https://github.com/pavel-krivanek/PharoChipDesigner</a><p>[3] <a href="https://www.youtube.com/watch?v=BUEnRrUZ-Ug" rel="nofollow">https://www.youtube.com/watch?v=BUEnRrUZ-Ug</a><p>[4] ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzªµºÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ<p>[5] <a href="https://github.com/SeasideSt/Parasol" rel="nofollow">https://github.com/SeasideSt/Parasol</a><p>[6] <a href="https://github.com/SeasideSt/Seaside/tree/gettext-fix" rel="nofollow">https://github.com/SeasideSt/Seaside/tree/gettext-fix</a><p>[7] <a href="https://poedit.net/features" rel="nofollow">https://poedit.net/features</a><p>[8] <a href="https://drive.google.com/file/d/1Z3UwTAj4A2CRo_TXk6JNG-mN9yMamYMj/view" rel="nofollow">https://drive.google.com/file/d/1Z3UwTAj4A2CRo_TXk6JNG-mN9yM...</a>