5 Stimmen

Ist Bit-Drehen ein guter Test für Embedded Engineer

Ich befrage Kandidaten für eingebettete Software-Ingenieure (in unserem Unternehmen verwenden wir hauptsächlich C, manchmal C++). In der Regel stelle ich dem Kandidaten eine etwas knifflige Frage. Ich erwähne nicht, dass sie mit Bit-Twiddling gelöst werden kann, wenn es nicht offensichtlich ist. Ich akzeptiere auch Lösungen ohne Bit-Operationen, aber dann führe ich den Kandidaten in Bits ein (z. B. indem ich sage: "Was ist, wenn Sie den Modulo-Operator nicht verwenden können"). Die Beispielfrage könnte lauten:

  • Prüfen, ob eine Zahl durch 2 teilbar und nicht durch 4 teilbar ist
  • eine Zahl auf die nächste 2er-Potenz aufrunden
  • gesetzte Bits in einem Wort zählen
  • das älteste gesetzte Bit in einem Wort finden
  • usw.

Meiner Meinung nach sollten solche Fragen von jedem anständigen Software-Ingenieur (oder sogar einem frischen Absolventen) innerhalb einer Minute gelöst werden können, unabhängig davon, in welchem Software-Bereich er arbeitet. Mein Chef hat sich jedoch kürzlich beschwert, dass diese Fragen für jemanden, der z.B. im Bereich GUI arbeiten wird, zu anspruchslos sind. Es kam zu der Situation, dass meine Fragen nutzlos waren, weil mein Chef einen Kandidaten einstellte, der in diesem Bereich völlig versagte, aber behauptete, er habe Erfahrung mit Qt (ich konnte das nicht überprüfen, da ich Qt nie benutzt habe und aus irgendeinem Grund war ich der einzige, der ihn zu diesem Zeitpunkt interviewen konnte).

Meine Frage lautet also: Ist die Frage nach dem Bit-Drehen für jeden (eingebetteten) Software-Ingenieur geeignet, oder hat mein Chef recht und ich sollte es aufgeben, diese Frage allen Bewerbern zu stellen?

1 Stimmen

Was bedeutet "ältestes" Bit gesetzt? Das habe ich noch nie gehört.

0 Stimmen

Mit "ältestes" meine ich den Index des höchstwertigen Bits, das gesetzt ist, z. B. in 00101110 wäre es 6 oder 7, je nachdem, ob das LSB durch 0 oder 1 indiziert ist

1 Stimmen

@Ashelly, das ist wahrscheinlich ein sprachspezifisches Problem. Im Polnischen zum Beispiel heißt das höchstwertige Bit "najstarszy bit", was übersetzt "das älteste Bit" bedeutet.

2voto

Steve Jessop Punkte 264569

Ich denke, man sollte darauf achten, dass man nicht nach Kenntnissen fragt, bei denen es im Grunde zufällig ist, ob der Befragte sie zur Hand hat oder nicht. Bei Ihren Beispielen fällt mir auf Anhieb nicht ein, wie die Hacks für die Fragen nach dem wichtigsten Bit lauten (Finden des Bits und Aufrunden auf die nächste Zweierpotenz). Ich weiß, dass es Hacks gibt, die ich nachschlagen könnte, und ich weiß von __builtin_clz auf GCC, der natürlich nicht portabel ist.

Habe ich das Vorstellungsgespräch also nicht bestanden? Und wenn ja, sind Sie sicher, dass ich nicht geeignet bin, um in Ihrem Unternehmen Qt zu programmieren? Sie implementieren einen Filter, und Sie müssen nur an die Falsch-Positiv-Rate (wie viele Leute kennen die Bit-Twiddles, sind aber schlechte Mitarbeiter) und die Falsch-Negativ-Rate (wie viele gute Mitarbeiter haben die Bit-Twiddles vergessen) denken.

Natürlich gibt es bei allen Befragungen eine Falsch-Negativ-Rate. Die Kosten, die Ihrem Unternehmen durch die Einstellung eines schlechten Mitarbeiters entstehen, sind ziemlich hoch, also müssen Sie sicher sein. Aus diesem Grund denke ich, dass, wenn sich dieser Mitarbeiter als gut herausstellt, das wahrscheinlich mehr Glück als Urteilsvermögen seitens Ihres Unternehmens ist - Sie sollten niemanden als Qt-Programmierer einstellen, ohne seine Fähigkeiten mit Qt oder etwas Ähnlichem zu testen. Wie hoch sind die Kosten für ein zweites Gespräch mit jedem der drei besten Kandidaten, das von einem Ihrer Qt-Mitarbeiter geführt wird, im Vergleich zum Wert der Einstellung des besten Kandidaten? Wie hoch sind die Kosten für die Zeit, die Sie für das Gespräch mit den Kandidaten aufwenden müssen, da dieses Gespräch keinen Einfluss auf die Einstellungsentscheidung hat?

Denken Sie daran, dass verschiedene Arten von Programmierern über unterschiedliche Kenntnisse verfügen, und stellen Sie sicher, dass Ihre Fragen in engem Zusammenhang mit der Art von Programmierer stehen, die Sie suchen. In diesem speziellen Fall beweist es, dass der Befragte Zeit damit verbracht hat, Bit-Twittering zu betreiben, möglicherweise in der jüngeren Vergangenheit. Auf der positiven Seite ist das Zeit, die sie mit Programmieren verbracht haben. Auf der Minusseite ist das Zeit, die sie nicht damit verbracht haben, Qt zu schreiben und zu lernen.

Ich wäre besorgt, wenn jemand nicht wüsste, wie man den lsb prüft, und nicht wüsste, dass der lsb für positive Werte und für negative Werte im 2er-Komplement 1 für ungerade Zahlen und 0 für gerade Zahlen ist. Das liegt daran, dass ich von Programmierern erwarte, dass sie wissen, was eine binäre Darstellung ist. Ich wäre auch besorgt, wenn jemand denken würde, dass x & 1 in irgendeiner Weise besser sein dürfte als x % 2 weil es bedeutet, dass sie einen schrecklichen Compiler benutzen ;-)

Ich wäre nicht allzu beunruhigt, wenn sich jemand das Bit-Twiddle für popcount nicht merken könnte. Etwas mehr, wenn sie den Code dafür nicht herausfinden könnten, nachdem du ihnen einen starken Hinweis auf eine der einfacheren Möglichkeiten gegeben hast: "Wie kann ich den Popcount einer 2-Bit-Ganzzahl mit Bit-Twiddling berechnen? OK, jetzt schreibe eine Zeile, die das parallel für jedes der oberen und unteren 2 Bits einer 4-Bit-Ganzzahl macht. OK, jetzt schreibe einen 32-Bit-Popcount".

0 Stimmen

Der Punkt ist, dass ich nie nach irgendwelchen Hacks frage, die man nicht mit Binärschreibweise und bitweisen Operatoren (die jeder C/C++-Programmierer kennen sollte) herausfinden könnte. Ich frage nie nach Tricks, die man auswendig lernen muss. Ich weiß nur, dass die meisten Leute solche Fragen nicht erwarten, und das ist ein guter Test, um ihre Kreativität zu testen. In Anbetracht Ihres Rufs wäre ich also sehr verwirrt, wenn Sie nicht innerhalb einer Minute die (nicht unbedingt effizienteste) Antwort auf meine MSB-Frage finden würden (aber wahrscheinlich würde ich mich trotzdem dafür entscheiden, Sie einzustellen :-) )

0 Stimmen

@KasigiYabu: Das hängt zum Teil davon ab, was Sie als Antwort auf eine Frage akzeptieren - ich würde nicht innerhalb einer Minute eine effiziente verzweigungslose Lösung finden. Aber ich akzeptiere, dass bei jedem Vorstellungsgespräch die Chance besteht, zu Unrecht abgelehnt zu werden. Das liegt in der Natur der Sache, wenn man versucht, 10 Jahre unterschiedlicher Erfahrung in ein oder zwei Stunden zu bewerten, und was für den einen offensichtlich ist, ist es nicht unbedingt für einen anderen oder an einem anderen Tag. Ich habe nicht viel Zeit mit Bitkombinationen und euklidischer Geometrie verbracht und finde mich daher nicht so schnell zurecht, aber ich habe trotzdem einen erstklassigen Abschluss in Mathematik und einen Job in der Programmierung...

0 Stimmen

Allerdings kann es sein, dass ich davon ausgehe, dass Weg zu hohe Anforderungen an das, was Sie akzeptieren würden. Wenn Sie für die Popcount zufrieden wären mit int popcount(unsigned int x) { int count = 0; while (x != 0) { if (x & 1) ++count; x = x >> 1; } return count; } dann habe ich wohl aneinander vorbeigeredet!

1voto

Sjoerd Punkte 71416

Wenn Sie in C programmieren, würde ich sagen, ja. Bit-Drehen ist nichts Alltägliches, aber etwas, das zeigt, dass Sie verstehen, wie der Computer Ihre Daten verarbeitet.

Wenn Sie in einer höheren Sprache programmieren, ist das wohl weniger wichtig.

1voto

stijn Punkte 32935

Für einen eingebetteten Ingenieur oder einen Softwareentwickler, der mit spezieller Hardware usw. zu tun hat, sind diese Fragen gut geeignet. Es ist wahrscheinlich, dass sie dann Code schreiben müssen, der mit Bits herumspielt. Ich bin mir allerdings nicht sicher, ob dies innerhalb von genau 1 Minute gelöst werden kann, vor allem dann nicht, wenn der betreffende Ingenieur dies auf generische Weise tun möchte.

1voto

Andrey Atapin Punkte 7280

Ich bin der Meinung, dass jeder Elektronik- und/oder Software-Ingenieur diese Dinge wissen muss. Dies sind die Grundlagen der digitalen Datenverarbeitung und der Computerprogrammierung.

1 Stimmen

Meine auch, deshalb habe ich jedem Kandidaten diese Fragen gestellt. Außerdem gibt es in der Regel mehr als eine gute Antwort auf die Frage, so dass ich die Fähigkeit des "kreativen Denkens" (oder deren Fehlen) überprüfen kann...

0voto

Dmitri Punkte 8920

Ich denke, das hängt davon ab, an welchen Arten von eingebetteten Systemen sie arbeiten werden und was sie damit tun werden; "eingebettet" deckt ein sehr breites Spektrum an Hardware ab. Wenn sie Low-Level-Code schreiben oder mit kleinen Mikrocontrollern arbeiten müssen, sind Dinge wie Bit-Twiddling wichtiger als bei Code auf höherer Ebene für etwas Größeres wie einen PC-kompatiblen SBC.

Aber auch wenn Sie ein leistungsfähigeres System verwenden und keinen Low-Level-Code schreiben, ist es wichtig, dass Sie etwas mit bitweisen Operationen vertraut sein - zumindest genug, um mit Bit-Flags und ähnlichem umzugehen (ein Minimum).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X