How to prepare an interview

Avatar

In the consulting world, there are multiple types of interviews : Business, HR, Technical, Team, when the Consultant meets a Client. During the following weeks, I’ll post return of experiences on the way to prepare an interview and the method I use to prepare my consultants and candidates.

The standard canvas of an interview are the followings :

  1. Presentation of meeting participants
  2. Presentation of the project/position [by the client]
  3. Presentation of the candidate’s relevant experiences
  4. Soft skills & technical skills questions
  5. Q&A (also from the candidate)
  6. Motivations of the candidate and closure of the meeting
  7. Post interview debriefing & motivations
  8. Decision & communication

I’ll focus my first article on the first part, the presentation of the candidate.

Regarding the 1st point – Presentation of the participants -, the candidate must have prepared a short presentation in 2-3 sentences to give the highlight overview of his competences, a.k.a an “Elevator Pitch”.

Regarding the 3rd Point,- Presentation of the candidate’s relevant experiences –, I’d like to highlight the word “Relevant”. Indeed, for senior people, all professional experiences are not relevant for the targeted position. Three main experiences would be sufficient but the Client might ask more information later on. The presentation of each experience should be limited to 5 minutes detailing a short context, mainly what you have done in this project and what were the achievements and lessons learnt. For technical profiles, using a set of relevant keywords in the targeted domain demonstrates an asset in the domain. Be careful, for each keyword, you should be able to give an example of the application during your experience.

Olivier Blerot, Director

 

Facebooktwittergoogle_plusmail

JAVA 9 – Les streams et leurs équivalents en SQL

Avatar

Si comme moi vous connaissez le Java de la vieille école et que vous n’êtes pas encore expert avec les changements de la version 8,
je vous propose de voir ensemble les avantages de la librairie des Stream.
Les stream permettent de parcourir, filtrer, manipuler et transformer des données. Un peu comme avec SQL.

Dans cette article, je vais faire le parallèle entre les utilisations des stream et leurs équivalents SQL.

C’est parti !

Dans nos exemples nous utiliserons une liste contenant des données sur des personnes.
Elle contient des informations sur leurs poids, leurs tailles, etc.
tableSQL
listeJava

1. Parcourir les données

On commence par la base, comment parcourir et afficher les données :
En Java :
Stream<Personne> sp = listeJava.stream();
sp.forEach(System.out::println);

! en Java, une fois le stream parcouru il est détruit. Il faudra le recréer pour afficher la liste à nouveau.

En SQL on ferait le classique :
SELECT * FROM tableSQL

2. Filtrer les données

Imaginons qu’on veuille filtrer les personnes de plus de 50 kg.
En Java :
sp = listeJava.stream();
sp.filter(x -> x.getPoids() > 50)
.forEach(System.out::println);

En SQL :
SELECT * FROM tableSQL WHERE poids > 50

3. L’opérateur Map

L’operation map en Java permet de récupérer uniquement ce dont on a besoin :
Dans notre cas on veut seulement afficher le poids.
sp = listeJava.stream();
sp.filter(x -> x.getPoids() > 50)
.map(x -> x.getPoids())
.forEach(System.out::println);

En SQL, il suffit de mentionner la colonne dans le SELECT :
SELECT poids FROM tableSQL WHERE poids > 50

4. Compter les données

Sans surprise, on utilise l’opérateur Count.
En Java :
sp = listeJava.stream();
long count = sp.filter(x -> x.getPoids() > 50)
.map(x -> x.getPoids())
.count();

En SQL :
SELECT COUNT(*) FROM tableSQL WHERE poids > 50

5. Sommer des résultats

Et si nous avions besoin de sommer les poids des personnes de plus de 50 kg ?

En Java il faut utiliser l’opérateur Reduce:

sp = listeJava.stream();
Double sum = sp.filter(x -> x.getPoids() > 50)
.map(x -> x.getPoids())
.reduce(0.0d, (x,y) -> x+y);
System.out.println(sum);

En SQL c’est l’opérateur SUM :
SELECT SUM(poids) FROM tableSQL WHERE poids > 50

6. Créer une nouvelle banque de donnés

L’opérateur Collect permet de créer une nouvelle liste en Java :
sp = listeJava.stream();
List<Double> ld = sp.filter(x -> x.getPoids() > 50)
.map(x -> x.getPoids())
.collect(Collectors.toList());
System.out.println(ld);

L’équivalent SQL est la fonction CREATE TABLE. C’est une fonction plus compliquée qui demande le détail de chaque colonne et type de donnée,
je ne vais pas la détailler ici.

Voila c’est déjà terminé !
Nous avons pu voir la puissance des stream rien que sur les fonctions de base,
et réviser notre SQL par la même occasion 😉

Pour aller plus loin, je vous donne rendez-vous sur open classroom :
https://openclassrooms.com/fr/courses/26832-apprenez-a-programmer-en-java/5013326-manipulez-vos-donnees-avec-les-streams

Facebooktwittergoogle_plusmail

Tech-talk en partenariat avec Tredzone : Modèle Actor, Programmation adaptée aux CPUs multi-core

Laura NATAF
TREDZONE X OSSIA
Jeudi dernier, Ossia Conseil et Tredzone ont invité plusieurs consultants et intervenants à venir échanger lors d’un Tech-Talk : « Modèle Actor, Programmation adaptée aux CPUs multi-core »
image.png
Pour rappel, TREDZONE est une Start-Up qui a développé le projet open-source SimplX, framework réactif dédié à la programmation parallèle sur une architecture multi-core.
SimplX est destiné aux systèmes critiques : matching d’ordres, connectivité de marché, traitement massif de données et systèmes complexes à performance prédictible.
Facebooktwittergoogle_plusmail

Chat Live Ossia Conseil par JobTeaser

Laura NATAF

Jobteaser X ossia

La semaine dernière, nos deux consultants Yusuf et Laurent, ont répondu à toutes vos questions lors du chat live @JobTeaser ! Le sujet : recruter des développeurs juniors en Java et .Net

A revoir en cliquant sur ce lien ci-dessous

https://www.jobteaser.com/fr/companies/ossia-conseil/newsfeed/recruitment-24622?fbclid=IwAR1vwa5CJMbOcnrPNjyCz9TpzZ6Y2iMefEzW8u_yhL2ghL13MHAZkyPoYL0

 

Facebooktwittergoogle_plusmail

Apprendre la programmation RxJS, avec Hackages

Laura NATAF

Hello à tous,

Nous allons passer la soirée à travailler avec RxJS. Nous proposons une session de HackJam sur la programmation réactive avec RxJS et nous avons invité Hackages et tous les intervenants à venir interagir au sein de nos locaux.

 

RxJS

Facebooktwittergoogle_plusmail

La Ossia Team à la #ColorRun by Sephora

Laura NATAF

#newsossia

La Team Ossia était présente ce dimanche dernier à la #ColorRun by SEPHORA !

Bravo à tous les « runers », vous nous avez rempli de couleur et de bonne humeur ! Cette première expérience fut un franc succès et a permis de prouver que l’esprit d’équipe était bien au rendez-vous :)

A l’année prochaine, et en attendant on vous prépare bien d’autres surprises !

WhatsApp Image 2018-04-15 at 21.27.58 WhatsApp Image 2018-04-15 at 21.27.57 WhatsApp Image 2018-04-15 at 21.27.56 (1) - copie WhatsApp Image 2018-04-15 at 21.31.27 - copie

Facebooktwittergoogle_plusmail

Youssef à la rencontre des giraffes

Laura NATAF

Nos consultants autour du monde… Quoi de mieux que des petites photos pour nous faire partager leurs voyages ?

Du côté de Youssef, la rencontre des giraffes a été une expérience exceptionnelle.

Merci de nous l’avoir faite partagée :)

 

image2 image1

 

 

Facebooktwittergoogle_plusmail

Les nouveautés Microsoft C# 7.0

Jerome

Cette nouvelle version Microsoft de C# accompagne la sortie Visual Studio 2017. Les changements semblent minimes comparé au C#6.0 mais cette version améliore l’écriture du code et les performances.

Les nouvelles fonctionnalités au langage sont :

1.    Variables out

La syntaxe existante qui prend en charge les paramètres out a été améliorée dans cette version. Il n’est plus nécessaire de déclarer la variable en amont. :

Avant:

int numericResult;

if (int.TryParse(input, out numericResult))

WriteLine(numericResult);

Après:

if (int.TryParse(input, out int result))

WriteLine(result).

2.    Tuples

Il est désormais possible de créer des types légers et sans noms qui contiennent plusieurs champs publics sans avoir à utiliser les structures de données suivantes :

  • un tableau ou une liste ;
  • des paramètres out ;
  • la classe Tuple<…> existe depuis C# 4.0 ;
  • une classe spécifique pour représenter les résultats de la fonction.

Voici un exemple ecrit en C# 6.0:

public void Main()

{

var customer = GetCustomer();

int id = customer.Item1;

string firstname = customer.Item2;

string lastname = customer.Item3;

}

private Tuple<int, string, string> GetCustomer()

{

return new Tuple<int, string,= » » string= » »>(1, « John », « Doe »);

}

Avec C# 7.0, la méthode GetCustomer() devient:

private (int, string, string) GetCustomer()

{

return (1, « John », « Doe »);

}

Au lieu d’utiliser .Item1, .Item2 nous pouvons nommer les propriétés du tuple:

public void Main()

{

var customer = GetCustomer2();

int id = customer.Id;

string firstname = customer. Firstname;

string lastname = customer. Lastname;

}

private (int Id, string Firstname, string Lastname) GetCustomer2()

{

return (1, « John », « Doe »);

}

en décomposant le tuple directement en variables nous obtenons:

var (id, firstname, lastname) = GetCustomer();

 Par exemple, pour échanger les valeurs de deux variables, l’écriture devient triviale car nous n’avons plus besoin de variables intermédiaires :

(x, y) = (y, x).

3.    Éléments ignorés

Par exemple lors de la déconstruction d’un tuple, seul les variables nommées seront assignées:

var (_, _, _, pop1, _, pop2) = QueryCityDataForYears(« New York City », 1960, 2010).

4.    Critères spéciaux

L’expression is étend l’opérateur is classique pour interroger un objet au-delà de son type. Dans notre exemple nous utilisons le « switch » mais fonctionne également avec le « if statement » :

public static int DiceSum(IEnumerable <object> values}

{

var sum = 0;

foreach (var item in values)

{

switch (item)

{

case 0:

break;

case int val:

sum += val;

break;

case IEnumerable<object> subList when subList.Any():

sum += DiceSum(subList);

break;

case IEnumerable<object> subList:

break;

case null:

break;

default:

throw new InvalidOperationException(« unknown item type »);

}

return sum;

}

5.    Variables locales et retours ref

Les arguments et les variables locales de méthode peuvent être des références à un autre stockage.

public static ref int Find(int[,] matrix, Func<int, bool= » »> predicate)

{

for (int i = 0; i < matrix.GetLength(0); i++)

for (int j = 0; j < matrix.GetLength(1); j++)

if (predicate(matrix[i, j]))

return ref matrix[i, j];

throw new InvalidOperationException(« Not found »);

}

Maintenant que la méthode retourne une référence à la valeur entière dans la matrice, vous devez modifier l’emplacement où elle est appelée. La déclaration var signifie que valItem est une référence vers un int :

var valItem = MatrixSearch.Find3(matrix, (val) => val == 42);

Console.WriteLine(valItem);

valItem = 24;

Console.WriteLine(matrix[4, 2]).

6.    Fonctions locales

Les fonctions locales permettent de déclarer des méthodes à l’intérieur d’une autre méthode. Il existe deux cas d’utilisation très courants pour les fonctions locales : les méthodes iterator publiques et les méthodes async publiques.

public static IEnumerable AlphabetSubset(char start, char end)

{

if (end <= start)

throw new ArgumentException($ »{nameof(end)} must be greater than {nameof(start)} »);

return alphabetSubsetImplementation();

IEnumerable<char> alphabetSubsetImplementation()

{

for (var c = start; c < end; c++)

yield return c;

}

}

public Task<string> PerformLongRunningWork(string address, int index, string name)

{

return longRunningWorkImplementation();

async Task<string> longRunningWorkImplementation()

{

var interimResult = await FirstWork(address);

var secondResult = await SecondStep(index, name);

return $ »The results are {interimResult} and {secondResult}. Enjoy. »;

}

}

7.    Autres membres expression-bodied

C# 6 a introduit les membres expression-bodied pour les fonctions membres, ainsi que des propriétés en lecture seule.

C#7 développe les membres autorisés pouvant être implémentés comme expressions. C’est-à-dire implémenter des constructeurs, des finaliseurs ainsi que des accesseurs get et set sur des propriétés et des indexeurs.

// Expression-bodied constructor

public ExpressionMembersExample(string label) => this.Label = label;

// Expression-bodied finalizer

~ExpressionMembersExample() => Console.Error.WriteLine(« Finalized! »);

private string label;

// Expression-bodied get / set accessors.

public string Label

{

get => label;

set => this.label = value ?? « Default label »;

}

8.    Expressions throw

Cette version permet de lever des exceptions dans les constructions de code qui n’étaient pas autorisées auparavant, car throw était une instruction.

public string Name

{

get => name;

set => name = value ??

throw new ArgumentNullException(paramName: nameof(value), message: « New name must not be null »);

}

Cette fonctionnalité permet d’utiliser des expressions throw dans des expressions d’initialisation :

private ConfigResource loadedConfig = LoadConfigResourceOrDefault() ??

throw new InvalidOperationException(« Could not load config »);

Auparavant, ces initialisations devaient se trouver dans un constructeur, avec les instructions throw dans le corps du constructeur :

public ApplicationOptions()

{

loadedConfig = LoadConfigResourceOrDefault();

if (loadedConfig == null)

throw new InvalidOperationException(« Could not load config »);

}

9.    Types de retour async généralisés

Les méthodes déclarées avec le modificateur async peuvent retourner d’autres types en plus de Task et de Task<T>.

public ValueTask<int> CachedFunc()

{

return (cache) ? new ValueTask(cacheResult) : new ValueTask(LoadCache());

}

private bool cache = false;

private int cacheResult;

private async Task LoadCache()

{

// simulate async work:

await Task.Delay(100);

cacheResult = 100;

cache = true;

return cacheResult;

}

10.    Améliorations de la syntaxe littérale numérique

De nouveaux jetons améliorent la lisibilité des constantes numériques. Le séparateur de chiffres peut apparaître n’importe où dans la constante. Pour les nombres de base 10, il arrive fréquemment qu’il soit utilisé comme séparateur des milliers. Il est possible d’utiliser le séparateur de chiffres également avec les types decimal, float et double :

public const long BillionsAndBillions = 100_000_000_000;

public const double AvogadroConstant = 6.022_140_857_747_474e23;

public const decimal GoldenRatio = 1.618_033_988_749_894_848_204_586_834_365_638_117_720_309_179M.

Facebooktwittergoogle_plusmail