Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MfS France - Trois choses que j'aurai aimé connaître pour mes équipes tech

MfS France - Trois choses que j'aurai aimé connaître pour mes équipes tech

Quand votre startup et votre équipe grossit, vous avez parfois le temps de voir vos erreurs grossir en même temps. Voyons ensemble trois domaines dans lesquels j'aurais aimé faire autrement pour mes équipes de dev.

Christopher MANEU

June 10, 2020
Tweet

More Decks by Christopher MANEU

Other Decks in Technology

Transcript

  1. 3 technical things I wish I had known Christopher MANEU

    Startups Cloud Advocate @ Microsoft @cmaneu
  2. @cmaneu I worked on a diverse range of « startups

    » Bootstraping Series E Intrapreneurship Startups Scale-ups A B C UX Designer DevOps Engineer Mobile Developer Engineering Lead
  3. @cmaneu Metrics for a better product Help people get productive

    Focus on tech relevant for your business
  4. @cmaneu Porting this feature on Windows Phone Needs major rework

    of the Audio player – Can’t do it in a sprint Sprint 1: Genres selection + Artists swipe without music preview Sprint 2: Add Music Preview
  5. @cmaneu Metrics behind this feature Number of artists swiped /

    user > The greater the number is, the better for recomendation Analytics embedded in the API (no work client-side) Reports were not available for platform=windowsphone
  6. @cmaneu Measure things early Not implementing the audio preview made

    the key metric for this feature grow by ~200% After 1 week of launch (post sprint 1), Windows Phone was outperforming ALL mobile platforms on that metric. https://aka.ms/fast/insights
  7. +++++++++++++++++++++++ PAGE CREATED 'BootScreen' +++++++++++++++++++++++ BOOTSCREEN> START >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [15:18:21] AppDataStore

    : OnApplicationLaunching - DiscoverActiveDownloads - Time elapsed (ms): 435 [15:18:21] AppDataStore : OnApplicationLaunching - UpdateCurrentTrackState - Time elapsed (ms): 2 [15:18:21] PlayLog : Deleting legacy playlog folder: SUCCEEDED [15:18:21] App : --------------------- DeezerApplicationState changed to 'MigrationDone' ---------------------- [15:18:21] App : DAVM Loading BOOTSCREEN> LoadApplication - Time elapsed (ms): 73 [15:18:21] App : DAVM Update current track state [15:18:22] App : DAVM Update PlayerActions Mixpanel> Sending event mobile_install A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.ni.dll 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\Data\Programs\{0AC0860A-B966-4004-817C-8AB50BD22511}\Install\Newtonsoft.Json.DLL'. Cannot find or open the PDB file. System.Windows.Data Error: BindingExpression path error: 'CanExecute' property not found on 'Deezer.UI.DelegateCommand' 'Deezer.UI.DelegateCommand' (HashCode=15035499). BindingExpression: Path='PlayCommand.CanExecute' DataItem='Deezer.DeezerAudioViewModel' (HashCode=1101770); target element is 'System.Windows.Controls.Button' (Name=''); target property is 'IsEnabled' (type 'System.Boolean').. System.Windows.Data Error: BindingExpression path error: 'CanExecute' property not found on 'Deezer.UI.DelegateCommand' 'Deezer.UI.DelegateCommand' (HashCode=9915935). BindingExpression: Path='PauseCommand.CanExecute' DataItem='Deezer.DeezerAudioViewModel' (HashCode=1101770); target element is 'System.Windows.Controls.Button' (Name=''); target property is 'IsEnabled' (type 'System.Boolean').. A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.ni.dll SafeGetFile - File not found: parentFolder=Local, fileName=mixpanel.dat [15:18:22] App : DAVM Update playerstate Default [15:18:22] App : DAVM PropChanged IsInRadioMode [15:18:22] App : DAVM PropChanged IsInRadioMode [15:18:22] App : DAVM Update current track state [15:18:22] App : DAVM PropChanged IsInRadioMode [15:18:22] App : DAVM Update PlayerActions 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Runtime.Serialization.Primitives.ni.dll'. Cannot find or open the PDB file. System.Windows.Data Error: BindingExpression path error: 'CanExecute' property not found on 'Deezer.UI.DelegateCommand' 'Deezer.UI.DelegateCommand' (HashCode=15035499). BindingExpression: Path='PlayCommand.CanExecute' DataItem='Deezer.DeezerAudioViewModel' (HashCode=1101770); target element is 'System.Windows.Controls.Button' (Name=''); target property is 'IsEnabled' (type 'System.Boolean').. System.Windows.Data Error: BindingExpression path error: 'CanExecute' property not found on 'Deezer.UI.DelegateCommand' 'Deezer.UI.DelegateCommand' (HashCode=9915935). BindingExpression: Path='PauseCommand.CanExecute' DataItem='Deezer.DeezerAudioViewModel' (HashCode=1101770); target element is 'System.Windows.Controls.Button' (Name=''); target property is 'IsEnabled' (type 'System.Boolean').. [15:18:22] App : DAVM Update Shuffle repeat status 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Globalization.ni.dll'. Cannot find or open the PDB file. 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Collections.ni.dll'. Cannot find or open the PDB file. 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.IO.ni.dll'. Cannot find or open the PDB file. $$$$$$$$$$$$$$$$$$ HasAccessToDeezer> result=True, request took (ms): 1136 [15:18:22] DeezerRuntimeSettings : UpdateInternetAccess: [forced=False] before=True, after=True ROOT FRAME NAVIGATING (uri='/Login') BOOTSCREEN> ManageUnloggedUser - Time elapsed (ms): 1160 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Linq.ni.dll'. Cannot find or open the PDB file. BOOTSCREEN> END - Time elapsed (ms): 1252<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +++++++++++++++++++++++ PAGE CREATED 'LoginPage' +++++++++++++++++++++++ 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Reflection.ni.dll'. Cannot find or open the PDB file. 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\Data\Programs\{0AC0860A-B966-4004-817C-8AB50BD22511}\Install\microsoft.expression.drawing.DLL'. Cannot find or open the PDB file. 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Runtime.Extensions.ni.dll'. Cannot find or open the PDB file. 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Threading.ni.dll'. Cannot find or open the PDB file. 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Dynamic.Runtime.ni.dll'. Cannot find or open the PDB file. 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Linq.Expressions.ni.dll'. Cannot find or open the PDB file. [15:18:23] App : >>>>>>>>>>>>>>>>>>>>>>>>>> Resetting Navigation Stack (removeHome=True) <<<<<<<<<<<<<<<<<<<<<<<< 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.ServiceModel.Web.ni.dll'. Cannot find or open the PDB file. [15:18:23] DeezerDataProvider : MobileAuthenticate(buildId=WindowsPhone8, version=2.4.0.0, lang=us) 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Reflection.Extensions.ni.dll'. Cannot find or open the PDB file. [15:18:23] HttpDataClient : ExecuteQuery(uri=http://api.deezer.com/1.0/gateway.php?method=mobile.auth&api_key=4VCYIJUCDLOUELGD1V8WBVYBNVDYOXEWSLLZDONGBBDFVXTZJRXPR29JRLQFO6ZE&output=3&buildId=WindowsPhone8&version=2.4.0.0&operator=Fake GSM Network&lang=us, postData=) 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.ObjectModel.ni.dll'. Cannot find or open the PDB file. 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Xml.XDocument.ni.dll'. Cannot find or open the PDB file. 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Text.RegularExpressions.ni.dll'. Cannot find or open the PDB file. 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'Anonymously Hosted DynamicMethods Assembly'. [15:18:25] DeezerDataProvider : >>>>>>>>>>>>>>>>>>>>>>> DataServerUrl changed -> doing a mobile_auth on new server. [15:18:25] DeezerDataProvider : MobileAuthenticate(buildId=WindowsPhone8, version=2.4.0.0, lang=us) [15:18:25] HttpDataClient : ExecuteQuery(uri=https://api.deezer.com/1.0/gateway.php?method=mobile.auth&api_key=4VCYIJUCDLOUELGD1V8WBVYBNVDYOXEWSLLZDONGBBDFVXTZJRXPR29JRLQFO6ZE&output=3&buildId=WindowsPhone8&version=2.4.0.0&operator=Fake GSM Network&lang=us, postData=)
  8. @cmaneu Key metrics ideas • Think about the metrics at

    feature conception stage • Any team member should be able to query/build on top of these metrics
  9. @cmaneu Let’s build our own logging system We can build

    our own deployment engine Sure, I can build the push notification backend We’ll create our own HTTP client library
  10. @cmaneu Which service you’ll not build yourself? • Exceptions Telemtry

    • Logging • Email gateway • SMS / Push notifications gateway • Payment processing • User management • CD/CI agents • DNS Servers • Search • Content moderation • Personalization (if not core business) • SSH Bastions • In-App Chat
  11. @cmaneu Use existing tools, prepare for replacement public interface ITelemetryService

    : INotifyPropertyChanged { void SetUserId(string userId); void TrackPageView(string pageName); void TrackPageView(string pageName, IDictionary<string, string> parameters); void TrackException(Exception ex); void TrackException(Exception ex, string message); void TrackException(Exception ex, string message, bool isFatal); void TrackEvent(string eventName); void TrackEvent(string eventName, IDictionary<string, string> properties); void Trace(string message); void Trace(string format, params object[] arguments); void SendAllData(); } internal sealed class AppInsightsTelemetryService : ITelemetryService { public async void TrackException(Exception ex, string message, bool isFatal) { // For now, all data are not send in an ExceptionTelemetry // We send it also as a custom event Dictionary<string, string> properties = new Dictionary<string, string>(); properties.Add("a.env", _appConfiguration.Environment.ToString()); properties.Add("Type", ex.GetType().ToString()); properties.Add("Message", message); properties.Add("RawException", ex.ToString()); properties.Add("StackTrace", ex.StackTrace); ulong appMemoryUsage = MemoryManager.AppMemoryUsage / 1024 / 1024; ulong appMemoryUsageLimit = MemoryManager.AppMemoryUsageLimit / 1024 / 1024; properties.Add("d.memused", appMemoryUsage.ToString());
  12. @cmaneu Use “off-the-shelf” APIs and services When a document is

    uploaded, categorize it If it’s a picture of someone, check quality If we already have a picture on another document, check if it’s the same person If it’s an official document, get specific fields values for the database When all documents have been uploaded, send a confirmation email
  13. @cmaneu Interesting Azure Services for your Startup • User Management:

    Azure AD B2C • AI: Cognitive Services • Data Exploration: Azure Data Explorer • Data: Hosted MySQL, MariaDB, PostgreSQL, SQL Server, MongoDB (CosmosDB), … • Blockchain: Azure Blockchain Service & Workbench • Static websites: Azure Static Web Apps • Distributed config & secrets: App Configuration & Key Vault • Monitoring: Azure Monitor, Application Insights, … • Maps: Azure Maps, • And a lot more: App Service, API Management, Containers, DNS, CDN, ….
  14. @cmaneu Sometimes, you may need to build things outside your

    business Permanent link to this comic: https://xkcd.com/1205/
  15. @cmaneu Create a dedicated channel Everybody can ask (dumb) questions

    Everyone is invited to answer them If the answer is in a doc, point to the doc Pro-Tip check for answered questions Put them in a KB / in a chatbot !
  16. @cmaneu What a dev needs to know? • Big picture

    • Collaboration • Code • Workflow • Security • Quality • Dependencies • First tasks • Monitoring • Code reviews • Troubleshooting guides • Sharing code • OSS policy • Moonlighting policy • Team schedule • …
  17. @cmaneu Create a contributing.md • Coding conventions • Styleguides •

    Reporting bug/features • Definition of done • Testing • Pull requests rules • How to ask questions
  18. @cmaneu Use new hires to detect improvments • Via a

    « rapport d’étonnement » • Get newly hires to have a 10min presentation about an area of improvement they’ve seen in their first 90 days
  19. Image credits Photo by William Warby on Unsplash Photo by

    Paul Skorupskas on Unsplash Photo by jesse orrico on Unsplash