
Wie viele russische Anwendungen bei Google Play sagen "50.000.000+ Installationen"? Offensichtlich ist jeder dieser Fälle eine einzigartige Geschichte mit ihren eigenen Besonderheiten, daher wäre es interessant, mit den Entwicklern zu sprechen. Und wenn eine solche Anwendung auch eine Bewertung von 4,6 hat, verstärkt dies das Interesse.
Vladimir Tebloev ist einer der Mitarbeiter der
Sberbank Online Android-Anwendung. Im Frühjahr, als Sberbank Technologies an unserer
Mobius- Konferenz teilnahm, machte er dort einen Bericht, und jetzt beschlossen wir, Vladimir nach den Merkmalen seiner Arbeit zu fragen.
- Sagen Sie uns zuerst, was genau Sie tun?- In der Sberbank Online-Anwendung bin ich mit dem Dialogdienst beschäftigt, mit dem Benutzer Geld mit einem Klick überweisen und den gesamten Überweisungsverlauf in voller Ansicht anzeigen können. Der Dienst steht allen Benutzern der Anwendung zur Verfügung - jetzt sind es 37 Millionen Menschen.
Ich arbeite seit Sommer 2016 bei SberTech - dann gab es im Rahmen der Bewerbung noch keine Aufteilung in separate Teams. Und später, als sie im Rahmen des Übergangs zu Agile damit begannen, verschiedene Teams separaten Anwendungsmodulen zuzuweisen, war eines der ersten das Dialogs-Team, und seitdem bin ich dabei.
- Jeder hat die Wörter "Sberbank" und "Mobile Development" im Zusammenhang mit Sberbank Online. Aber gibt es in einem so großen Unternehmen wahrscheinlich auch eine interne mobile Entwicklung? Unterscheidet es sich von außen?- Ja, es gibt auch Anwendungen für den internen Gebrauch. Ich habe nichts mit ihnen zu tun, aber ich weiß, dass React Native dort aktiv eingesetzt wird. Die interne Entwicklung hat ihre eigenen Anforderungen: Es gibt keine strenge Entwurfsprüfung und ausgefeilte Animation, die Entwicklung ist mit einer plattformübergreifenden Lösung schneller.
Wenn das Fachwissen wächst, kann es auf eine „Kampf“ -Anwendung angewendet werden. Obwohl die Tatsache, dass Sberbank Online die plattformübergreifende Entwicklung aktiv nutzen kann, bezweifle ich dies. Es gibt viele Schwierigkeiten, und wenn Sie zig Millionen Benutzer haben, kann sogar ein seltenes Problem so viele Menschen verletzen.
- Und wie wirkt sich dieses „selbst ein seltenes Problem, das viele verletzt“ auf die Arbeit aus? Müssen Sie sich mit einigen exotischen Problemen auseinandersetzen, die kleinere Anwendungen möglicherweise unter dem Radar haben?- Manchmal treten bei einigen „speziellen“ Geräten Probleme auf. Bei einer benutzerdefinierten, aber weit verbreiteten Firmware schoss es schwer, und wir mussten es lange herausfinden. Es stellte sich heraus, dass das Problem im Treiber des Motherboards des Geräts selbst lag - er versuchte, Bibliotheken unter ARMv5 zu emulieren, obwohl das Projekt nur für ARMv7 war.
Wenn es viele Benutzer gibt und der Preis für den Fehler hoch ist, führt dies dazu, dass alles „ein wenig“ ausgerollt werden muss, wobei die Berichte sorgfältig befolgt werden müssen. Wenn dort etwas aufsteigt, hören wir sofort auf zu rollen und machen einen Hotfix. Neben dem Rolling „um einen bestimmten Prozentsatz der Benutzer“ rollen wir auch alles geografisch in Teilen aus: Die Sberbank hat das Konzept einer „Territorialbank“, und Funktionen können schrittweise nach Regionen eingeführt werden.
- Während einige Hipster-Startups eine hohe MinSdkVersion setzen und sagen können, dass "alle anderen nicht unser Publikum sind", haben Sie eine andere Situation, Sie können Menschen nicht winken. Was ist Ihr aktueller MinSdkVersion-Wert?- Jetzt ist es 16 und wir haben es letztes Jahr buchstäblich von 14 angehoben. Wir sehen uns die Anzahl der Kunden mit einem bestimmten SDK an und können die Version erhöhen, wenn sie weniger als 5% beträgt. Bisher haben wir viele Benutzer auf Android 4.4 KitKat, ungefähr 16% - wir müssen sie unterstützen.
- Gibt es eine der neuen Versionen, die Sie sich gerade ansehen und denken: "Sobald wir MinSdkVersion erhöhen, verwenden wir sie sofort?"- Natürlich möchte ich unsere Mindest-API auf Android 5.0 erhöhen, um Innovationen wie beispielsweise Übergangsanimationen, die angemessen und überall funktionieren, voll auszunutzen. Im Prinzip gilt dies jedoch nicht für Schreibfunktionen und Geschäftslogik, daher ist dies nicht kritisch. Im Allgemeinen werden Animationen von unseren Designern ausgearbeitet, dh sie können manuell implementiert werden. Dieses Problem ist also nicht kritisch, sondern bezieht sich auf den Komfort und die Sicherheit des Entwicklers.
In einigen Fällen überprüfen wir die Version, z. B. SSL-Pinning. Es funktioniert in verschiedenen Android-Versionen unterschiedlich, daher implementieren wir zwei Versionen des Codes für Android-Geräte „bis 4.4“ und „ab 4.4“.
Natürlich möchte ich „nur für Android P entwickeln und an nichts denken“ - aber das ist immer der Fall, es kommt nicht weiter.
- Zum genannten SSL-Pinning. Offensichtlich sind Sicherheitsfragen für die Bank sehr wichtig. Und wie wirkt sich das auf Sie aus, wie unterscheidet sich Ihre Arbeit von der Arbeit an einer Nicht-Bank-Anwendung?- Es bietet einen sehr strengen Umgang mit den persönlichen Daten des Benutzers. Jedes Leck ist ein großes Risiko. Wir haben eine Sicherheitsabteilung, die unsere Anwendung vor jeder Version testet. Wenn Kommentare vorhanden sind, werden diese an das Team weitergeleitet, das für die Funktionalität mit der erkannten Sicherheitsanfälligkeit verantwortlich ist.
Ich denke, in kleinen Unternehmen gibt es oft keine Sicherheitsabteilung, die die Anwendung pentest. Wenn Untiefen gefunden werden, können diese auf w3bsit3-dns.com oder einer ähnlichen Ressource angezeigt werden.
Im Zusammenhang mit der Sicherheit steht auch, dass unsere Anwendung ein Antivirenprogramm verwendet. Einige Benutzer sind mit der Präsenz unzufrieden, aber die Einführung von Antivirus hat zu einer deutlichen Reduzierung des Betrugs geführt. In unserer SMS-Bank, in der Sie mit Antivirus eine SMS-Überweisungsmenge auf eine X-Karte schreiben können, wurde die Betrugsrate in dieser Richtung auf ein Minimum reduziert.
- Aus Sicherheitsgründen beschränken Banken ihre Funktionalität bei verwurzelten Smartphones. Was ist für Sberbank Online für gerootete Geräte verboten?- Im Juni haben wir die eingeschränkte Funktionalität für Besitzer von Geräten mit Root-Rechten aufgegeben. Jetzt haben alle Benutzer von Sberbank Online auf Android die volle Funktionalität. Gleichzeitig bleibt der Schutz dank des Betrugsüberwachungssystems auf dem gleichen Niveau.
- Und im Namen der Sicherheit war es notwendig, etwas einzuschränken, das nicht Benutzer, sondern sich selbst als Entwickler waren, und sich weigerte, es anderweitig zu verwenden?- Als wir 2015 Retrofit einführen wollten, hatte er Probleme mit der Verschleierung, er arbeitete schief mit einem Standard-Verschleierer. Unsere Sicherheitsabteilung wies auf diese Sicherheitsanfälligkeit hin, die mit einem Cyberangriff auf die Bank und den Risiken eines Codebruchs behaftet ist, da die API hervorsticht. Dann haben wir Retrofit aufgegeben und verwenden es immer noch nicht. Soweit ich weiß, sind die Probleme mit dem Standard-Verschleierer dort bereits behoben. Aber wir haben seitdem unseren eigenen HTTP-Client geschrieben, der funktioniert und alle zufriedenstellt. Viele Wrapper wurden bereits für verschiedene Teams geschrieben, die mit verschiedenen Servern arbeiten. Es macht keinen Sinn, es in Retrofit zu ändern.
- Die unvermeidliche Frage: Was hast du mit Kotlin?- Wir gehen in seine Richtung, aber gemächlich. Die Schwierigkeit besteht darin, dass viele Android-Entwickler verschiedener Ebenen sofort an der Anwendung arbeiten, jemand kennt Kotlin perfekt, jemand nicht. Im Allgemeinen gibt es keine unüberwindbaren Hindernisse für die Implementierung, aber jetzt fehlt es uns an Überprüfern, um den Kotlin-Code zu beobachten. Wenn wir alle morgen in Kotlin abrupt anfangen zu schreiben, werden die Leute auf Anfragen „reißen“. Darüber hinaus gibt es bei Kotlin Probleme mit dem statischen Code-Analysator, der in unserer Pipeline verwendet wird.
Kotlin wird also in kleinen Schritten implementiert: Zum Beispiel schreiben wir Tests auf Kotlin und verwenden Datenklassen (so sparen wir Zeit, um keine Tests für Getter, Setter, equals (), hashCode () usw. zu schreiben).
Jetzt läuft es langsam ein und im nächsten Schritt wollen wir unser DSL zum Testen auf Kotlin schreiben. Parallel dazu wollen wir das Kotlin-Wissen im Unternehmen verbessern: zum Beispiel mit Hilfe von Mitaps.
- Im Fall von "Dialogen" beschäftigen Sie sich mit Messaging, jedoch nicht mit einem direkten Analogon zu WhatsApp. Und so ist es interessant: Wie nützlich sind die Lösungen anderer für Sie? Verwenden Sie Open-Source-Messenger im Code?- Es war nützlich, wenn wir Emoticons hinzufügen wollten. Wir hatten eine Frage, wie man mit ihnen ein Panel erstellt, und in Open Source sahen wir eine Option, bei der alles einfach durch ein Popup über der Tastatur gelöst werden kann. Dann konvergiert alles in der Höhe und es stellt sich nahtlos für den Benutzer heraus.
Im Allgemeinen ist es jedoch nicht immer gut, die Entscheidungen anderer zu betrachten. Es ist effizienter, eigene Entscheidungen zu treffen und dabei die Erfahrungen anderer zu berücksichtigen. Zum Beispiel ist es besser, Telegramm überhaupt nicht anzusehen, da es aufgrund der großen Größe der Klassen im
Quellcode ihrer Android-Anwendung nicht einfach ist, dies herauszufinden. Wir versuchen, unseren eigenen Weg zu gehen, zumal die Interaktion mit dem Server unterschiedlich sein kann: Im selben Telegramm, das MTProto ist, haben wir die üblichen WebSockets.
- Ich bin ein fauler Interviewer, deshalb habe ich beschlossen, nur eine Liste der Dinge zu erstellen, mit denen Sie bei der Arbeit in Verbindung stehen, und nach jedem Punkt zu fragen: "Sagen Sie uns genau, wie die Dinge damit laufen."
Der erste Punkt: Sie befinden sich in der "Anwendungsmodularchitektur". Wir haben bereits darüber gesprochen, dass die Anwendung in Module unterteilt ist - was können Sie noch über Architektur sagen?- Es entwickelt sich iterativ mit uns, die Versionierung ist im Gange, jetzt haben wir die 17. Version erreicht.
Am 16. wurde Clean Architecture eingeführt. Wir haben vereinbart, wer für was verantwortlich ist (Präsentation, Domäne, Datenschicht), welche Entitäten und wo verwendet werden sollen, wo die Konverter sein sollen - im Allgemeinen haben sie alle architektonischen Probleme gemalt und implementiert.
Wie folgt implementiert: Alle neuen Funktionen mussten auf unsere neue Architektur geschrieben werden. Wenn in der Pull-Anfrage etwas von der festgelegten Norm abweicht, wird eine solche Pull-Anfrage überarbeitet. Gleichzeitig beeilten sie sich jedoch nicht sofort, alle alten Funktionen zu durchschauen, da dies viele Probleme verursachen kann.
Für die Präsentationsebene haben wir den MVP-Standard gewählt, aber einige unserer Teams verwenden MVVM. In der Präsentationsebene sind wir durch nichts eingeschränkt. Zum Beispiel haben wir unseren Chat über MVI gesehen - genauer gesagt über unsere interessante Implementierung von MVI, die sich grundlegend von dem unterscheidet, was der Entwickler Mosby geschrieben hat.
Dann wechselten wir zu Version 17 der Architektur und implementierten RxJava, was architektonische Änderungen mit sich brachte. Wenn wir strenge Definitionen verwenden, hat sich unsere Architektur nun als sechseckig herausgestellt. Von Clean haben wir uns „gegabelt“. Sie ähneln sich jedoch darin, dass beide nach den SOLID-Prinzipien arbeiten, sodass einer reibungslos in den anderen fließt. Jetzt arbeiten wir daran.
In zukünftigen Versionen der Architektur möchten wir das zur Implementierung von MVP verwendete Moxy-Framework aufgeben, da es einige Schwierigkeiten verursacht. Das Projekt ist groß, es verwendet die Annotationsverarbeitung, und wenn Änderungen an den Modulen der "unteren Ebene" vorgenommen werden, ist die Erstellungszeit groß. Und wir bemühen uns, unseren Entwicklern das Leben zu erleichtern.
- Der zweite Punkt ist "Optimierung der Arbeit und des Speicherverbrauchs". Wie akut ist diese Frage, muss ich für Benutzer mit älteren Geräten ständig darüber nachdenken?- Dieses Problem steht im Fokus von Plattformteams, die Tools entwickeln, die von Teams verwendet werden. Die Notwendigkeit, dies zu tun, ergibt sich vielmehr aus der Notwendigkeit eines der Teams. Im Dialogs-Team war der Chat beispielsweise in den frühen Entwicklungsphasen sehr langsam. Dann musste ich meine Ärmel hochkrempeln, mit dem Profiler beginnen, sehen, wo die Engpässe in der Anwendung waren, die Gründe für ihr Auftreten herausfinden.
In Bezug auf die Optimierung haben wir beispielsweise PNG aufgegeben und diese schrittweise aus dem Projekt entfernt, um nur den Vektor zu verwenden. Für dieses Jahr ist eine Optimierung des Abhängigkeitsdiagramms in Dagger geplant, um den Kaltstart der Anwendung zu beschleunigen.
- Fahren wir mit den Testfragen fort: Wie geht es Ihnen?- Ich kann nur über unser Team sprechen, in anderen kann dieser Prozess anders aufgebaut werden.
Unser Team hatte zunächst einen Tester. Anschließend langweilte er sich nur mit dem Testen. Und er begann uns zu bitten, beim Schreiben von Unit-Tests zu helfen. Wir haben ihm gezeigt, wie man Tests für die Datenbank schreibt, im Wesentlichen zum Parsen - und auf diese Weise hat er uns entladen und einen Teil der Arbeit von uns entfernt. Das ist gut: Er ist interessiert und wir.
Im Laufe der Zeit kamen wir zu dem Schluss, dass wir die Regression automatisieren und UI-Tests schreiben müssen. Zuerst arbeiteten mein Partner und ich an UI-Tests, und später kam die Qualitätsabteilung zu uns - unsere Tester, die das Backend in der Vergangenheit getestet haben. Sie kennen Java und sind jetzt mit unserem Projekt verbunden, um die gesamte Regression zu automatisieren. Wir setzten uns und überlegten, welche Lösungen es gibt: Appium, Espresso, Selen.
Wir hielten bei Espresso an und begannen, gemeinsam Ansätze zu entwickeln. Um das Testen zu erleichtern, haben wir ein eigenes Framework entwickelt, so etwas wie Kakao. Wir haben diese Arbeit Anfang 2017 begonnen, und jetzt haben wir ein großes Framework, und die meisten Tests werden als Konstruktor zusammengestellt, da viele Match-Ups und Actionspiele für verschiedene Situationen geschrieben wurden.
Jetzt bitten uns unsere Tester aktiv, ihnen das Schreiben von UI-Tests beizubringen, da es einfacher ist, einen Test einmal zu schreiben, als dieselben Aktionen auf fünf Geräten zu „durchstechen“. Natürlich automatisieren Sie nicht alles und einige Fälle müssen noch manuell überprüft werden.
Bei den Entwicklern findet alle zwei Wochen eine Retrospektive in unserem Team statt. Bei einem von ihnen kamen wir zu dem Schluss, dass Entwickler mindestens Alpha-Tests durchführen sollten, nachdem sie ein Feature geschrieben haben. Um keine völlig grundlegenden Fehler der Form „Die Anwendung stürzt beim Start ab“ zu beseitigen. Somit haben sich die Entwickler auch mit dem Testen verbunden. Wenn wir eine Hauptversion vorbereiten und die Funktion schnell testen müssen, setzen sich alle zur Regression und bestehen gemeinsam die Regressionstests. Wenn ein Fehler erkannt wird, trennen sich Entwickler von der Regression, beheben ihn schnell und erneut.
- Nächster Punkt: Codeüberprüfung. Haben Sie Einzelheiten oder "wie alle anderen"?- Es gibt eine Besonderheit, die durch die Anzahl der Entwickler verursacht wird. Wenn es in einem Unternehmen zehn mobile Entwickler gibt, können zwei oder drei Personen alles überprüfen. Und wie kann man den Code von Hunderten von Menschen überarbeiten? Wir haben eine „Überprüfungsmatrix“ entwickelt. Es wurden 20 bis 30 Personen ausgewählt, von denen wir sicher wissen, dass sie gut publizieren, Feedback hinterlassen und kontroverse Punkte in den Kommentaren lösen können. Sie nahmen diese Leute und teilten alle Teams zwischen ihnen auf.
Warum eine Matrix? Dies soll sicherstellen, dass alle Prüfer die gleiche Last haben. Wie läuft die Überprüfung? Unser Team benötigt mindestens drei Bewertungen. Der erste ist von jemandem im Team. Die zweite - von jemandem von außerhalb, von einem Team, das sich nicht mit dieser Funktionalität befasst. Und der dritte Appruv - von jemandem aus einem benachbarten Team. In unserem Fall gibt es mehrere verwandte Befehle, die sich alle mit unserem Code befassen. Nun, dementsprechend sollten alle Builds gesammelt werden: Unit-Tests und UI-Tests sollten ohne Probleme bestehen. Somit haben wir eine Codeüberprüfung.
- Der nächste Punkt ist das Refactoring des Legacy-Codes. Wie systematisch geschieht dies: genau mit den geplanten Aufgaben oder "mussten Sie Änderungen am alten Code vornehmen - gleichzeitig umgestalten"?- Im Allgemeinen haben wir ein eigenartiges „Pfadfinderprinzip“: Wenn Sie etwas Altes berührt haben - seien Sie so freundlich, es richtig zu machen, sind Sie jetzt Mitautor. Es ist aber auch ein Refactoring geplant. Für Dialoge war beispielsweise ein Refactoring von zwei Richtungen erforderlich: das von uns verwendete Kontaktbuch und Übersetzungen. Das Kontaktbuch wurde herausgenommen, bereinigt, die gesamte Datenbank auf Room neu geschrieben und in einem separaten Modul ausgeführt. Und unsere Zahlungen wurden vor langer Zeit mit RoboSpice geschrieben, wenn Sie sich noch daran erinnern, und es hat uns wehgetan. Ich muss sagen, das auszuschneiden war eine unangenehme Aufgabe, weil es viele Verbindungen dazu gab. Und Sie mussten es subtil bereinigen, um den Rest der Funktionalität nicht zu beeinträchtigen.
- Auch bei Sbertekh sind Sie an der Ausbildung von Programmierern beteiligt. Wie sieht eine Ausbildung im Unternehmen aus?- Seit September ist geplant, ein Programm wie die Umschulung interner Mitarbeiter durchzuführen. Jetzt haben wir bereits eine Reihe von Themen zu Java und Android definiert. Zum Beispiel haben wir Javascriptoren, Javisten und Analysten, die auf Android umschulten möchten. Für sie wird eine solche Schule organisiert, in der je nach Zeitplan und Vorlesungen ein gezieltes Studium stattfinden wird.
Und jetzt haben wir regelmäßig Mitaps abgehalten. Die Auswahl der Themen ist für sie nicht die gleiche wie bei Konferenzen, bei denen etwas Neues und Hype notwendig ist. Wenn wir beispielsweise wissen, dass Entwickler Probleme mit etwas haben, ist es wichtig, darüber zu sprechen. In letzter Zeit sprach einer unserer Entwickler über Vektorgrafiken. Nicht nur über eine bestimmte Bibliothek, die Vektoren auf Android wunderschön zeichnet, sondern begann damit, wie Vektorgrafiken im Allgemeinen funktionieren, und ging dann zur privaten über. Sie sprachen sowohl über Room als auch über Java-Parallelität, mit der viele Entwickler Probleme haben, und über Dagger 2.
Letztes Jahr hatten wir eine Android-Entwicklungsschule und haben diejenigen eingestellt, die sie erfolgreich abgeschlossen haben. Solche Leute sollten nicht sofort mit einigen Projekten verbunden sein und alleine kochen. Daher wird jedem neuen Mitarbeiter und auch dem Junior ein Mentor zugewiesen, der ihn führt, entwickelt und ihm hilft. Dies ist ein internes Lernen.
- Interviews: Haben Sie sie "wie alle anderen" oder gibt es eine Besonderheit?- Früher dachte ich, dass "wie alle anderen", aber am Ende stellt sich heraus, dass sie immer noch etwas Besonderes sind. Nach meiner Erfahrung gibt es drei gängige Ansätze auf dem Markt. Der erste wird zu drei oder vier Themen gestellt und ausschließlich danach bewertet. Ich bin zum Beispiel als Android-Entwickler in das Unternehmen gekommen und werde als eine Person angesehen, die ausgezeichnete Kenntnisse über Algorithmen und Synchronisation in Java haben muss und gleichzeitig nicht weiß, was ich in Superbibliotheken mache. , , - . — , 30-40 . , , . — - . , , . , .
, : , OOD (Object Oriented Design, ), Java Core Android SDK. . , , . : , , - . . , , , Dagger 2, RxJava. , Kotlin. , . - , , , . , .
— « ». - , .— — RxJava, , . , , . .
Retrofit, : , , . , — .
TinyMachine - — , , , . , «» , , . -, , - rocket science, .
— : . , , ?- Ja. — Java-. « »: Java- — - («» — Android-: , , , ). , , , — Java-. , . , , , , « payment? payment payment ? paymentTest?».
, Confluence. , material design , - , . , , Confluence. , , , , , , . : RxJava Confluence best practices — , , . : , .
, . Confluence 200 . . Confluence, , , .
