Kartones Blog

Be the change you wanna see in this world

Book Review: Peopleware: Productive Projects and Teams

Using my commute time I've just finished reading another book, this time about people and team management. And after a nice example on the web of a review including side-notes, I've decided to copy the idea and also provide some notes when worth it. I just take screenshots from the tablet or mini-notes if is a Kindle e-book, so don't expect anything fancy or detailed.


Peopleware book cover

Title: Peopleware: Productive Projects and Teams

Author: Tom DeMarco, Tim Lister

The review is based on the 3rd edition, which about a book that was first written at 1987 is significant.
I was recommended this book and given that I now have to manage a small development team and interact more actively with the full organization of the company I gave it high priority on my reading list. Ther results are quite satisfying, I can't but agree on so many points about how things should be done.

Issues with traditional rules, with policies, with the furniture and office disposition, with noise, with methodologies, with people... Along the 39 chapters this book is a journey about the most common things that are handled wrongly, but also about solutions, good alternatives to those problems. Combined with quite a few real world examples (sadly usually about bad scenarios), this reading feels like almost radical because of how sincerely and plainly puts some problems.

Both the good advices and the listings of things to be wary or directly fight off are pure gold, and if I had to choose something as bad, it would be really hard... maybe that the authors' humour a few times is not of my taste (but usually it is). A more than recommended read!


Elements of a healthy organization:

  • Make a cult of quality
  • Provide lots of satisfying closure
  • Build a sense of eliteness
  • Allow and encourage heterogeneity
  • Preserve and protect successful teams
  • Provide strategic but not tactical direction

Quick cheklist of things to fight against:

  • Furniture Police
  • corporate entropy
  • teamcidal tendencies
  • no time to add quality to the product
  • Parkinson's Law
  • formal Methodologies
  • low E-Factor ( E-Factor = Uninterrupted hours / Body-present hours )

Management basics:

  • Get the right people
  • Make them happy so they don't want to leave
  • Turn them loose

The purpose of a team is not goal attainment but goal alignment.

Top teamicide techniques:

  • Defensive management
  • Bureaucracy
  • Physical separation
  • Fragmentation of people's time
  • Quality reduction of the product
  • Phony deadlines
  • Clique control
Managerial addons:
  • Annual salary or merit reviews
  • Management by objectives
  • Praise of certain workers for extraordinary/fast accomplishment
  • Awards, prizes, bonuses tied to performance
  • Performance measurement in almost any form

Work to rule: Form of strike in which workers follow exactly to the rule every procedure, norm and step required for every task.

Open organization: Pushing all information to everybody instead of letting people pull for information they actually care about.
"Life is short. If you need to know everything in order to do anything, you're not going to get much done."

Unwritten (and bad) rule at work: Silence gives consent. If you don't object to things it is implied that you give your consent. This causes extra work having to make clear when you don't. Repeal this passive consent.

Need-to-know email test: Before sending any email, think about what you need for that person if really needs to know the information, or how to make him/her self-coordinate instead of depend on your emails.

Introducing changes: The introducer has all those who benefit from the old [...] as enemies, and has lukewarm defenders in all those who might benefit from the new. [...] The equation is unbalanced against change. People hate change. When we start out to change, it is never certain that we will succeed.

Naive model of how change happens:
Old status quo --better idea--> New status quo

Stair change model:
Old status quo --Foreign element--> Chaos --Transforming idea--> Practice & integration --> New status quo

Foreign element can be an outside force or the world changing.

Brainstorming facilitator ideas to restart participants' thinking:

  • Analogy thinking: How does nature solve this or a similar problem?
  • Inversion: How might we achieve the opposite of our goal?
  • Immersion: How might you project yourself into the problem?

Hiding your Linkedin connections list

Receiving Linkedin invitations to connect is the most common action you do on the work-oriented social network. So frequent, that I know quite some people that simply pile up dozens, then hundreds of invitations, not wanting to accept them. The reason is usually the same: It's a recruiter that either didn't even sent a private message to introduce himself/herself, or that if they did... it smells like a template filled just with your name and as much as your current company name.

This is sad, because I really believe in the power of Linkedin as a source of good talent, but so much noise and flood of low (or no) effort recruiting attempts, sometimes even blind shooting (or worse, receiving similar messages from multiple people of the same company's HR department) just creates an ugly picture of the recruitment job. And while I also suffer them from time to time, I've also had pleasant experiences, both regarding job changes and just having good chats explaining my situation and reasoning to not wanting to switch job.

But there's also a part of me that is a bit paranoid regarding privacy, so since long ago I found what I think is the single most interesting privacy option at linkedin: Changing your connections list privacy to private. Or more especifically, changing it so your contacts will only see those of your connections that are shared, that they also have on their contact list. This is not only a good defense line to keep your contact lists private, but also a bit of a trolling mechanism for those lazy recruiters who don't do their homework: "sure, you want us to connect so you can try stealing or spamming my contact list? No problem, but there's a surprise waiting for you". It also is interesting if at your job you have some referal prizes, which can sound selfish but I've seen HR departments prey every employee Linkedin hunting for fresh meat, and then annoy some people from multiple sources almost at once.

This handy option can be found under Privacy & Settings:
The most interesting privacy option

As I said, it is not always the case and there are good recruiters too (I've met a few), but the market is saturated with unprofessional people and this helps to keep them at bay, or at least frustrate their attempts of grabbing your connections.

Good lessons learned from past jobs

We sometimes are too negative and forget that many times there's also a bright side about most situations. For example, when we don't end nicely a work relationship, we tend to only remember what went wrong (if it did, that is). This post is a small recapitulation of good things I've learned on each and every past job, no matter if it was overall a good experience or not.

At my first job, Eidos (now Alhambra-Eidos, and NOT the videogame publisher) I had the luck of directly learning a good way to build software: 3-layer applications, separation of web templates and code, SQL Server stored procedures instead of SQL in strings, distributed components... They also hosted for free one of my defunct websites for many years.

At the second job, Surfernet, I did some of the coolest projects: A full MSN Messenger client from scratch (fully implemented the protocol), a Winamp-like MP3 player, and other nice applications with fancy graphics using Win32 API. It was physically exhausting (I worked from 8AM to 1PM, + going to university until 9PM) and schedule was always tight (usually projects took 1,2 months max.) but I learned a lot.

At the third job, I mostly developed the sense of teamwork. Development was a tiny fraction of the company and not well cared about, but the four of us took the daily job with tons of humor and smiles up to the day we left.

ilitia was the 4th job, and I lasted there for 4 years. On one side, it was a job where I matured a lot: Long times in a client, dozens of projects built in quite varied languages ranging ANSI C to advanced C# (.NET Remoting, threading in the pre-C# 2.0 era, ...), first time ever doing testing (even TDD!), setting up a .NET continuous integration server, my first usergroup and event talks (giving the first one in front of 200 geeks was really scary), even managing a small team of two people in my last months... On the other side, lots and lots of fond memories, parties, friends made (some of my best ones come from here).

Then came NAVTEQ, an important milestone because I got out of consulting. I learned to fight for what I think it is right, whenever it is the appropiate programming language (instead of a random management decision), pushing for rewriting components, or daring to peek into heavy algorithms-related code (I optimized an A* component). It was also the first time I had to talk in english at work but outside of events/talks.

Nokia shutdown NAVTEQ Madrid offices, and I ended up hired at Tuenti, another place where I've been almost 4 years. Here I got way out of my comfort zone, switching from a full .NET stack to a LAMP one (but hey, at least was object oriented PHP!). By far, Tuenti is the place where I've learned most and quickest, pacing being so fast that we joked about 6 months there being like 2 years at any other company. Lots of high scalability concepts, watching a website grow to millions of users and huge numbers of visits. It was a monolith but it worked nice and we were better than Facebook in Spain for quite some time. The "work hard, party hard" motto was 200% true, but I would repeat the experience without a doubt.

Minijuegos was the seventh job. Wanting to go back down to building big chunks of something from scratch (or almost) I joined. Between three people (CTO, a junior dev and me) we were able to fully build an online games portal, avatar generation system, CMS, APIs, payment gateways... I was able to put into practice theory learned in the past, work with asynchronous jobs... and work for once in something related with videogames! (my childhood dream). Things slowed down and tasks weren't so challenging but I did my "Mr. Wolf" role, got "version 1.0" done and made some good friends there too.

CartoDB (Vizzuality in 2014) was another radical shift, ditching my PHP and MySQL knowledge to start with Ruby (on and off Rails) and PostgreSQL, and this time moving to a full backend engineer role. There I learned a lot about databases, importing big amounts of data, manipulation and transformation of data, heavy DB-related operations, developing and maintaining APIs, and lots of interesting concepts of mapping and GIS (although I only grasped that world). I'm happy because I think I was able to hold up with a big part of the backend, alone for a while and then with some great colleages once we grew.

And now, The Motion marks the 9th job. I have lost sight of my comfort zone: now I'm working with Python, microservices, containers, AWS, managing a small team... And getting for once deep into devops tasks... We'll see how it goes ;)

Book Review: Speccy Nation

Last month I forgot to post anything so here comes one of the books I read some weeks ago, Speccy Nation. Small, cheap and not especially good, but hey, I paid less than 2€ for it so what could I expect...


Speccy Nation book cover

Title: Speccy Nation

Author: Dan Whitehead

A small 124 pages B&W book about 50 ZX Spectrum games chosen from a British perspective. Nothing less, nothing more. Some are terrible games (chosen on purpose), some are really good classic ones, but I really miss international games, as for example Spain had lots of really good titles.

The writing is good, even in the case of really straightforward and even simple titles, knowing when to simply explain how the game worked and when to expand with what made it really different from others.

Some chapters about the Spectrum itself or its history would have been welcomed, but we get exactly what we're told about. The description of games vary in length, some being a bit small (1 page including a screenshot) others being 2 pages long, sometimes they feel not extense enough and in a few cases you don't even get to know exactly how the game was played, but is the exception, not the norm.

Overall, a really cheap title so if you feel nostalgic is a good quick read to maybe grab ideas of some games to play (if you're able to get them).

Migrating from BlogEngine.NET to Pelican

Last weeked I found some spam at two of my BlogEngine.NET blogs. It is not the first time, and in the past updating to the latest major solved the issue, but this time I had to switch from 2.9.X to 3.2, and I already suffered a migration from 1.9 to 2.0 that gave quite some headaches. One of my main reasons to go far away from Wordpress was to stop this tiring battle between spammers and new versions, that forced you to update way too frequently or face serious security bugs and spam-holes. Combine that with a general feeling of being tired of big, admin-driven blog engines, and I needed a big change.

My premises were:

  • Administration fully optional: even prefered not to have one
  • Static site generation: No more security issues, plus FTPing the changes once or twice per month is more than enough considering my posting frequency
  • As less setup requirements as possible
  • Local testing: Including (for the near future) Windows support without extra effort
  • Favor Python 3 over other languages: I want to improve my Python n00b skills and the best way is to use it as much as possible

Reading some articles and checking some static generators, I found Pelican. I peeked at bit at the source code, documentation and plugins, and it looked quite simple. Did some local tests, wrote some posts using existing content and read the documentation, and decided to keep it.

The setup is so easy I got a blog running locally with some base theme in a few minutes. But I had one issue, all my posts are in XMLs (thankfully I had chosen not to use a DB for storage) and Pelican uses Markdown... so I had to transform the data somehow.

I don't do too complex stuff like <meta> keywords and I set some post tags but not even show them, so in general I just needed a few fields for the pelican post format:

Title: ...
Slug: ...
Date: ...
Tags: ...,...

...CONTENT (which can be directly HTML)...

The XML has a very simple structure, with all the fields and just HTML-encoded the content, some regular expression searches and reverse transformations were enough to port everything. I have plans to migrate another blog, and prefer to be able to reproduce the whole migration any number of times, I built a small script. It only handles basic stuff and doesn't extracts other "basic" fields like authors, and only works with posts (I manually migrated the pages as I had few), but it does what it does well and might be of some use to somebody else.

You can find both my scripts and a small plugin (to limit RSS/Atom syndication feed output to only a certain amount of items, as by default dumps every post ever written) at my GitHub.

I'll probably work on more small plugins in the future, as I have some improvement ideas regarding output content generated, but I can't be happier with the results. A proper example of "the Python way of life", simple yet practical code, easy to setup and use and does it's job without many features.

UPDATE: Added another small script to GitHub to do some post-generation tasks like creating duplicates (as "aliases") and moving or removing certain files from the output folder.

Previous entries