Testen des Whiteboards während eines Interviews: Ein legitimer Weg, um Ihren (Whiteboard-) Code zu sichern? [geschlossen]


15

So wie ich es sehe, kostet ein Fehler (sogar ein Tippfehler oder ein fehlendes ";") in Ihrem Whiteboard-Code Sie oft einige Interviewpunkte. Wenn Sie dies vermeiden, wird zwangsläufig immer wieder ein Korrekturcode erstellt (Zeitverlust und möglicherweise neuronale Energie / Konzentration) oder sogar ein einfacherer (und damit weniger effektiver) Algorithmus verwendet - und beide Methoden sind wieder "kostspielig"!

Warum also nicht einfach schnell Code so elegant und effektiv schreiben, als stünde Ihnen ein (Unit-) Test-Framework zur Verfügung, und diesen dann ganz normal (nur auf dem Whiteboard) testen?

Hat jemand diesen Ansatz ausprobiert / gesehen? Ist die ganze Idee wert?

[das gilt natürlich auch für den Stift-Papier-Koffer]


23
Wenn ich möchte, dass jemand während eines Interviews Code auf ein Whiteboard oder Papier schreibt, würde ich nicht erwarten, dass er zu 100% syntaktisch korrekt ist - das setzt ihn zu sehr unter Druck. Ja, es sollte im Großen und Ganzen korrekt sein, aber das Fehlen von Semikolons oder sogar das leichte Fehlen eines Methodennamens / Parameterprofils ist in Ordnung (oder sollte es sein).
ChrisF

17
Ich bin ein großer Fan von Whiteboard-Codierung in Interviews, aber wer erwartet, dass Ihr Whiteboard-Code syntaktisch perfekt ist, tut es falsch. Der Punkt ist, zu sehen, wie Sie ein Problem angreifen, und nicht, dass Sie syntaktisch perfekten Code in einer völlig unrealistischen Umgebung erzeugen können.
Tim Goodman

3
Sie sollten in der Lage sein, herauszufinden, welches die richtige ist, indem Sie sie auffordern, einen laufenden Kommentar zu ihrer Arbeit abzugeben oder die Lösung mit ihnen zu besprechen, nachdem sie fertig sind.
ChrisF

6
Übermäßige Sorge um die exakte Syntax und Rechtschreibung kostet die Interviewerpunkte in meinem Buch.
JeffO

2
Das ist Pseudocode für
jk.

Antworten:


49

Ich möchte unbedingt, dass Sie den Whiteboard-Code testen, den Sie schreiben sollen. Ich möchte, dass Sie laut sprechen, während Sie es schreiben, es durchsehen, die meisten von Ihnen begangenen Syntaxfehler erkennen und darauf hinweisen, wie es effizienter sein könnte. Tatsächlich ist das der Grund, warum man es am Whiteboard macht. Es ist keine One-Shot-Write-it-All-Out-Sache. Es ist eine Unterhaltung, die durch Code vermittelt wird und nicht über meinen Schreibtisch, sondern am Whiteboard stattfindet.

Hier sind einige gute Möglichkeiten, um den "Whiteboard-Codierungstest" nicht zu bestehen:

  • Lehn es ab
  • Stellen Sie keine einzige klärende Frage (Sprache, Plattform, etwas über die Anforderungen) UND sagen Sie mir nicht Ihre Annahmen darüber UND treffen Sie Annahmen, die weit davon entfernt sind, was ich beantwortet hätte

(zB: schreibe es in Fortran, interpretiere "display" oder "print" als "write to the event log", so etwas. Ich könnte es zulassen, wenn du mir vorher sagst, das wären deine Annahmen)

  • Fragen Sie mich, in welcher Sprache ich es haben möchte, erhalten Sie eine Antwort in der Stellenbeschreibung und schreiben Sie sie dann in einer anderen Sprache, da Sie sich in der von mir gewünschten Sprache nicht wohl fühlen.

(Wir sind hier Berater. Ich teste das Verhalten von Beratern genauso wie das Codieren. Es ist nur richtig, den Kunden zu fragen, ob er tatsächlich eine Wahl hat. Es ist schwierig, die Gespräche mit Leuten zu kontrollieren, die Sie bezahlen. Dies ist Lektion 1. Es ist eine Markieren Sie gegen Sie in einem beliebigen Thema, aber für das spezielle "Sie stellen einen X-Programmierer ein, aber ich möchte nicht für Sie in X schreiben" haben Sie jetzt zwei große schwarze Markierungen.)

  • Zeigen Sie mir, was für ein Architekturastronaut Sie sind, indem Sie zwei Whiteboards mit Schnittstellen, Fabrikmustern, Abstraktionen, Injektionen und Tests füllen, wenn Sie "die Zahlen von eins bis fünf drucken" sollen.

(Sie denken, ich übertreibe, aber ich hatte einen Mann, der mein Problem dramatisch verallgemeinerte. Wenn wir uns an das obige Beispiel halten, würde seine Lösung anstelle von 1 bis 5 eine beliebige Folge von ganzen Zahlen ergeben (woher ?, fragte ich mich) und war 5 Mal so lange wie bei anderen - und er vergaß, die Funktion, die die Arbeit ausgeführt hat, tatsächlich aufzurufen. Wiederholte Aufforderungen und der Hinweis, dass er sie durchlaufen habe, als wäre er der Debugger, führten nicht dazu, dass er bemerkte, dass die Funktion nie aufgerufen wurde.)

Ich sage immer "Magst du das?" "kannst du das verbessern?" "geh mir durch das" und dergleichen. In der Regel wird das fehlende Semikolon in dieser Konversation entdeckt oder das einzelne. Wenn nicht, bezeichne ich es normalerweise als nervenaufreibend.

Andere Dinge, von denen du denkst, dass sie für mich nicht wichtig sind:

  • Wenn Sie fertig sind, kann ich es noch lesen? Haben Sie verschmiert, gekritzelt, die Farben gewechselt, Pfeile durchgestrichen und im Allgemeinen ein Chaos hinterlassen, das jetzt nicht mehr verwendet werden kann? Oder wissen Sie, dass Whiteboards löschbar sind, auf Codezeilen in der Luft zeigen, anstatt sie zu umkreisen / anzuhalten, und mir etwas hinterlassen haben, das ich fotografieren und in der Designdatei aufbewahren könnte?
  • Wie viel hast du mich gefragt, als du es getan hast? Möchten Sie in Ruhe gelassen werden und Ihren Code nicht diskutieren, oder sehen Sie Code als eine kollaborative Sache? Wie haben Sie reagiert, als ich Sie fragte, was Sie noch geschrieben haben?
  • Haben Sie sich über die "leichte" Aufgabe lustig gemacht oder sind Sie bei der "schweren" Aufgabe in Ohnmacht gefallen? Warst du unhöflich, wenn du gefragt wurdest, ob du Code kannst? Lassen Sie sich von einem technischen Problem leicht einschüchtern oder sind Sie arrogant in Bezug auf Ihre Fähigkeit, einen guten Algorithmus zu entwickeln?
  • Arbeiten Sie es in Ihrem Kopf aus oder erinnern Sie sich an eine Lösung, die Sie irgendwo gelesen haben? Ich kann in der Regel für die schweren Probleme erzählen.
  • Hast du geplant, wo du angefangen hast zu schreiben? Leute, denen das Whiteboard ausgeht, fangen normalerweise zu niedrig an oder schreiben zu groß - ich kann sagen, dass sie nicht wussten, dass dies 20 Codezeilen sein würden und so nur Platz für 5 - glauben Sie, oder nicht, dieses winzige Detail spiegelt sich wider größere schätzende Aufgaben außerdem.
  • Hast du es dir angesehen, bevor du gesagt hast, dass du fertig bist? Habe ich gesehen, wie Sie darauf hingewiesen haben oder sich durch das Bild geklopft haben und es selbst getestet haben, bevor ich Sie dazu aufgefordert habe? Als ich Sie dazu aufforderte oder Ihnen spezielle Fragen stellte, haben Sie es sich noch einmal angesehen oder sind einfach aus dem Gedächtnis verschwunden? Sind Sie bereit zu berücksichtigen, dass Ihr erster Entwurf möglicherweise nicht vollständig ist?

Ich empfehle dringend, das Programmieren am Whiteboard zu üben. Ich warne die Befragten immer davor, dass sie dazu aufgefordert werden. Wenn Sie Zugriff auf ein tatsächliches Whiteboard haben, stellen Sie sich einige einfache Probleme und üben Sie diese dort. Es wird Ihrer Leistung und Ihrem Selbstvertrauen helfen.

Tut mir leid, ich weiß, dass ich im Gebiet TL; DR bin, aber hier ist die Sache - beim Codieren am Whiteboard geht es um mehr als nur um Codierung . Es ist ein Test, bei dem Sie mehr als nur die Syntax verstehen. Es gibt viele Verhaltensweisen guter Programmierer, die sich in Ihrer Antwort auf diese Aufgabe zeigen. Wenn Sie denken, dass es nur um das Codieren geht, verpassen Sie den Punkt.

In anderen Gesprächen über Whiteboard-Tests wurde mir gesagt, dass ich einen guten Kandidaten damit ablehnen könnte. Ehrlich gesagt, das ist ein Risiko, das ich eingehen möchte. Jede Einstellungsrunde besteht aus mehreren Personen, die ich einstellen könnte. Einige Leute mit hervorragenden Lebensläufen, die im Frage-und-Antwort-Teil des Interviews gut abschneiden, fallen am Whiteboard auseinander und können offensichtlich keinen einfachen Code in der Sprache schreiben, die sie zu kennen behaupten. Ich könnte einige von diesen gemietet haben. Jedes Werkzeug, das dies verhindert, werde ich weiterhin verwenden. Ich bin nie in einem Boot gelandet, das niemand mieten konnte, weil alle meine Kandidaten am Whiteboard durcheinander geraten sind und ich nicht damit rechne, dass ich es jemals tun werde.


2
Scheint eine großartige Antwort zu sein (und um ehrlich zu sein, viel interessanter, als ich ursprünglich gehofft hatte). Vielen, vielen Dank.
mlvljr

9
@KingOfHypocrites hast du die Antwort tatsächlich gelesen? Es ist mir egal, ob ein Semikolon fehlt. Guck mal, was mich interessiert. 20 Minuten am Whiteboard erzählen mir viel über dich.
Kate Gregory

7
Ich bin gespannt, ob eine Untersuchung das Whiteboard-Interview bestätigt hat. Vollständige Offenlegung: Ich wurde neugierig, nachdem ich ein Whiteboard-Interview nicht bestanden hatte. Ich habe seit ein paar Jahren nicht mehr interviewt, war nie ein guter Performer / Moderator und war ziemlich erstarrt. Ihre Einsichten sind exzellent und wenn ich diese zuerst gelesen hätte, hätte ich über diesen Teil des Interviewprozesses viel anders nachgedacht (und mehr darüber gesprochen). Das heißt, viele Menschen haben eine starke Meinung zu diesem Thema, aber das scheint alles zu sein. Ich gehe davon aus, dass es eine objektive Rechtfertigung für diese Praxis gibt, die durch unterstützende Daten gestützt wird. Gibt es?
Suboptimus

3
+1 Um ehrlich zu sein, nähere ich mich dem Whiteboard als Stellvertreter für eine Übung in der Paarprogrammierung, in der Hoffnung, den Gesprächsfluss über die Aufgabe aufrechtzuerhalten, wie Kate vorschlägt - obwohl ich lieber eine Maschine hätte und tatsächlich ein Paarprogramm mit der Kandidat (oder der Kandidat Paar-Programmierung mit dem Interviewer sein). Die Art und Weise, wie Sie zusammen codieren, ist ebenso wichtig wie die Art und Weise, wie Sie in einer Organisation beliebiger Größe allein codieren.
Julia Hayward

4
Ich weiß, dass dies alt ist, aber ich wurde gerade damit verbunden, und ich wollte darauf hinweisen: Eines der Kennzeichen einer visuellen Verarbeitungsstörung ist die mangelnde Fähigkeit, den Platz, in dem Sie schreiben, einzuschätzen, und somit der Platz knapp wird . Wenn der Person, die Sie bewerten, nicht nur der Platz für mehr Zeilen ausgeht, sondern auch die Zeichen gegen Ende einer Zeile kleiner werden, weil sie feststellen, dass sie zu groß begonnen haben, haben sie möglicherweise nur eine Lernschwäche, anstatt zu verstehen wie lange der Code sein wird. Bitten Sie sie, etwas Nichträumliches zu schätzen, und Sie erhalten möglicherweise ein besseres Ergebnis.
Yamikuronue

17

Ich denke, Sie haben hier eine falsche Annahme gemacht. Es ist nicht zu erwarten, dass ein Kandidat, der Code auf ein Whiteboard schreibt, in der Lage ist, alle ';' perfekt an Ort und Stelle. Wenn Sie an einem Ort interviewen, der Sie dafür bestraft, dann schlage ich vor, dass es sich nicht um eine Organisation handelt, für die Sie arbeiten möchten :-).


2
Ich habe ein Interview nicht bestanden, weil ich, wie gesagt, beim ersten Durchgang eines Testes mit Papier und Stift (von der Schule, in der ich mit Unit-Tests gearbeitet und dann optimiert habe) keinen perfekt optimierten Code geschrieben habe ). Andererseits hatten sie kein Test-Framework, sondern gingen nur davon aus, dass sie Programmierer hatten, die es beim ersten Mal richtig machten!
Julia Hayward

3
@ Julia Hayward - Eine glückliche Flucht für Sie durch die Klänge! Kann nicht glauben, dass die Leute das immer noch tun.
Martijn Verburg

7

Papier- oder Whiteboard-Tests sind äußerst unwirksam. Ich erinnere mich, dass ich einmal ein Interview hatte, in dem ich nach Fehlern in irgendeinem Code auf Papier suchen musste. Eine davon war, dass die Klasse von einer Schnittstelle geerbt wurde, aber die Implementierung eines Members fehlte. Ich wusste, dass dies wahrscheinlich einer der Fehler war, ich suchte danach und aus irgendeinem Grund konnte ich es einfach nicht sehen (obwohl ich erwähnte, dass ich das als eines der Probleme suchte).

Zufällig bekam ich diesen Job immer noch, aber ich musste darüber nachdenken, was passiert war. In einem realistischen Szenario für diese Art von Dingen werden in dem Moment, in dem etwas nicht stimmt (dies ist C # in Visual Studio) und das Ding nicht kompiliert. Ich überprüfe das nie im wirklichen Leben, weil es nie passiert (es ist unmöglich) und daher bin ich nicht mehr in der Lage, so etwas zu sehen. Fehlende Semikolons sind ein noch extremeres Beispiel dafür - in der realen Welt völlig unrealistisch, es sei denn, Sie schreiben im Editor und senden Ihren Code per E-Mail an eine andere Person, um ihn zu kompilieren!

Wenn jemand bittet, während eines Interviews ein Whiteboard zu verwenden, um etwas zu unterstützen, das er sagen möchte, dann ist das großartig, aber ich würde es niemals umgekehrt machen.


2
Ihre Geschichte scheint zu beweisen, dass Ihr Test effektiv war. Anstatt allgemein zu fragen: "Wie überprüfen Sie Code?" Sie gaben Ihnen einige zu überprüfen. Sie sprachen laut und sagten etwas wie "muss sicherstellen, dass alles implementiert wird", und obwohl Sie das fehlende nicht entdeckt haben, haben Sie ihnen gezeigt, dass Sie tatsächlich wissen, wie man Code auf Fehler überprüft, und nicht nur Fragen dazu beantworten . Sie haben wahrscheinlich auch nicht auf eine Reihe von Fehlern hingewiesen, die einige Leute haben könnten, und vielleicht haben Sie auch einige andere Fehler gesehen. Und dann hast du den Job bekommen. Das klingt für mich effektiv, für alle!
Kate Gregory

2
Außerdem werden fehlende Semikolons immer wieder als nicht wirklich negativ abgetan. Wenn Sie die Syntax Ihrer bevorzugten Sprache konsequent falsch eingeben, sind Sie ein langsamerer Entwickler als jemand, der all diese Syntax verinnerlicht hat. Du gehst ständig zurück und reparierst Dinge, die du vergessen hast. Es ist gut möglich, dass Sie durch das ständige Nörgeln der IDE aus Ihrem Rhythmus geraten. Darüber hinaus sind die Leute, die alle Semikolons am Whiteboard weglassen und nicht bemerken, wenn Sie sie dazu auffordern, nicht auf dem gleichen Niveau wie die guten Entwickler, die einmal pro Woche vergessen, ein Semikolon in die IDE einzugeben und dann zu korrigieren es.
Kate Gregory

2
+1 es ist unwirksam. Es beweist absolut nichts. Ich bin mir ziemlich sicher, dass viele Leute, die den Test nicht bestehen, besser sind als der durchschnittliche Typ, der ihn besteht.

3
@Kate - Ich verstehe, woher du kommst, aber ich bin anderer Meinung - zumal ich jetzt auf der anderen Seite des Tisches sitze. Wenn jemandem regelmäßig Semikolons fehlen, möchte ich das in der IDE nicht in einer künstlichen Umgebung sehen. Es ist wie der Schlüsselcode für mein Büro - ich kann die Nummer ohne nachzudenken eingeben, mich bitten, sie mit 100% iger Sicherheit aufzuschreiben, und es würde mir schwer fallen. Ein Interview wird niemals 100% realistisch sein, deshalb möchte ich nicht aus dem Weg gehen, es noch weniger realistisch zu machen.
FinnNk

1
Es ist weniger wahrscheinlich, dass ich wichtige Syntax auf der Tastatur weglasse als auf einem Whiteboard, da die Eingabe durch das Muskelgedächtnis verstärkt wird. Ein Tippfehler (und ein Nörgelchen meines Editors oder des Partnerpaars), insbesondere in einer Paarbildungssituation, kann mich jedoch in eine Rückkopplungsschleife stürzen, in der die Fehler die Nerven verstärken, die Fehler verursachen. Ich denke, dass Polyglotten gegenüber einsprachigen Kandidaten wahrscheinlich benachteiligt sind.
dcorking

5

Ich habe das getan. In einem Interview wurde ich gebeten, eine Lauflängencodierung auf dem Whiteboard zu implementieren. Während ich einen Teil des Codes (mit Erklärung der Abkürzung) so abkürzte, dass er auf das Whiteboard passte, stellte ich mir immer noch eine Sammlung von Tests für dieses Gerät vor. und durchlief eine von ihnen, um meine Lösung zu validieren und zu zeigen, wie das Testen helfen würde. Mir wurde diese Position angeboten, daher gehe ich davon aus, dass das Testen hilfreich oder im schlimmsten Fall nicht ärgerlich war.


4

Ich benutze diesen Ansatz, wenn ich Tests für die Schule mache. Ich schreibe zuerst die Funktion, dann schreibe ich nebenher eine kleine Tabelle mit Eingaben, Ausgaben und Variablen. Ich habe auf diese Weise ein paar dumme Fehler entdeckt. Testen, auch auf Papier oder Whiteboard, ist immer besser als nichts zu testen.

Ich bin nicht einverstanden damit, in einer professionellen Umgebung über Semikolons auszurasten.


4

Es ist dumm, einen Kandidaten zu bitten, auf einem Whiteboard zu codieren. Es gibt moderne Tools wie Snippits, Jsfiddle und Intellisense. Außerdem sollte kein Techniker erforderlich sein, um sich die Syntax zu merken. Die Syntax wird nachgeschlagen und referenziert. Wenn Sie sich Code merken, haben Sie wahrscheinlich keine Zeit in Ihrer Karriere damit verbracht, das Codieren in einer Umgebung mit mehreren Mandanten, die Optimierung der Syntax oder sogar in einer gehosteten Umgebung zu erlernen.


3
Jeder, der in einer bestimmten Sprache halbwegs anständig ist, sollte sich die Syntax merken, wenn er sie oft benutzt. Wenn ein Typ den ganzen Tag C # -Code schreibt und die Syntax nicht genau kennt, wird er langsam und schrecklich sein. Sie können auch nachsehen, was 2 ^ 8 ist, aber jeder Entwickler, der es wert ist, sollte wissen, was es ist, nur weil er es so oft erlebt hat. Gleiches gilt für die Syntax.
Whatsisname

1
Das stimmt einfach nicht. Das Auswendiglernen der Syntax ist heutzutage nicht mehr erforderlich. Zu sagen, dass Entwickler, die wissen, wie man Code in zahlreichen Sprachen wie SQL, VB, C #, Javascript und Json, Angularjs, Telerik und anderen verwendet, ihr Geld nicht wert sind, weil sie sich die Syntax nicht merken können, ist albern. Es gehört mehr dazu, ein guter Softwareentwickler zu sein, als mathematische Operatoren wie Sie. Wie wäre es, Anforderungen, Designstrukturen, Muster und Branchenerfahrung zu verstehen? Es gibt buchstäblich genug Syntax in Sprachen und Bibliotheken, um die Ladefläche eines Lastwagens auszufüllen.
James Bailey

Es geht nicht darum, "notwendig" zu sein. Wenn Sie etwas oft genug benutzen, werden Sie sich daran erinnern. Wenn jemand behauptet, ein SQL-Entwickler zu sein, aber keine Join-Anweisung auf den Kopf stellen kann, dann deshalb, weil er entweder a) inkompetent b) über seine Qualifikationen gelogen hat oder c) ein sehr seltsames Gehirn hat Mit drei Situationen möchte ich mich nicht befassen müssen.
Whatsisname

1
Ein "Join" ist nicht das, was normalerweise auf einem Whiteboard verlangt wird. Es sind oft Rätsel und Dinge, die für den Job nicht relevant sind. Was ist, wenn der Kandidat zertifiziert ist, einen Abschluss hat und einen soliden Lebenslauf hat? Sie denken immer noch, dass er "inkompetent" ist, weil er nicht auf einer weißen Tafel kodiert, um seinen Lebensunterhalt zu verdienen? Marketing-Leute werden nicht gebeten, eine vierteljährliche Marketingstrategie für Interview-Spots vorzulegen. Es ist dumm. Sie sollten in der Lage sein, mit dem Kandidaten zu sprechen und leicht abzuleiten, ob er codieren kann.
James Bailey

3

Wenn ein Restaurant einen Koch einstellen möchte, bittet der Besitzer ihn nicht, ein "Pot au feu" mit einem Zahnstocher und einer Kappe zu kochen.

Bitten Sie einen Entwickler nicht, in einem Interview auf einem Whiteboard zu codieren.


3
Und wann gefragt?
mlvljr

Während des Interviews

3

Die Kodierung von Whiteboards ist schwierig. Das wurde mir erst vorgestellt, als ich von Disney interviewt wurde. Da ich nicht wusste, was mich erwarten würde und nicht in der Lage war, es zu debuggen, stolperte ich darüber und löste das Problem auf eine Art Pseudocode. Wenn sie fragten, konnte es laufen.

Ich meine sicher, es könnte sein, dass Sie nur die Syntaxfehler korrigieren müssen, richtig. Ich glaube, sie haben einen sehr guten Kandidaten verloren, wenn ich nicht wegen des Whiteboards eingestellt wurde. Ich schaue mir die Qualifikationen an und es sieht so aus, als ob ich für die Stelle qualifiziert bin und den Job machen kann. Ich übertreffe meinen jetzigen Job und wünschte, ich könnte mit ihnen zusammenarbeiten.

Danke für deine Eingabe Kate, ich habe jedes Wort gelesen. Es ist nur für mich als Programmierer, Whiteboard zeigt wirklich nicht Ihre Fähigkeiten. Ich bin ein großartiger Programmierer, der in mehreren Sprachen arbeitet. Ich kannte die Sprache, in der ich programmiert werden sollte, aber an der weißen Tafel vergaß ich plötzlich.

Ich baue eine komplexe Integration und Kreditkartenverarbeitung auf, aber auf einer weißen Tafel konnte ich mich nicht erinnern, wie ich überhaupt die richtige Syntax machen sollte.

Als Arbeitgeber mag ich die Whiteboard-Tests; Ich stelle jedoch einen Programmierer ein, dessen tatsächliche Fähigkeiten ich sehen möchte, wenn sie den Job machen. Es ist großartig, wenn sie kommunizieren können, aber ich muss sehen, dass sie in der Lage sind, Probleme zu lösen.


1
Vielen Dank für die Eingabe, es scheint, es ist richtig, was ich gedacht habe, als ich die Frage gestellt habe - man kann wirklich in einem Whiteboard-Code stecken bleiben, ohne zu wissen, ob er (bereits) korrekt ist und keine Möglichkeit hat, ihn "tatsächlich" zu überprüfen. Eine knifflige Lösung - schreiben Sie einen Whiteboard-Test! ;)
mlvljr
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.