論理的思考について

論理的思考ができないとまともなシステムにならないので、SEの採用は技術知識だけでなく、論理思考力も見なければいけません。

でも、限られた面接時間でそこを見抜くのは難しいですね。以前は、論理パズルの問題を出したりしていたこともあります。

「常に真実を言うナザレ人と、常に嘘をつくクレタ人がいる。ナザレ人かクレタ人か、どう質問したらわかりますか?」とかいう感じのやつです。

だけど、グループ会社も含めると面接がしょっちゅうある。とても自分だけでは時間がなくて、各部署の担当者に任せることにしました。

本当に大丈夫か、隠れた逸材を見逃してはいまいか、気にはなるものの、任せた以上は口出ししてはいけません。

ただ、システムエンジニアについては、論理的思考ができるかどうかを面接で必ず確認して欲しいということだけは念を押しました。

ある時、担当者が面接している部屋の横を通りかかると、中から声が聞こえてきました。

「あなたは、論理的思考ができますか?」

「はい、できます」

「なるほど、わかりました」

あまりに高度な論理問題を出しているようだったので、今はまた、私が面接するようになりました。

using System;
using System.Linq;

enum TruthValue { True, False, Unknown }

abstract record Person;
record Cretan       : Person;
record Nazarene     : Person;
record Indeterminate: Person;

static class PersonLogic
{
    public static bool Says(this Person p, bool claim) =>
        p switch
        {
            Cretan   => !claim,
            Nazarene =>  claim,
            _        => throw new InvalidOperationException()
        };
}

class Program
{
    static void Main()
    {
        bool claim = PromptClaim();
        var domain = new Person[] { new Cretan(), new Nazarene() };
        var values = domain
            .Select(p => p.Says(claim) ? TruthValue.True : TruthValue.False)
            .ToArray();

        var final = values.All(v => v == TruthValue.True)
            ? TruthValue.True
            : values.All(v => v == TruthValue.False)
                ? TruthValue.False
                : TruthValue.Unknown;

        Person identity = final switch
        {
            TruthValue.True    => new Cretan(),
            TruthValue.False   => new Nazarene(),
            TruthValue.Unknown => new Indeterminate(),
            _                   => throw new InvalidOperationException()
        };

        string text = identity switch
        {
            Cretan _       => "クレタ人です",
            Nazarene _     => "ナザレ人です",
            Indeterminate _=> "どちらかわかりません",
            _               => throw new InvalidOperationException()
        };

        Console.WriteLine($"n→ 判定: {text}");
    }

    static bool PromptClaim()
    {
        while (true)
        {
            Console.Write("『あなたはクレタ人ですか?(y/n)』: ");
            var i = Console.ReadLine()?.Trim().ToLower();
            if (i == "y") return true;
            if (i == "n") return false;
            Console.WriteLine("→ 無効な入力です。y または n を入力してください。");
        }
    }
}

Contact us

BACK TO TOP