Monthly Archives: April 2015

Pillar based rendered class comments


Kasper Østerbye has just finished a proof-of-concept that renders Pillar
text inside a class comment pane.

Pharo beautiful explanation

And a narrative:

Pharo, the Immersive Programming Experience

Why do we choose to use Pharo? We feel that Pharo
provides the best way to combat complexity in
software development.

As long as the number of software developers paid to
make software smaller and throw away code is a lot
smaller than the number of developers paid to add
code, the software we deal with on a daily basis will continue
to grow.  This inevitably leads to an increase in the
complexity of the systems we build. This complexity is
problematic because decision making in difficult
situations is biased (1), using first fit heuristics instead
of best fit.

An interesting observation (2)  is that successful software
tends to have technical debt. If a software system is
successfull, the market pressure to deliver more and faster
than technically advisable is difficult to resist. When growing
very fast, it can make sense to make choices that enable
short-term growth that will need refactoring later. Additionally,
an architecture that is optimal for a small system is not
ideal for a large system and vice-versa.

So, what can we do? There are several interesting models dealing
with complex software systems. Let’s check a few of them, and
see what Pharo has to offer there.

The Cynefin framework (3) categorizes the problem space into
5 domains:
– Obvious, where the relationship between cause and effect is obvious
to all;
– Complicated, where the relationship between cause and effect requires
analysis and/or the application of expert knowledge;
– Complex, where the relationship between cause and effect can only be
perceived in retrospect;
– Chaotic, where there is no relationship between cause and effect
– Disorder, where the type of causality is unknown.
Each domain needs a different approach. In the complex domain
the approach is Probe, Sense, Response, or run multiple safe-to-fail
experiments simultaneously and see how the system responds.

Pharo is well-suited to doing experiments and prototyping.

It offers fast feedback with instantaneous compilation of the
currently edited method, optionally running an autotest on the
changed code.

The system contains all the source code of all the tools, and they are
designed to be quickly customizable by the individual developer.
A stated goal is to be able to build a custom tool in 10 minutes.

Pharo immerses you in a sea of objects and provides you with
lots of different ways of looking at them.
The late binding allows manipulating these objects at runtime,
even modifying the runtime stack.

Real Options (4) provides a decision model based on
– Options have Value
– Options Expire
– Never commit early unless you know why

Pharo embraces this model. Code is compiled as late as
possible, in the running system. This makes it possible to
use information available only then to customize behaviour

Behaviour is triggered only by message passing, and the
receiving object decides what to do with a message.
Sending an object a message it does not understands
is caught at runtime and can be dealt with in several ways.
It makes it easy to create proxies and can be used to
learn objects new behaviour.

Debugger-Driven-Design is an approach unique to smalltalk systems.
It makes it possible to design the way objects communicate while
implementing it. It supports a superior way of doing
test driven development.

Small is Beautiful (5) is something that is very much applicable
to software. Software systems suffer from diseconomies of scale.

Pharo uses a very simple and orthogonal language, using a
very small set of constructs.

But this very small set of constructs contains all the needed
features for building highly complex, understandable and reusable
software architectures.

This reduces the cost of building
custom tools and makes it possible to cost-effectively  provide
such an advanced environment. The systematic refactoring
applied over many years pays off in a very “dense” library
that makes it possible to solve problems writing a very low
number of lines of code.

The state of the art in mainstream software development
to battle complexity is reuse at the application level, building
systems out of large-grained components (database, web server).

Pharo supports reuse at a much lower granularity.
It has lots of small domain specific languages to deal
with specific problems. Because smalltalk has so little
syntax and supports fluent interfaces, these languages
support describing problems and their solutions in a
language near to that of the domain expert.

All software development environments support
programming yourself into a corner. Making  decisions
that turn out to be bad is inevitable when building
complex systems. Being able to program yourself out
of that corner again makes it possible to approach
a problem without fear.

Pharo offers easy meta programming and a code
rewriting engine to help undoing bad design decisions
and and cleaning up large amounts of code in a controlled

The choices made by the Pharo project put it on the
left hand side on the value chain map (6). suitable for
innovation, focusing on effectiveness instead of

Pharo is an open source project, supported by the
Pharo Consortium. It is both a research vehicle and a
platform for commercial software. We use continuous
integration to make sure that the innovations from
research don’t destabilize commercial developments.
Next week we hope to release Pharo 4, and in a few
months the much faster new “Spur” vm with support
for 64 bits.

This was an introduction presentation for the Devnology
workshop of April 1. 2015. Devnology is a Dutch
group of people interested in improving software
development, organizing a monthly meetup.

(1) Gary Klein (1999) Sources of Power: How People Make Decisions.

(2) @meekrosoft, Mike Long (Long Life Software), 2013,
Cleaning Code – Tools and Techniques for legacy restoration projects

(3) Dave Snowden

(4) Chris Matts and Olav Maassen, Committment, the Book.
Expands on the ideas articulated by Kent Beck in
“Extreme Programming Explained, Embrace Change”

(5) E.F. Schumacher, (1973) Small is beautiful: A Study of Economics
As if People Mattered.

(6) Simon Wardley,

Preparing the release…

15315 Inspecting Slots raises an error
15308 Bugfix and test for BooleanSlot

15306 EyeInspectorTest pollutes world with left open windows

15282 Cannot run the image with the new bytecode set.
15287 RBNamespaceTest>>#testModelImplementorsSenders
15278 Filtering on a Dynamic Group throws a DNU

15295 TickDialogWindow open invokes not existing method


15280 issue grabber should use new tracker app

15234 monticello is not showing right status when working with branches

15275 Small cleanup in Slot examples

15269 a simple BooleanSlot example

15234 monticello is not showing right status when working with branches

15268 Categorise some uncategorized methods in Slot examples

15261 Generator: Move example from comment to method

15266 browser version in nautilus without a method selected throws a DNU
15253 URL to book in Tutorial is wrong

14974 failing test testScrollToLargeX

15241 Nautilus does not display catalogDescrption help text for many packages when moused over/clicked

– 15219 #testClassDescriptionRespectsPolymorphismWithTraitDescription fails due to GT Extension
– 15137 Remove Morphic Halos for Bricks
– 15201 Darktheme default cursor color is black. Unreadable.
– 15226 spotter: preview for items without a preview only shows “Loading…”
– 14541 Editing the default inspector window size
– 15214 Playground does not have window menu
Playground does not have window menu
– 14569 GTInspector should do live updates of objects and their slots
(inspect ‘World activeHand’ and move mouse for a quick demo)

13201 Hard to start a tutorial in Pharo

15240 Stuck SHTextStyler semaphores

15238 Add an assertion to check if a collection has same elements as another collection
15232 ByteString and WideString dont agree on isAsciiString

14319 Ctrl + shift + F in the text pane does not work on mac (but on windows)
15233 Inspecting objects yields MessageNotUnderstood: MorphTreeColumnButton>>isDefault error

15234 monticello is not showing right status when working with branches
14344 Delay refactoring (part 3) – changeout mutex scheduling for semaphore scheduling

15180 Update Pharo Help topic about spotlight shortcut

13761 Fraction floating pointer cannot be debugged

15215 Prevent the World locking due to multiple modal dialogs open

13017 Class renaming does not update textual class definition

15156 remove AST Interpreter

15210 load new configuration of Athens 3.1
15221 PropertySlot: Tests for removing PropertySlots

15215 Prevent the World locking due to multiple modal dialogs open

15222 Integrate GTools

15190 Nautilus incorrectly flags Error classes as “missing class comments”

14924 Failing tests: testClassDescriptionRespectsPolymorphismWithTraitDescription

15189 “Extended search” vs. “Code search”

12569 TextModel should not move scroll when accepting text

15141 More Cleanup after case 14353 Delay refactoring (part 2)

15207 Undo compiler change from case 15196

15206 PostScript was not executed for issue 15182?

15203 Failing test: PackageTreeNautilusTest>>#testFullBrowseOnClass

14470 ReleaseTes>>#testObsoleteClasses failiing due to AnObsoleteClassForObsoleteTest
15192 revert 14890

15151 TextInputFieldModel creation is slow

15196 Simple before and after links with minimal disturbance

15086 Ctrl + Arrow Behaviour

15145 Spec TabManager selectedTab returns nil after first opening

15182 add basic inspector option

15195 test for redefined Slots on class side

15188 Color ariphmetical operations are broken
15187 Endless loop on catching ZeroDivide for floats

13523 MNU protocolsFor: when show hierachy, show groups, click on a class

15186 revert 15171
15097 Monticello repository UI not bolding unloaded packages after Lazy MCVersionInfo integrated

15179 Be able to browse dependent projects with Versionner
14890 Browsing a different class should select by default the previously browsed method

15171 MNU: receiver of “getClass” is nil

15168 add DelayNullScheduler
13295 Integrate Versionner 2.8
15167 Fix: Class level should know about visible slots, layout knows all

15166 More tests for Slots

15172 Add String>>#allRangesOfSubstring:

15175 Add FindReplaceService>>#findNextSubstring:inTextMorph:

15165 Number>>#percent shouldnt force to Float

15169 add some GT views to ReflectiveMethod

15115 Spotter should appear in the World menu

15163 #instVarNamed: mixed up
15160 Move all deprecated Methods in Spec to Deprecated40 package

12991 navigation enhancement Path>>parentUpTo: aParentDirName

15110 Cleanup after case 14353 Delay refactoring (part 2)


13333 MCWorkingCopyBrowser>>addSlice references ScriptLoader

15158 Move deprecated Methods to Deprecated40 package

15083 We should have senders/implementors in the code menu

15124 Move String>>#lastIndexOfPKSignature: to Compression

15147 change class comment template

14885 Cant change name of a Spec tab after it has been opened
15126 NBExternalEnumeration needs to respect slots

14873 Morph>>#boundingBoxOfSubmorphs is sometimes too large

14383 VersionnerProjectBrowser>>example does not work

15133 #downloadSources references PharoV30.sources
15139 Update Zn+Zdc March 2015

15122 resuming Delay failing under certain condition
15128 Class comment and #open on TxWorkspace

14834 I cant add classVariable to context

15064 DynamicSpecExample should use #label: instead of deprecated #text:

15125 PharoCommonTools>>#cleanUp changes collection while iterating

15045 GTPharo4Extensions should be merged into GT-SpotterExtensions-Core
15057 Split command line support and command line handling support

15120 PropertySlot: test for installing two proportySlots. Make sure the share the same baseSlot
14829 Spec MenuModel submenu not working

14972 SpecWindow: AboutText always shows WindowModels class comment

6488 DropListModel>>whenSelectionChanged:

15067 TestReviver open does not work in Pharo4.0 Latest update: #40535

UDP client for Syslog

I just released an UDP client for the Syslog network protocol (RFC5424). The product is available on SmalltalkHub.
Best regards
Olivier 😉

Girlish pinkish Pharo … the 1st of April :)

today well today the GTSpotter announced a modern design for GTSpotter. And it feels pink 🙂

Screen Shot 2015-04-01 at 22.41.17

Here is their announce.

We would like to present a brand new Spotter design! It follows all modern UI techniques as flat and material design. Feel the future coming! Update Spotter to the latest version:
{       { ‘ConfigurationOfRubric’. ‘AlainPlantec’. ‘Rubric’ }.
        { ‘ConfigurationOfGlamourCore’. ‘Moose’. ‘Glamour’ }.
        { ‘ConfigurationOfGTInspectorCore’. ‘Moose’. ‘GToolkit’ }.
        { ‘ConfigurationOfGTPlaygroundCore’. ‘Moose’. ‘GToolkit’ }.
        { ‘ConfigurationOfGTSpotter‘. ‘Moose’. ‘GToolkit’ }.
{ ‘ConfigurationOfGToolkitCore’. ‘Moose’. ‘GToolkit’ }.
} do: [ :spec |
        Gofer new
                smalltalkhubUser: spec second project: spec third;
                package: spec first;
                load ].
ConfigurationOfGToolkitCore loadDevelopment.
KMRepository reset.
Best wishes,
GT Team


Last week I made a super small project to consolidate all projects published in all metarepos.
Is very simple, in the style of smalltalkhub repository list, but it shows all projects with the info their owners provided.
Yes, it could be a lot better, but we do not want to lose much time with this because not far in the future (but not right now) we will put online a much better service 🙂
You can see the catalog here:
and a JSON variant here:

New release of DrGeo

Dr. Geo 15.04 released today, based on Pharo 3.
It has been a long road to reach part of the Dr. Geo vision: from basic usage of interactive geometry to an empowered user with programming capabilities it was a long way. Only with Pharo, this vision became incredibly vivid with results beyond my initial expectations: not only Dr.Geo user can write script in a *comfortable environment*, more she can also study its code, and even modify it while DrGeo is in activity!