Archive for the ‘Seeds’ Category

The last few weeks were positively demanding for me…

At the end of October we organized the C++ Day, an event entirely dedicated to C++, made by the Italian C++ Community that I lead and coordinate. If you feel like reading some lines about the event, have a look here. It was a great day!

C++ Day

C++ Day 2016 ~ Florence

Some days after, I left for Seattle, to attend the Microsoft MVP Summit at the Microsoft Campus in Redmond. An awesome experience!

14947822_10154149337022149_3563183436919340327_n

Italian Microsoft MVPs at the MVP Global Summit 2016

Casually, the ISO C++ Standard meeting was happening exactly the same week I was in Redmond. I couldn’t miss it! Then, at the end of the Summit, a few other MVPs (like Marius Bancila and Raffaele Rialdi) and I went to Issaquah to attend the meeting half a day. The game was afoot.

The experience was really amazing. First of all we added our names on the attendance sheet to get our names immortalized in the minutes  🙂 That’s was suggested by Herb, who was very kind with all of us.

issaquah-sutter

From left: Marco Arena, Herb Sutter, Raffaele Rialdi, Marius Bancila

Then I am glad we met many members of the committee. They were really gentle and welcoming.

I think attending one of such meetings is a must for whoever cares about the C++ language and also wants to understand how things are discussed and evolved.

You probably know that the committee is divided into a few working and study groups – WG and SG. The working groups are Evolution, Library Evolution, Library, and Core. We were sitting in the Evolution Working Group (EWG), where we heard discussions about a few proposals for C++17 and C++20.

A proposal presentation starts with the author(s) of a proposal defending the idea, going through the paper and showing examples. For what I attended, that part was quick (10′) and other people eventually interrupted only for little clarifications.

Then the discussion starts. It is coordinated by a guy who goes around the room and moderates the discussion. Each member who wants to say something just raises her hand and politely waits to take the floor. Too many times I attend meetings where people just interrupt others. That was exactly the opposite!

Speaking with some guys of the committee, I discovered that some (crucial) discussions are instead plenary (they involve the whole committee and not only a certain working group) and they take place in another – bigger – room.

The discussions I was present in ended with a poll. Something like “how many people agree? How many disagree? How many strongly disagree? Etc.”. It also happened that a discussion was simply postponed because the co-author – Bjarne Stroustrup – was not there.

Each proposal is deeply inspected by bringing out lots of detail, counter examples and observations. That part was the most instructive for me.

On that point, I realized that one thing is particularly vital for the committee: heterogeneity. People have a different background/interests and they use C++ in different ways. The details that come out from discussions reflect this heterogeneity. Without that we would lose many details and observations.

For example, at some point Peter Sommerlad took the floor and asked something like “so, if we accept this proposal we should start teaching people to stop doing X”. Peter made that observation because he is a professor and his point of view is often influenced by his main job.

Other examples were concerns about legacy and old code, which a certain proposal could break under some circumstances that a few people were working on daily. Interesting also the observations made by compiler implementers, because they often already see how complicated would be to code a certain new C++ feature.

The experience was definitely worth it. Thanks to Herb and Andrew Pardoe for their hospitality.

Sometimes such meetings take place in Europe so if you cannot go to USA then just wait for one happening on this side of the World and attend! I’ll do it again.

The week next I went to Berlin for Meeting C++ 2016. I am happy I was part of the staff. There I had the opportunity to meet Bjarne Stroustrup and to dine with him and  with other special people.

with-bjarne

From Left: Michele Adduci, Valentino Picotti, Marco Arena, Bjarne Stroustrup, Jens Weller, Gian Lorenzo Meocci, Marco Foco

This amazing experience concludes my “C++ & friends weeks”.

My short-term plans constist mostly in blogging – I want to write a new “C++ in Competitive Programming” installment, as well as a couple of posts I have had in mind for months – and planning next events and activities. In 2017 my spare time won’t be more than in 2016 but I hope to be more active.

In June I want to make a new C++ event in Italy. If you feel like supporting/sponsoring/helping please get in touch with me.

Being part of a team could be cool and istructive, and I’m not referring only to software development. For example, I’ve played volleyball for 13 years, in 6 different teams and I’ve enjoyed a lot at playing with different people with different styles. Sometimes people forget that you can learn not only from the best players, but also from the worst ones.

From the best you can acquire tips and tricks, pills of experience, you can refine your technique, you can just mimic him (or at least try!). From the worst player you may understand how to deal with failures and recurrent errors. The worst player should be (I repeat, should be) the athlete who gives her best to improve herself. This desire to get better is instructive and, often, is not very apparent in high level players. Anyhow, each member of a team can learn and teach at the same time. I consider this thing very valuable.

Same concepts apply to work, for example in a team of software developers. Team is first about people and only after about software, volleyball or whatever you want. So a team of developers can be messed up by the same problems of a team of footballers. Generally these problems are some difficult people and situation. Here I’m trying to describe four types of problematic teammates, basing this classification on my experience and lots of discussions with other software developers.

These guys are initially welcomed into the team, but are capable of causing troubles when their shortcomings become apparent. And I’m not talking of technical skills, because those with insufficient technical skills are usually not hired (usually…). I’m talking about attitude, that is more difficult to treat.

Let’s start.

Rambo is the first type of problematic programmer. He is talented and everybody trusts and depends on him. If you can’t solve a problem Rambo is your guy. Rambo knows he is the best, he enjoys his position and sometimes (if the management is too weak) he also keeps the top-level manager in check. In fact, the top-level manager invested him of a special power. In the worst case, Rambo takes complete ownership of his code and tries not to let anyone else near it. He doesn’t trust anyone, so no one can touch his code. And often it happens that Rambo voluntarily write difficult code, so no one can (easily) understand it.

Another bad thing that can happen is when your team builds and evolves a product. Rambo can be assigned to make the new stuff, because he is the best and he knows how to do them fastly. Also clients trust him. This can lead also to jealousy inside the team.

Rambo has a high contractual power specially if the top-level manager relies heavily on him. It is useless to say which troubles the whole team may experience if Rambo quits, leaving a vast quantity of source code that is difficult to deal with. And what if he fails or he is sick? He is a bottleneck. The bad news is that Rambo is mostly a tricky management problem. Why tricky? Because it can happen that the team-leader cannot really “order” anything to Rambo, in fact he responds only to the top-manager.

The Prima Donna is another plague. He is the best and he knows it. If you criticize him, you’ll suffer his wrath! His idea is the best, he’s been a programmer since he was a child, his ideas are always excellent and his code is perfect ever. He’s not capable to take criticism. But unlike Rambo, he was not invested of a special power by the top-level manager so – from a management standpoint – the prima donna is a team-leader problem. The prima donna lacks interpersonal skills and he divides other teammates in two classes: those who are less skilled than he and threats. He generally criticizes who he perceives as a threat by insulting their intelligence and their skills.

Very likely, the prima donna is the biggest pain for a team. He can cause other skilled – but less arrogant – people to quit. Sometimes the prima donna forms an alliance with Rambo (or at least he tries). And if he succeds the things will become even worse.

The parasite is the factotum but the master of none. He knows all about the system (the product), so he is one of the most important “historical mind” of the team. Database, GUI, core, … he has worked on every aspect of the system so when you have problems on old (and very used) features then he is your man. Sometimes he just wants to preserve his job so he is not interested to innovate the system with new technologies, that – from his point of view – are something new to learn or, even worse, something that new programmers can learn easily.

The parasite is the most useful of the negative developer types and, sometimes, can be viewed as positive. He is not a menace for the team, indeed, in some cases he is the developer that is worth preserving. The good news is that the team-leader can easily make people working with him so his know-how flows in the team.

The coward programmer is the typical computer geek. He is personality-deficient even if he is very capable. He tends to be very withdrawn and taking criticism is also difficult for him. In fact, he considers a critics like a reproach because his communication model is freezed at the age of 12. Due to his awe and introversion, it’s not unusual that he considers sending emails the best way of communicating.

The real problem is that he never really participates the team. He doesn’t propose his – often excellent – ideas. This lack of communication is painful and the company doesn’t get all the real value of this kind of programmer. A coward programmer is hard to deal with for the team-leader as well as for the top-level manager, because in the coward’s mind they are too high level to communicate peacefully with him. So, each teammate (seen like a “peer”) should help the coward to improve his communication skills, for example by integrating him a bit more in the job. Also pair-programming may help.

So I presented four kind of painful teammates. A thing that sometimes I stressed was about top-level management and team-leader. They are responsible to identify and deal with these people from a management standpoint. Obviously, if you are a teammate of Rambo or Prima Donna, you have to deal with them from a technical and often interpersonal point of view. Suggestions are hard to make. People are different and each character has subjective reaction.

If you have to work with a prima donna, the tip I’d give you is to never react to his critiques with another critique. Be professional, the battlefield of a prima donna is about provocations and technical religion. If you like Java and he hates Java, don’t try to convince him that Java can be used for a project. Rather, say “ok, you’re right, let’s talk about our job now”. And if it is impossible for you to work with him, talk to your team-leader.

As I wrote, sometimes Rambo leads to jealousy inside the team because he is assigned to new and cool stuff. If your company organizes meeting with the top-level manager (individual or group), tell you want to join new projects. Try to be pragmatic, convince him you have the required skills. This can be useless, but trying is better than nothing.

Parassites and coward programmers are generally harmless from an interpersonal standpoint. You could be in contrast with an “old” parassite who does not like innovation. Here, again, be pragmatic, make clear the benefits of the new stuff. But don’t claim to win every single battle!

And what if you identify yourself in one of this category?! Fuck you. No, I’m just joking 🙂 Well! Consider you could be a sort of problem for your teammates and for your company. And if you don’t care maybe other people do!

For an accountant, programming productivity can be defined as lines of clean, simple, correct, well-documented code per day. Actually, searching the web you can find a bunch of good/bad definitions but, as for the majority of my posts, here I’m going to refer to my real experience, being as much pragmatic as I can, then I’m not very interested in analysing all the possible definitions.

I like thinking as an engineer and for me productivity is a measure of the efficiency of production. Following this short post, we can say productivity is the value of code produced divided by the time spent to write it:

Productivity = Value / Time

So, there are two ways of increasing productivity:

  • Increase the value
  • Decrease the time spent to obtain it

The first point is non-trivial and can lead to an extremely long, full-of-abstract-conclusions discussion. What is value for a programmer? It’s not easy to say. You can read articles and books, work and code a lot but you probably won’t get a sole answer. In this post I’m going to deal with the second issue, giving you some practical examples about saving coding time and, as the title suggests, I’ll consider a specific technology that is C++ on Visual Studio (both 2010 and 2012).

One of the most common rumors about C++ is about poor productivity. I’ve heard tons of people saying that a C++ developer can’t be as fast as a C# or Java one, and that refactoring tools are quite helpless. I think this is true to all appearances, if one doesn’t go beyond its IDE or editor. I think productivity is about discipline. From reducing the mouse usage and applying loads of shortcuts, to studying/elaborating practices to be faster (not only about pure coding).

The first simple thing you can do is to use keyboard as much as possible and further. Why using three clicks when a combination of two keys suffices? Consider a trivial example: setting the start-up project in a solution. Suppose we have a huge solution with about a hundred projects, with some executables (the main program and several test projects). Why do we have to:

  • found the project to run (t1)
  • right-click on it (t2)
  • locate the “Set as a start-up project” menu item (t3)
  • click (t4)

when we rather could:

  • found the project to run (ts1)
  • left-click on it (ts2)
  • press ALT+S+S (ts3)

t1 and ts1 (“s” stands for “shortcut”) are equal, the same applies to t2 and ts2, but ts3 is dramatically faster that t3 (+ t4) because it requires no mental effort, no reading time and no mouse-movement-and-click. You just have to remember a shortcut and this will be a kind of automatic gesture if you do it a couple of times.

I’m sure you already use shortcuts, anyhow setting them in Visual Studio is a trifle: just click on Tools, then Options and then Keyboard in the Environment section, as follows:

Another shortcut I can’t live without regards the pending changes tab and the compare with latest version feature. (if you use TFS, you know them). Basically I press:

  • CTRL+ALT+Home to show the Pending changes tab
  • I move among pending files with Up and Down keys
  • I press CTRL+ALT+PageUp to enter in the compare-with-latest-version mode

This way I don’t need to take my hands off the keyboard, being faster (thanks Gigi for this!).

Other shortcuts you shouldn’t miss are about compilation, such as solution building, project building, compile single file (Visual Studio should have them by default). They are helpful because, when adding or changing things, it is generally good to do sort of incremental compilation, maybe starting from a single file (if it is new) and then building the entire solution (or project, if the changes are very localized). Other related tips (or practices, if you prefer) such as “run all tests” and “make incremental check-ins” can help a lot your productivity but they are part of another story.

So, shortcuts are valuable allies, aren’t they? Practice. Customize your environment. What kind of actions can you perform faster by using shortcuts? Comprehend and, eventually, change your development process.

Ok, these themes are universal and they always apply, regardless of language and editor/IDE. Now, I’ll spend some words on a specific Visual Studio extension that can help your productivity: Visual Assist X. A standard license costs less than 300$ and I think it’s worth having a copy.

This tool not only has some standard refactoring features such as Extract method and Create from usage, but also C++ specific aids such as Add include. It goes without saying that you might (and should) bind each action to a custom shortcut. I’ve measured I’ve been significantly faster since I’ve started making use of Visual Assist X. That’s because it lets you focus on coding rather than some non-core aspects such as what file must be included (even if sometimes it’s worth including by hand for advanced stuff) or declaring a member-function in the header file while you’re writing it in the cpp file. It’s cool.

Other Visual Assist’s gems are some how-is-it-possible-visual-studio-does-not-have-them, like:

  • quick find references – find usages of functions and classes (Shift+ALT+F by default)
  • quick open file in solution (Shift+ALT+O by default)
  • quick find symbols (Shift+ALT+S by default)
  • quick swith between header and source (ALT+O by default)
  • quick methods listing (ALT+M by default)

Convince your boss to buy it!

Last (but not least) pearl is about snippets (that are very common in this kind of tools – for example in Resharper for C# development) that is heavily useful (in C++ as well as in other languages). A snippet is just a shortcut that triggers a text (parameterizable) replacement.

For instance, on my configuration, if you write:

once and then you press TAB you’ll get:

#pragma once

With this simple snippet (triggered by cout followed by TAB):

cout << $end$ << endl;

You’ll  generate:

cout << -->cursorHere<-- << endl;

More complicated:

lam then TAB:

[$capture$] ($params$) { $end$ }

and a small dialog will appear asking for $capture$ and $params$ (possibly empty) and then creates a lambda expression replacing $capture$ and $params$:

And you’ll get:

[&takeThisByRef, aValue]() { -->cursorHere<-- }

Have fun with snippets and, as usual, create those you (really) need.

In this post I showed some simple tricks to increase your productivity coding in C++ on Visual Studio. These are futile if you don’t discipline yourself, if you don’t practice and if you don’t explore your IDE and its possibile extensions/plugins. For example, some people don’t know the possibility to vertical-select text in Visual Studio:

Do you?

Personally, I consider self-learning as a process. A process has to do with connected actions that transform inputs into outputs, nothing else. A quite underrated aspect is about choosing inputs and when to process them. This is what I define a plan. A plan is a written and sorted set of actions. Who writes it? At least a supervisor/manager, choose the appellative you like the most. Talking about self-learning you are the sole responsible for your plan and often the absence of a capable “scheduler” leads people to be adrift.

Making a plan is not simple. That’s because self-learning is freedom and freedom asks you to choose. You have to take into account desires, priorities, needs, limits. Realizing your limits is fundamental to go beyond and to improve yourself. Limits are valuable allies, what you knock down to reach your goals. But don’t be hasty, knowing your limits is important to make a plan.

Let’s forget abstract things for now, this blog is about experienced stories and practical things. The goal here is to show my personal approach to self-learning.

When I suggested you to gang with self-learning, I used to write things on sticky notes and whiteboard. Some time later I became aware  that a tool could help me. I have tried out lots of products dealing with “to-do lists” and I currently employ Toodledo (and it worth buying the pro version, just 10 €/year). Basically, it helps you to organize your tasks better than you can do with sticky notes! Since Toodledo supports GTD (a method for organizing tasks)  maybe I’ve taken my cue from it but I don’t know anything about it (I swear), so don’t keep on reading if you expect a discussion about GTD or another famous method.

Well, I use Toodledo in a pretty simple way and the most important steps follow below. First of all a bit of (my) terminology:

  • Task: clear doable action(example: “reading GotW#100 by Herb Sutter”);
  • Sub-tasks: syntactic sugar to express precedence and grouping among tasks;
  • Plan: written collection of tasks (sometime arranged in a timeline);
  • Folder: container of tasks (example: “Study”);
  • Context: category of task (example: “Posts”);
  • Location: physical place to do a task (example: “Home”);
  • Tag: property of a task (example: “C++”, “Sutter”);
  • Notebook: a container of notes (plain texts).

         

Raw Tasks in the Inbox

          —

As soon as I notice something interesting I make a task and put it in a special folder I made: the Inbox. This folder is like a buffer for “raw” tasks that have to be planned or rejected. A task shouldn’t stay in the Inbox for a long time. A task in the Inbox will be either:

  1. deleted,
  2. stored in the notebook (it remains a sort of raw task),
  3. enriched with meta-information (context, folder, tag, etc) and planned.

The Inbox is the single-point-of-access to the proper planning step.

          

Dealing with raw tasks

          

Toodledo allows you to choose defaults for new tasks, this makes it easier to create a raw task. You only need to set the default folder (Inbox):

Now you can use the quick-add-task functionality

and press enter:

Very fast and easy!

What about processing raw tasks? To answer you have to take into account your goals, priorities, time, etc.

Is the task really important? If no, delete it. Can be done? If no, delete it. Want you to collect more information about it? You can change it to a more specific task (next step) or you can make a note about it (it will be useful in the future, when the task will be more defined). Is it related to other tasks you’re working on? If yes, you can make it a subtask of another one. Etc.

You know your targets and you are the sole responsible of this kind of decisions. Choosing is hard, isn’t it?

          

Transforming raw tasks in achievable tasks

          —

This phase is really crucial. Here you have to enrich raw tasks with meta-information that make the task clearer and easy to understand. Things such as context and tag are quite simple, to find them you just have to categorize the action to do (e.g. “reading a Sutter’s book” for me is something like:  Context = Books; TAG = Sutter, C++).

What’s the deal with folders? That’s an interesting question. For me a folder is like a water flow, a stream. It’s something that couldn’t be stopped. This is why I don’t use the term “project”: a project is something that should be completed sooner or later. My current folders are:

If I wanted a coarser grane on (for example) Self-Learning stuff, I would split it in other folders. Now this is fine for me.

So what’s the difference between contexts and folders? I treat a context like a category. I repeat, this is fine for me, consider your way of studying and the tasks you want to complete. If you only read books, likely a context “Books” is useless.

Back to this step, tasks also need a handful of planning information, that (currently for me) are priority, due/start dates, status and location. When you decide these information you are developing the plan. This moment is definitely important and you should say no to seemingly tasty tasks. Considering the task T, a possible workflow:

  1. Is T really important? If yes go to step 3, if no go to step 2.
  2. Can you decide when to start/complete the task? If no then set Status = Someday and don’t care about other information (maybe choose a priority considering all the tasks). If yes then set Status = Planning, Due Date/Start Date = your choice, Location = your choice and set an adequate Priority.
  3. Can you do the task “now” – do you have free slot of time in a very near future? If yes then set Status = Active and set the other information. If your plan is “overflowing” then you might consider to “swap” an active task with T.

An important information I touched on is the location. Never underestimate all the physical places you can self-learn. Ideas: home, work, train, underground, bus-stop, etc. (different places probably correspond to different amount of available time). Like folders, you can refine locations. A tip: try to have at least one task for each location and if you want to put all your effort into doing a certain task in more than one location (e.g. home + train) then you could:

  • set a location and write in the notes section that you are also working on this task in another location, or
  • create a new location: Home & Train.
More information about status I employ:
  • None: used only for raw tasks;
  • Someday: not really planned, I’ll do it;
  • Planning: for me is like “planned”: I have decided when to do it, I have a start/due date;
  • Waiting: used when the task is waiting for another task (e.g. some videos to watch sequentially);
  • Active: I’m doing this task “now” (now = during the time I can spend to self-learn).

Finally, choosing among the combos will automagically “schedule” your task:

          

Breaking your plan

          —

You can think that a plan will stay the same until a task is completed or new raw tasks arrive in the inbox. Wrong. First, you have to periodically sum up your work, like a retrospective phase. What tasks have you completed? What about your long/short term goals? Are your priorities changed?

Second, it’s important to elect a sort of base of your plan. Time-based (your plan evolves in term of slots of time – “iterations”, if you feel at ease with this term), Task-based (specific tasks block the evolution of your plan), Goal-based (reaching goals is the driver, if a certain goal has a huge priority it can stop all the other tasks), etc. I like evolution and dynamism so I personally use a mixed mode: flexible amount of time (not fixed), goals and priorities drive my changes, I try to “break” my plan, doubting it.

I consider the last point precious: when you deal with learning, say at school, generally the teacher gives you a sort of feedback. Here, who is the teacher? You. Judging yourself is a way to have feedback. Good and bad results should be made evident.

Moreover, in addition to this retrospective phase, another key moment is when you look for new tasks and what drives this quest. Once again, choose your base and the answer will be plain.

          —

Beyond this post

          —

Here I have summarized the main concepts about my self-learning process (I have focused on the planning phase – choosing the inputs, remember?). I heartily recommend you to make your own, using a sort of task manager system (sticky notes suffice, but sometimes you may want more). Toodledo is cool and simple. I have just shown a tiny snapshot of this system and I suggest you to try it (the base account is free – I have a pro account because I uses subtasks and other little things). Views are one of the best reason to choose it – and the base version has got it!

Your plan should be literally blended into your life, this way you can go beyond a simple “studying a book” and the process of self-learning will be an important part of your habit.

I hope this post can be useful and remember that the trick is growing up without growing old!

Gang up with self-learning

Posted: December 1, 2011 in Seeds
Tags:

Apart from profit, one of the most obvious differences between university and working world is the concept of learning. When I was a student my job was exactly studying. I had to attend classes, pass exams and no more. These are the minimal requirements to be a student. Sure, I’ve always been curious, I’ve studied different things on my own, delving into what I found more interesting. I call this process self-learning (the correct term should be self-study but I prefer to make evident the process of learning, not just the act of studying). I also consider self-learning whatever one does on her own to improve her knowledge about some topics (for example, working on some projects or writing code to experience a library). I think that the job of a student is not complete without self-learning. To tell the truth, I think we can always learn, independently of what kind of  job we do.

What happens when one gets a degree and starts working?

Some people forget their origins, their basics. They leave learning behind  and don’t consider that they have all the means to improve their knowledge and proficiency.

Why?

Weariness? Lack of time?

Maybe, but often behind the time and the weariness lie the lack of will and the scarcity of interest. The habit of a guaranteed and steady job inhibits tons and tons of books, classes and notes studied few years before. I can’t believe that some people blow over just because they deem their “official” studies completed.

When I started working I got disorientated. What about studying?! Gee, I love studying and trying new technologies. Where is the time to do that?! Luckily my team is prone to training and we allocate (sorry for this term, just a professional bias!) slots of time for that. But what about other things I want to learn and (personal) projects I’d like to work on?

Self-learning is the answer. However I forget to remind another essential term without which it would be difficult to really learn: planning. You need a plan. You need to find time to learn. You require a sort of schedule.

One moment. Sorry, I’m unforgivable. I forget another fundamental thing without which it would be impossible to learn: will. If you don’t want to learn then give up and don’t waste time.

If you really feel like learning then keep in mind:

  • What to study and which level you want to reach (e.g. template metaprogramming master, guru of gardening, wizard of cooking, …);
  • Sources of knowledge you have (e.g. books, blogs, classes, …);
  • When you can study (e.g. in the underground going to work, in the shopping center while your wife is drying up your credit card, …);
  • When/Why re-schedule your learning plan (e.g. new C++ standard is out, you want to impress your collegues at speaking chinese, …).

Some tips/ideas if you want to learn something but you can’t decide what or you have too many topics in your list. Consider things that:

  • make you happy;
  • can increase your self-esteem;
  • can make a positive/good impact on your job;
  • can make a positive/good impact on other projects you’re working on;
  • can help you to decide among other things you planned (a sort of feasibility study);
  • can improve your proficiency at doing whatever important (job, social relations, …) you lack in;
  • you just can’t not think about;
  • are hard, if you need a challenge;
  • are little (e.g. a short blog post) or easy but their value can be big.

I said you need a plan. Maybe this is the hardest job to do. Try to analyze your days and find time. You can’t do a plan without time, it’s impossible. Everybody can find time, just if they really want to. Some examples from my life:

  • Officially, I start working at 9 AM. I go to work at 8.20-30 to study something.
  • Almost all week-ends I spend about 5 hours travelling by train. It’s not so bad reading books and writing code on board!
  • Generally during the week, I spend some time after 9 PM for projects or technical experiments/trials.
  • Some months ago, I went to work by underground and I was used to study every day during trips (about 40 minutes, in all).

You can think that the quality of study of some of these examples is very poor (noise, stress, discomfort, …). Indeed, I grasp these situations and I keep the quality high thanks to the habit and the practice. This is extremely common and I know a bunch of people that study in the most unusual circumstances! This improves attention span and sort of stress management skills.

How to make a plan? Good question. I just know I have one! I use sticky notes to group, for example, books, projects and technologies. I try to prioritize, by following, more or less, the guidelines I wrote above. If I find something interesting, I consider to schedule it. It’s important to have moments to evaluate what to change, add, eliminate and hold as done; furthermore, it’s basic to understand when to change priority to some elements.

Self-learning should be part of our life. Surely, we learn by working but other times we need to do it on our own. We have to be prepared to change our plan quickly, focusing on priorities and making the most of our time!

Don’t stop learning! Hold the interest!

It’s happened I got a degree on December 20th and I had not a mind to start looking for a job until the second week of January. That was because I wanted to wait for the end of the Christmas season. I thought “who knows how many emails this company will receive” and I wanted to wait for the time needed to read them.

During this time, I remembered what I heard from some people during a couple of seminars I attended: “be aware of your targets and dreams“. Actually, starting from November, I tried to write down these things, making them more concrete. It doesn’t seem to be important, but it’s really fundamental. The starting point of your career is yourself. Understanding who you are, what you want, what your targets are, etc, you must start from here.

Maybe you know all these things but you’ve never thought about them concretely. How many people are able to answer the simple question “what is your dream?” ? I don’t want to hear “to become a footballer“, in that case I expect something like “improving my shooting skill, running faster and playing in a soccer team“. I liked the latter answer because it told me about real and concrete targets. Things you can do now. This job of self-awareness is not simple. It is dynamic and evolutive. It can happen you need some middle steps to be conscious of your final targets, like a ladder is composed by some rungs. Find your rungs and you’ll find the end of the ladder.

You can call these rungs in several ways: values, targets, dreams, etc. A rung moves you and it’s important to make it evident in a CV (if it is proper).

This article is not focusing on self-awareness. If you are interested, I suggest you to read other papers or simply to try to think about yourself in a pragmatic manner. It will be a good exercise. Answer questions like “If I had a magic wand, what would I do?“, “What can I do now to feel closer to my dreams?“, “What makes me happy?“. Then, this is the begin of the story. This was the first thing I did to find a job and to write a good CV.

The second step was to write a base CV, that was such a general and nonspecific for a certain company. Write two models: a European CV (max 2 pages, follow the standard but customize it) and an American one (one page, very schematic). This article doesn’t cover how to write a good CV, then google for details. Remember to be short and clear, you should draw the attention to you when the recruiter reads your resume. Put a “firefly” in your CV, something the reader will certainly notice. These resumes are useful if a fast opportunity meets you (whenever you’re forced to send something quickly).

Then, you have a couple of resumes. And now? Now the game starts. You have to employ a “marketing strategy to find a job and to “sell” yourself in the job market. This plan is composed of five magical words you must keep in mind:

  • Market;
  • Product;
  • Price;
  • Place;
  • Promotion.

These terms depict your professional world in a marketing context. You must give a meaning to each one.

Let’s start from Market. The market is the area where you want to work in, the position you long for. Identify your market and narrow down your job area. If you have more areas of interest (for example, Videogames Industry, Scientific Computing, Software Engineering), then make a sort of “ranking“, following your feelings. This is important to be flexible.

You are the Product. You have to sell your values and your strong points. Why are you different from the others? Enrich your product and be aware of its limits. Figure out what products the companies of your market are looking for.

How does it cost your product? What is its Price? Your price is a mixture of several things: salary, benefits, work site (imagine you have to relocate to another city), work environment, company reputation, experience you are going to acquire, etc. When you negotiate a job, remember your price.

You have a priced product in a market. What else? Try to “physically” sell it in a Place. Identify job meeting areas, take part to exhibitions and subscribe to the most visited social networks (primarily LinkedIn – read the last section of this article for some useful tips about LinkedIn – Monster is another good website). Thanks to my complete and clear profile, I’ve received lots of job offers via LinkedIn and Monster. Get ready to meet your future boss wherever you go, maybe during the happy hour with your friends or while you are standing in a line to pay the electricity bill.

Finally, you must promote your product: Promotion. Now the game really begins. Identify target companies in your market and write a focused CV (and a cover letter) for each of them. Try to enrich your resume with specific strong points, dear to the company you are applying for. Remember what I said about the place. Do some networking, speak with people, create original business cards (for example, I drew a business card using a triangular mesh as a background, just for saying “this guy likes computer graphics, doesn’t he?“). The promotion is, maybe, the most difficult phase in your plan. Don’t give up if you don’t get any replications back.

If your market is really “closed”, you should consider the possibility to turn a little from it. If you really can’t wait for a job, you must be disposed to work in other markets. It can happen you have to reply to a job offer within some days (say 7 days) and this offer is good, however it’s not the job of your dreams. Suppose you haven’t received other “assured” job offers (assured = if you take that job, you’ll certainly work for that company). What to do? That’s a good question! If you are sure that you’ll receive other better offers (remember your price), then you can turn the offer down. Otherwise, listen to yourself and make your decision. A handful of factors should be considered:

  • Time you’ve been out of a job for – or time from your graduation day, if you are a new graduate (it’s important that you don’t have “big holes” in your CV: “what did you do last six months?” “I ascended Mount Everest” This is better than a hole and demonstrates your personality, but be careful!).
  • Money. Do you need money soon? If the answer is yes, you should work soon.
  • If you take the job, you’ll acquire experience, improving your CV. You can work for that company for some time (say, at least 3-6 months) and then (or meanwhile) look for a more interesting job (having more experience, so more choices to be hired).
  • How old are you? If you are a young (23-25) new graduate then you can “be wrong” a little (you should have time to adjust your aim and to fix a job-target), but don’t rest on your laurels! The first job can be your “stepping stone”. Bear in mind that a lot of companies do not open “junior” positions for over-30 people. This means that if you don’t have any experience and you are over 30, then the working world has bad news for you. But don’t be scared, I speak at second hand and I could be mistaken!

In sooth, there are a lot of other things you should mind, depending on your situation, your friends (maybe your best friend’s father works for an important company you are interested in), your family, etc.

Prior to reaching the conclusion of this section, I’d like to wrap up these things and write down a hypothetical step-by-step plan:

  1. Self-awareness: Who I am, What I want, etc. Be aware of yourself and your dreams.
  2. Write two generic resumes (using both European and American format).
  3. Think about your marketing plan, being exhaustive.
  4. Prepare a “back-up” marketing plan to use if you fail using the previous.
  5. Identify your target companies, obtain information about them and write focused resumes/cover letters.
  6. Apply for your first-choice companies.
  7. Take some time to wait for replies.
  8. If you don’t get replies back within 3-4 weeks, employ your back-up plan and apply for other companies.
  9. If you don’t get replies back within 2-3 weeks, keep on employing steps 4 and 8.
  10. Good luck!

By and large, steps 1-4 should not need more than 5-8 days. Complete quickly the steps 5 and 6 (at most 3-4 hours per company).

It can happen that you need some extra skills to apply for some companies, such as a language certification, evidences of your experience (for example, a technical demo of a project you worked on), etc. In this case you might take time (as well as money)  for acquiring these skills: it is an investment in yourself.

Remember that your personal projects are a good way to show your experience. Mention to them in your resume but don’t be too detailed; you can employ a blog or a professional website for this purpose. Be professional. It’s better not to show a demo than to show a bad demo.

When you apply for some companies, I heartily recommend you to write down a table/scheme with (at least) these information:

  • name of the company;
  • application date;
  • application “current state” (for example, “no positions available” or “interview on Feb 11th”);
  • application “story” (if you really want – I don’t have one);
  • other relevant information if you need any (website, people you met, etc).

You can use some desktop applications (like Sticky Notes) to have these information on hand, quickly.

The day of the interview

The first time I had a job interview I was oddly calm. I had an appointment at 10am and I knew the interview site was not too far from home, then I didn’t need to get up earlier than 8.30am to be on the safe side.

Mind where the place of the interview is, but don’t be maniac making a lot of inspections of it. Going there once suffices. It is important to arrive some minutes earlier, but not a lot.

Be aware of logistics problems: parking, delays of public transportation, traffic, etc. But I repeat: don’t be maniac! Sleeping in a tent down the office where you have the interview is not a perfect idea!

Keep in mind all the information you really need to know: the name of the person you’re about to meet, his/her telephone number (if provided), the exact address, etc.

Take care of your apparel and clothing. Generally, the best compromise is a “business casual” clothing, that is: jeans, shirt (a sober one), jacket, tie. But it depends on the company. If you find out the company has a “dress code” then you can follow it (not shamelessly, the recruiter does not want to look at himself/herself in the mirror!). Remember to dress with your style, your personality, because a recruiter will notice if you aren’t at ease. If you are meeting an “eccentric” company then you can think about a freakish apparel, trying to give an impression of your personality.

Another thing you should not forget is to know by heart your CV. If you wrote “Deep knowledge of ABC”, rest assure you really have a deep knowledge of ABC and remember what ABC is (if it is an acronym you wrote ten years ago, review it). Be sure you have no flaws in your CV (blatant typo, wrong information, etc) and don’t lie so much – you can bluff but moderately!

Finally you are face to face with your interviewer. Introduce yourself with an active voice and a strong handshake (don’t worry if your hand is wet because it is considered a quality of a man who works a lot! – be sure it is not too wet, drying it with your pants if you need to).

Bear in mind these are the questions he/she will answer to decide:

  • Can you do this job? Are you qualified? (skills, experience, etc)
  • Want you to do this job? (interest, proactiveness, etc)
  • Are you right for the job? (style, empathy, values, communication skills, etc)

You must convince the recruiter that:

  • You’ll be able to do the job;
  • You want to do the job (in that company);
  • You’ll familiarize with the others;
  • You don’t have personal constraints.

Initial questions are cognitive, such as “Tell me about yourself?“, “Why did you study …?“, “What are your merits?“, “What are your limits?“, etc. Try to answer shortly, making practical examples of your skills (for example, “I am very proficient at programming, in fact I wrote an operating system in two weeks. You can download it at …“). If you don’t have any examples, create one (at home – be prepared). Be credible. Refer to the university (who can verify and how?).

Give these tips a cursory glance:

  • Keep as calm as you can;
  • Pay attention to your gesticulation (more than 90% of the communication comes from the body);
  • Listen to the questions carefully;
  • Be clear and concise;
  • Don’t be too polite nor too friendly;
  • Keep a cooperative attitude;
  • Ask questions, be curious and proactive about the job, try to “buy” the job “selling yourself”;
  • Know what you want.
  • The best suggestion I feel to make is: be yourself.

It’s common to have positive signs if the recruiter:

  • protracts the interview (maybe he/she likes you);
  • asks “hard” questions;
  • makes another appointment with you;
  • describes a work situation and asks you how to act;
  • shows you the offices;
  • asks when you can start working;
  • introduces you to other members of the staff.

If you receive a job offer, don’t be hasty. Take your time. If the company is really interested in your profile, it should give you some time to decide. Claim a detailed job description, if it is possible. At home you can calmly think about the job, considering all the details. Bear in mind your marketing plan.

Generally, a company gives you 7-10 days to reach a decision. Do you know how many things can happen in that time? Another company you don’t expect gets in touch with you, other job positions are opened at the company you dream to work for, you win the lotto (or a meteorite falls on the Earth, more likely!), etc. If the company doesn’t give you some days, be careful and ask why. A reason can be that the company has done a fast recruitment process and if you have joined it then your decision has already been made.

LinkedIn tips

You know the Six degrees of separation theory, don’t you? It refers to the idea that everyone is on average approximately six steps away from any other person on Earth, so that a chain of, “a friend of a friend” statements can be made, on average, to connect any two people in six steps or fewer.

This theory is very important if you want to find a job. Why? The answer is “weak links“, aka “friends of friends“. Suppose you want to work for the company “X” and a friend of a friend of yours works there. You can try to get introduced to him through your friend, easing the recruitment process. Weak links also refer to connections you met once or twice in your life, for example on vacation or during a meeting. Keep in mind them if you are looking for a job.

Another thing you should remember: recruiters use social networks. I’ve heard of people screened out for the information posted on their profiles, smart recent graduates made a rod for their own back because they wrote a nasty comment about a company they applied for, etc. I assure: several companies I applied for viewed my profile.

The Web is a parallel world, if you are famous on the Web, likely you’re famous on the Earth! Take care of your digital identity. You are a brand and you should apply a marketing policy to yourself (as I wrote some lines above). How strong is your brand? Estimate it on www.onlineidcalculator.com and try to answer this question. Your online reputation (what the others say about you, on the Web) it’s important and you can make it grow, just writing on a blog or posting amazing videos on Youtube. Add these references on LinkedIn (there are some sections for that) and inform all your connections about your hobbies and professional articles.

The basic suggestion I make you is: write in English. You have more or less 2000 characters to write a sketch about yourself. Be clear, short but complete. Strive to cover your education, you dreams, your hobbies, etc. Link them in an experienced plot.

Employ all the sections you consider useful to enrich your profile (wordpress box, skills section, etc). Update your profile and make this evident (for example including a brief section “What’s going on” or “What I am doing now” to talk about your current occupation, projects, etc).

Here are other tips you can employ to improve your brand on LinkedIn (thanks to Irene Morrione for taking an awesome seminar about this topic):

1. Define a professional target (making your values unmistakable);
2. Create a strong-points-based profile, writing your uniqueness;
3. Let know you’re searching a job and what you’re looking for. Make this evident to your weak links;
4. Request recommendations (starting from your classmates);
5. Determine people having your background/skills: where they go and where they come from. Where are they demanded? Investigate!
6. Check the “new hires” section to figure out if a certain company is hiring and what profiles it is interested in;
7. Get through to the manager (or HR, etc) via weak links. How many degrees are you far from the top manager? Are you daring and want you to get in touch with him? Well, intrigue him. Highlight your strong points and make evident why you’re different by the others. Mind to interact depending on the content;
8. Identify the secret requirements of an announcement. Search the Web to acquire more information about the company, hear for words of mouth, etc. If you can, you should act like a “social engineer” (but don’t steal any information!). You’ll be able to make focused applications;
9. Look for startups;
10. Dare. You’ve got nothing to lose!

This brief article roughly discusses some tips to find a job and to prepare yourself for being interviewed. All the information I wrote become from my little experience, a handful of seminars I attended and some papers I read. If you search the Web, you’ll find a lot of detailed guides about these topics. Find and try to ask the typical questions of a job interview and remember to write a killer CV! The first impression is the most important. Keep in mind which company you are going to apply for, its core business, etc.

Luck doesn’t exist. There is only the moment when talent meets opportunity” –  Seneca

Hello everybody!

Posted: January 11, 2011 in Seeds

Hello everybody! I’ve just signed up! See the About section for more info!