Archives mensuelles : février 2009

Pourquoi une SARL pour le wecena ?

Une personne qui découvre le wecena et m’envoie le mail suivant :

Je trouve votre projet et votre actions extrêmement intéressantes… Mais, il y a un mais. Le choix d’un statut capitalistique pour ce projet à forte tendance « utilité sociale » me semble brouiller un peu les choses… …et c’est cela qui me retient pour le moment de m’engager à vos côtés. On pourra en discuter, un jour, peut-être ? J’en profite pour vous préciser que je n’ai pas d’opposition de principe au statut de SARL en soi… mais qu’en allant prendre les renseignements sur qui pilotait ce projet, je m’attendais plutôt à voir soit une association, soit au minimum un statut de l’économie sociale (une SCOP, par exemple). D’où ma surprise. Et deuxième précision : le point positif c’est la transparence dont vous faites preuve à ce sujet, qui m’eincite à vous contacter ;)

Alors, pourquoi une SARL pour le wecena ? Je vais essayer de donner mes raisons mais cela peut mériter de continuer la discussion via les commentaires de cet article.

A l’origine, une initiative individuelle (et non collective).

Le wecena est un projet personnel de création : c’est une idée que j’ai eu grâce à mes discussions et mes échanges avec certains et que je ne peux réaliser qu’avec l’aide et le soutien de beaucoup mais c’est une idée que j’ai la possibilité de concrétiser sans associé. L’investissement essentiel est en temps (mon temps plein depuis fin 2007) et très peu en argent jusqu’ici (quelques milliers d’euros) si je mets de côté le besoin de vivre et de nourrir sa famille au quotidien (les ASSEDIC aident pour cela). J’ai besoin de clients (les associations), de partenaires et, surtout, de mécènes pour mes clients. Qui dit association ou coopérative dit associés. Mais je n’ai pour l’instant pas besoin d’associés ni d’employés.

Dans cette mesure, ce n’est pas un projet issu d’un collectif mais d’un individu. Par conséquent, le seul statut juridique qui me semble approprié est l’entreprise (individuelle ou en société). Pour des raisons fiscales et économiques, le statut de SARL m’a paru plus approprié que celui d’entrepreneur individuel.

Attirer la confiance des entreprises mécènes

Pour mobiliser des bénéficiaires et des mécènes, le plus coûteux (en temps) est de convaincre les mécènes (SSII et cabinets de conseil). Les associations sont les plus rapides à se décider. Par conséquent, et malgré le phénomène de professionnalisation des associations, adopter un statut commercial me donne un (petit) atout supplémentaire qui est bienvenu pour dialoguer avec les mécènes : nous échangeons de professionnel à professionnel, d’entreprise commerciale à entreprise commerciale. Cela facilite la mise en relation, la prise de contact et l’établissement de la confiance.

Et l’argent ? Et le pouvoir ? Et la gloire ?

Bien sûr, l’inconvénient d’un statut de SARL, c’est qu’il suscite parfois, en dehors du monde des entreprises privées, une certaine méfiance quant à mes intentions personnelles. Suis-je avant tout motivé par l’argent (faire fortune) ? le pouvoir (diriger un empire) ? la gloire (passer à la télé) ? ou l’utilité sociale (servir l’intérêt général) ? Certaines de ces motivations sont-elles contraires à l’éthique ? Quelles sont mes priorités ?

J’accepte cette méfiance car elle est naturelle et plutôt saine. La meilleure manière que je trouve d’y répondre, c’est d’inviter les prudents à faire un bout de chemin avec moi pour voir comment les choses se passent, et à dire ce qu’ils en pensent. J’ai aussi tendance à penser que l’important n’est pas tant la nature de mes motivations que les résultats auxquels on aboutira :

  • va-t-on réussir à atteindre les objectifs de changement social que l’on poursuit ?
  • Wecena SARL sera-t-elle une entreprise viable et capable de se développer durablement ?
  • ce projet peut-il, par la manière dont il est mené, servir de source d’inspiration à d’autres ?

Mes priorités, à l’heure actuelle sont :

  1. maintenir le niveau de vie de ma famille à celui que je lui assurais lorsque j’étais salarié (de multinationales) et donc faire signer les premiers mécènes avant cet été ; sinon, je retournerai probablement au salariat d’ici septembre !
  2. obtenir un impact social suffisant dans un délai de un à deux ans ; si je n’arrive pas d’ici là à satisfaire mon besoin personnel de me sentir utile aux autres, le projet prendra alors fin pour moi
  3. pérenniser l’activité et la développer à très grande échelle de manière durable et exemplaire, jusqu’à ce que le projet m’échappe de manière satisfaisante
  4. ne jamais m’ennuyer !

Pour réussir, je trouve notamment de l’inspiration dans :

  • mon expérience en entreprise et dans le bénévolat, sur laquelle je m’appuie
  • l’héritage culturel de l’économie sociale traditionnelle, que je continue à découvrir petit à petit
  • le concept anglo-saxon d’entrepreneur social, dans lequel je me reconnais à 100%
  • le mouvement spirituel de l’économie de communion, qui me fournit un associé invisible ;-)
  • les communautés du logiciel libre et de l’open source, où je vis tous les jours
  • les initiatives telles que le Capital Altruiste, les SAGP, … qui me donnent envie de les expérimenter

Qu’en pensez-vous ?

Altruistic stock options

As far as I understand the concept of « altruistic capital« , the firm practicing altruistic capital donates a percentage of its capital to a nonprofit organization and commits to keeping on donating more shares when the number of shares increasees, so that the percentage of donated shares remains constant (it is called the « altruistic index » if I remember well).

Here is my « altruistic stock options » variation on this theme. Since I am almost a newbie in entrepreneurship and altruistic capital and since I don’t master the arcanes (and vocabulary) of finances, please someone tell me if this makes sense and what you think :

Instead of donating the shares to the nonprofit, the nonprofit has to buy them.

At first, let’s say 10% of the shares are sold to the nonprofit. Later the capital changes and 100% more shares are about to be created (the number of shares is to double). Because of its commitment to my variation on the altruistic capital theme, the nonprofit then receives the exclusive and time-unlimited right to buy the number of shares it needs in order to get back to owning 10% of the capital, at the price of these shares when they are created. It means that once it buys these shares, the nonprofit will still own 10% of the capital : 5% bought at first and 5% bought after more shares where created. Unless the nonprofit buys this 5% more shares, the capital of the firm is only 195% what it was first and the nonprofit has earned the right to purchase 5% more shares at the price they have when the other 95% shares are created. This 5% more shares are sort of « altruistic stock options » which the nonprofit receives.

Pros of this variation :

  • it contributes to funding the altruistic firm : it’s more of a win-win cooperation between the firm and the nonprofit than a pure donation of capital to a nonprofit ; as a consequence, it may be a more seductive offer for entrepreneurs
  • it allows the nonprofit to invest in the company when and only when it wants to (for instance, when it wants to receive more dividends or when it wants to sell its shares – as long as this is allowed)
  • it gives an incentive to the nonprofit for investing as soon as it can (so that it can receive more dividends)
  • it may allow nonprofits to actively contribute to the development of social startups (small capital but both expected social impact and expected financial impact)

Cons :

  • Higher complexity
  • Lower generosity
  • Puts a barrier on the entry of poor nonprofits into the capital of altruistic firms (they have to be able to buy more shares even though they can wait as long as they want) unless they enter these firms when at startup stage, maybe the system can be bootstrapped by first having altruistic shares donated and further donations be replaced with altruistic options.

So, what do you think ?

Le wecena vu par… vous

Grâce au mini-sondage que j’ai mis sur wecena.com, vous avez été une trentaine à venir dire ce que vous pensez du wecena. Voici les résultats collectés à ce jour (continuez à répondre !) :

Pour vous, le wecena, c’est …

  • pour 12 répondants : … un moyen concret pour faire avancer de bonnes causes et une manière utile d’occuper son temps quand on est ingénieur en inter-contrat.
  • pour 11 répondants : … un moyen important pour rendre solidaire le secteur de l’informatique et une idée astucieuse voire géniale
  • pour 9 répondants : … un concept qui pourrait faire bouger les entreprises informatiques.

Il y a quand-même un ou une parmi vous qui dit que c’est aussi :

  • … de la communication et du marketing, sans réelle utilité sociale.

Celui-là ou celle-là, j’aimerais qu’il revienne dans un an, lorsque les associations qui bénéficient du wecena auront pu lancer leur projets informatiques avec moi ! On pourra alors parler sur du concret et lui faire changer d’avis. Mais la partie la plus sympa, c’est dans les commentaires et réponses libres que certains ont laissés en plus pour cette question. Le wecena, c’est …

combler en manque car la solidarité au niveau de l’informatique n’existe pas beaucoup, surtout quand on parle de développement de logiciels !

un véritable engagement social et humain

Pourquoi pas une bonne idée, toutefois ma SSII nie totalement jusqu’à la notion d’intercontrat et gère les ressources en flux tendu sur plusieurs projets à la fois. Il est donc totalement illusoire de penser leur proposer ce projet ; je suppose que ce n’est pas la seule. Bonne continuation et on courage !

Bonjour consultante en organisation pendant plus de 10 ans dans des SSII et cabinets conseil, […] je suis enchantée de voir une si belle initiative, car la dimension humaine fait tant défaut dans les SSII (cf le livre « l’OPEN SPACE M’A TUER ») Je serai ravie de pouvoir participer au développement de votre concept. […]

L’histoire incroyable d’un mec incroyable qui a une idée en tête depuis de nombreuses années (depuis toujours peut-être) et qui, a force de persévérance et au nom de convictions « vraies » est enfin sur le point de trouver la bonne formule. Keep on Jean ! [Merci PE , ça fait plaisir !]

Des commentaires aussi sympas, ça donne envie de se défoncer pour la suite du proejt ! Même si vous pouvez considérer que le dernier « compte pour du beurre » puisque c’est un super pote à moi qui est venu le laisser.  :-)

Continuons avec les réponses aux questions suivantes :

13 répondants sont dans une société de conseil ou de services en informatique et 15 ne le sont pas (ça fait 28 répondants à ce jour, pour ceux qui suivent). Pour vous 13 qui êtes en SSII/cabinet de conseil, voici ce dont votre entreprise a le plus besoin actuellement:

3 répondants :

  • Un passage du discours à l’action, en matière de développement durable.
  • Prouver qu’elle n’est pas un « vendeur de viande ».
  • Une âme.

2 répondants :

  • Des réponses concrètes à apporter aux questionnaires « développement durable » des appels d’offres des grands comptes.

1 répondant :

  • Une meilleure réputation pour fidéliser les consultants/ingénieurs.
  • Une occupation solidaire et utile pour les intercontrats.
  • Garder la tête froide en temps de crise

Bref, vous voulez du changement, du concret et pas qu’un peu !

Merci à celui qui m’a signalé que le formulaire était mal fait. Il manquait en effet une réponse possible « autre choix »/ »besoin d’absolument rien de tout ça », je l’ai rajoutée.

Ensuite, comme j’ai besoin de mieux comprendre comment convaincre les dirigeants d’un grand nombre de SSII de faire du wecena, je vous avais demandé si votre société avait un responsable RH bien désigné, un responsable communication, etc. Ce qui intéressant, c’est que vos réponses m’ont indiqué qu’il n’y a que très rarement un responsable développement durable / RSE / mécénat (11% des répondants), aussi rarement qu’il y a un responsable marketing (également 11%). En fait, la répartition des responsabilités dépend pour une grande part de la taille de la boîte (ce genre de fonctions se retrouve surtout dans les grosses boîtes). Ce que vous m’indiquez surtout, c’est que parmi les 2 fonctions liées au mécénat et que l’on retrouve le plus souvent sont le responsable RH et le responsable communication. D’ailleurs, c’est avec ce type d’interlocuteurs que je dialogue le plus souvent.

Pour essayer de trouver les meilleurs arguments pour convaincre, je vous pose la question suivante :

Quels sont les principaux avantages du wecena pour votre entreprise ?

6 répondants :

  • Le wecena ne coûte rien puisque l’on ne donne que ses intercontrats et son économie d’impôts.

5 répondants :

  • Le wecena nous distingue de la concurrence.
  • Le wecena améliore la réputation de l’entreprise.

4 répondants :

  • Le wecena donne de la matière à notre communication institutionnelle ou « développement durable ».

3 répondants :

  • Le wecena donne des réponses concrètes pour les questionnaires « développement durable » des appels d’offres de nos grands comptes.
  • Le wecena renforce notre culture d’entreprise.
  • Le wecena favorise l’ouverture d’esprit de nos consultants en les mettant au contact du monde de la solidarité.

2 répondants :

  • Le wecena motive nos intercontrats et évite qu’ils ne doutent d’eux mêmes ou de l’entreprise.
  • Le wecena est un élément de réponse à la crise.
  • Le wecena est « dans le vent », « à la mode », « tendance », à l’heure du développement durable et du mécénat.

1 répondant :

  • Le wecena attire les jeunes diplômés de plus en plus sensibles au développement durable.
  • Faire du wecena, c’est remplir son devoir d’entreprise responsable et citoyenne.

Ce que j’en conclus :

  • ce qui peut intéresser une SSII, dans le wecena, c’est clairement dans le portefeuille qu’il faut le chercher (coût zéro) plutôt que dans une notion de devoir moral à accomplir (responsabilité, citoyenneté).
  • ce qui vous semble le plus attirant à l’échelle de l’entreprise, c’est de « faire la différence », de se doter grâce au wecena d’un avantage concurrentiel qui se manifeste par une meilleure réputation.
  • vous n’êtes pas très sensibles à l’argument « attirer les jeunes diplômés » mais ça m’étonne un peu car lors de mes discussions via Syntec Informatique (le syndicat patronal des SSII), notamment, j’ai beaucoup d’interlocuteurs intéressés par cet aspect des choses ; mais je comprends que l’attirance des jeunes diplômés pour une SSII qui ferait du wecena reste quelque chose à prouver et c’est un peu pour ça que j’avais compilé les résultats de 20 enquêtes professionnelles et études scientifiques sur l’influence de la réputation « développement durable » dans la capacité à attirer de meilleurs talents.

Merci à celles et ceux qui ont transmis ce mini-sondage à des collègues et à celles et ceux qui m’ont mis en relation avec des dirigeants de SSII, même de taille modeste ! Je m’attelle à les contacter et à essayer de les convaincre. Je vous tiendrai au courant par email.

Pour finir, j’ai récemment ajouté à ce sondage une question clef. Etes-vous d’accord/pas d’accord avec l’affirmation suivante : Je souhaiterais qu’une ou plusieurs autres personnes (de ma société) découvrent ce qu’est le wecena. Et la réponse est … vous êtes tous d’accord (100% des répondants) !

Je compte donc sur vous pour passer le mot et, pour ceux qui n’ont pas encore répondu, à prendre cinq minutes pour le faire ! Je publierai une mise à jour de ces résultats quand il y aura quelques dizaines de réponses de plus.

How to get visual performance profiles from plone doctests ?

I am developping a couple of Plone 3.x products. They have some tests, including a huge functional doctest which takes a long time to run (about a couple of hours !) but covers some of my most interesting use cases. I wanted to use these tests in order to get some insights about possible performance bottlenecks and other optimization hot points in my code. The result of my effort was a very nice visual chart showing these bottlenecks and hotpoints.

[update: added another visualization package, see at the end of the post]

Here is how I had to proceed (note that I am more of a foolish and coward hacker than an expert and I decline any responsibility on the consequences of following my howto !) :

1. Give your python a suitable profiler

Plone 3.x requires zope 2.10 which in turn requires python 2.4. More recent versions are not supported AFAICS. Problem: python2.4 does not have a reliable performance profiling module. Its « hotshot » module is both slow (when loading statistics) and badly bugged : it crashes when you have it load some of the profiles it can generate. You have to add a better profiler to your python environment, namely cProfile (which is shipped with python 2.5).

I am a terrible sysadmin and I don’t really understand (and care about) how python manages its pathes and accesses its libraries. So I did this :

  1. download and unzip the source tarball of python 2.5 so that you get cProfile source code
  2. locate relevant files referring to lsprof (the old name of cProfile), using a grep -R lsprof * on the source directory
  3. I personnally located the following files (I leave cProfile test files apart) : Lib/cProfile.py Modules/_lsprof.c and Modules/rotatingtree.* (.c and .h)
  4. download and unzip the source tarball of python 2.4
  5. copy the located cProfile files from their python 2.5 location to the proper dirs into the source code of your fresh python 2.4
  6. update python 2.4 ‘s setup.py file so that the line below is added just after the hoshot one : exts.append( Extension(‘_lsprof’, [‘_lsprof.c’, ‘rotatingtree.c’]) )
  7. did I mention I am so bad at hacking things that I don’t even provide a patch for the operations above ?
  8. compile python 2.4 using a ./configure then make

At this point, you must have an executable python interpreter version 2.4 which includes cProfile. You can check by launching this python and trying a import cProfile which should not fail.

I replaced my system python2.4 by then doing a sudo make altinstall but I also had to manually tweak my system files so that this new python2.4 gets properly called (I am using ubuntu 8.10 intrepid, BTW) :

cd /usr/bin

sudo mv ./python2.4 ./python2.4.5

sudo ln -s /usr/local/bin/python2.4

Now, a plain command line call to python2.4 should give you an interpreter prompt which lets you import cProfile if you dare. I suffered some colateral damage here : the python prompt lost its ability to have previous lines copied at the prompt by pressing the Up/Down arrows. And I had to re-install reportlab from the source (some of my products depend on pisa which depends on reportlab). Anyone knows how to restore this Up/Down arrow capability ?

2. Recreate your buildout using this new python version

So that zope gets recompiled using your new python version :

rm -Rf parts bin develop-eggs

python2.4 bootstrap.py

bin/buildout

3. Patch zope testrunner so that it supports cProfile instead of only supporting hotshot

I got a bit confused because my buildout contains 2 zope testrunners. It took me some time to figure out which was which : the one which is used by the zope instance your buildout creates is the one which is shipped with zope 2.10 and is located at parts/zope2/lib/python/zope/testing/. The other one I have is in the zope.testing egg. I don’t know how and why I got such an egg. Anyway, this egg supports both hotshot and cProfile whereas zope 2.10 testrunner doesn’t. So I hacked the weaker/older zope 2.10 testrunner with some inspiration from zope.testing so that cProfile can be used when running tests. Here is the diff you can use for enhancing  parts/zope2/lib/python/zope/testing/testrunner.py. Oops, left version is the modified one, right version is the original one.

38,69d37
< before_tests_hooks = []
< after_tests_hooks = []
< available_profilers = {}
<
< try:
<     import cProfile
<     import pstats
< except ImportError:
<     pass
< else:
<     class CProfiler(object):
<         «  » »cProfiler » » »
<         def __init__(self, filepath):
<             self.filepath = filepath
<             self.profiler = cProfile.Profile()
<             self.enable = self.profiler.enable
<             self.disable = self.profiler.disable
<
<         def finish(self):
<             self.profiler.dump_stats(self.filepath)
<
<         def loadStats(self, prof_glob):
<             stats = None
<             for file_name in glob.glob(prof_glob):
<                 if stats is None:
<                     stats = pstats.Stats(file_name)
<                 else:
<                     stats.add(file_name)
<             return stats
<
<     available_profilers[‘cProfile’] = CProfiler
<
75,98c43
<     pass
< else:
<     class HotshotProfiler(object):
<         «  » »hotshot interface » » »
<
<         def __init__(self, filepath):
<             self.profiler = hotshot.Profile(filepath)
<             self.enable = self.profiler.start
<             self.disable = self.profiler.stop
<
<         def finish(self):
<             self.profiler.finish()
<
<         def loadStats(self, prof_glob):
<             stats = None
<             for file_name in glob.glob(prof_glob):
<                 loaded = hotshot.stats.load(file_name)
<                 if stats is None:
<                     stats = loaded
<                 else:
<                     stats.add(loaded)
<             return stats
<
<     available_profilers[‘hotshot’] = HotshotProfiler

>     hotshot = None
288c233
<     if len(available_profilers) == 0 and options.profile:

>     if hotshot is None and options.profile:
320,324c265,266
<         if available_profilers.has_key(‘cProfile’): prof = available_profilers[‘cProfile’](file_path)
<         else: prof = available_profilers[‘hotshot’](file_path)
<         before_tests_hooks.append(prof.enable)
<         after_tests_hooks.append(prof.disable)
<

>         prof = hotshot.Profile(file_path)
>         prof.start()
335c277,278
<             prof.finish()

>             prof.stop()
>             prof.close()
342c285,292
<         stats=prof.loadStats(prof_glob)

>         stats = None
>         for file_name in glob.glob(prof_glob):
>             loaded = hotshot.stats.load(file_name)
>             if stats is None:
>                 stats = loaded
>             else:
>                 stats.add(loaded)
>
459d408
<                 [hook() for hook in before_tests_hooks]
461d409
<                 [hook() for hook in after_tests_hooks]
656,659c604
<     [hook() for hook in before_tests_hooks]
<     results = run_tests(options, tests, layer_name, failures, errors)
<     [hook() for hook in after_tests_hooks]
<     return results

>     return run_tests(options, tests, layer_name, failures, errors)

Oh, BTW, this diff also lets you filter out the profiling of the setup and teardown steps of your tests which are of poor value compared to actual tests. Thanks to Daniel Nouri for this.

At this point, you should have given your zope instance the capability of profiling tests using cProfile. You can check it by asking for a debug prompt from zope : bin/instance debug The prompt you get should allow you to safely import cProfile

4. Profile your test

Say you have a Products called Products.DearProduct with some tests. Profile them :

bin/instance test -s Products.DearProduct –profile

At this point, you should get a tests_profile.*.prof file saved in the current dir. It contains the performance profile cProfile generated, using the pstats format. You can manually load and analyze this data. Or have a limited GUI show you what it’s like. Or you can go for the nicer, more insightful version which follows.

5. Visualize and analyze the performance profile you generated

Thanks to Ingeniweb folks, I heard of gprof2dot and xdot. Download them (the scripts, not the folks). Use them to generate and display a very nice graph :

chmod 744 gprof2dot.py

chmod 744 xdot.py

./gprof2dot.py -f pstats -o profile.dot tests_profile.*.prof

./xdot.py profile.dot

Note the * you may replace with the ID of the profile generated above. Or you can use the fancy but dangerous one-liner below which runs the tests,  generates the profile, generates the corresponding graph, displays the results of tests and displays the graph for analysis :

rm -f tests_profile.*.prof && rm -f profile.pstats && rm -f profile.dot && bin/single-instance test -s Products.MyDearProduct –profile > /tmp/test.txt ; ./gprof2dot.py -f pstats -o profile.dot tests_profile.*.prof && less /tmp/test.txt ; ./xdot.py profile.dot

At this point, you should be starring at nice colored graph which represent the flow of your tests and the method which may be performance bottlenecks. And you should be hoping that it was worth the effort.

[Here starts the update]

After some contemplation moment, I tried to analyze the graph of my tests and did not feel extremely happy with this graph visualization. It indeed shows me that the slowlyness of functional doctest is mostly due to the testing framework (zope.testbrowser, etc.). This slowlyness « hides » the optimization opportunities of my code. And I don’t know how to exclude some products from the being profiled or from being present in the profile stats (I would have liked to filter out zope.testbrowser and other Plone-specific things). But, all hope is not lost, here comes kcachegrind:

sudo apt-get install kcachegrind

sudo easy-install pyprof2calltree

pyprof2calltree -o output.calltree.stats -i tests_profile.*.prof -k

Using kcachegrind with the help of pyprof2calltree, I was able to focus on my product methods and identify those methods which deserve some caching. Added some @memoize decorators and reran the profiled tests so that I could enjoy the performance improvement… Happy I am, happy thou shalt be.

What do you think ?