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

    View Slide

  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

    View Slide

  3. @cmaneu
    Metrics for a
    better
    product
    Help people
    get productive
    Focus on tech
    relevant for
    your business

    View Slide

  4. @cmaneu
    Metrics for a
    better product

    View Slide

  5. @cmaneu

    View Slide

  6. @cmaneu
    The unexpected metric

    View Slide

  7. @cmaneu

    View Slide

  8. @cmaneu

    View Slide

  9. @cmaneu

    View Slide

  10. @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

    View Slide

  11. @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

    View Slide

  12. @cmaneu
    What happened?
    We knew we

    View Slide

  13. @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

    View Slide

  14. View Slide

  15. +++++++++++++++++++++++ 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=)

    View Slide

  16. Our Definition of Done

    View Slide

  17. Our Definition of Done

    View Slide

  18. @cmaneu
    Measure things early
    https://aka.ms/fast/insights

    View Slide

  19. @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

    View Slide

  20. @cmaneu
    Focus on tech
    relevant for your
    business

    View Slide

  21. @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

    View Slide

  22. @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

    View Slide

  23. @cmaneu
    Use existing tools, prepare for replacement
    public interface ITelemetryService : INotifyPropertyChanged
    {
    void SetUserId(string userId);
    void TrackPageView(string pageName);
    void TrackPageView(string pageName, IDictionary 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 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 properties = new Dictionary();
    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());

    View Slide

  24. @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

    View Slide

  25. @cmaneu
    Use “off-the-shelf” APIs and services

    View Slide

  26. @cmaneu
    Use “off-the-shelf” APIs and services

    View Slide

  27. @cmaneu
    Use “off-the-shelf” APIs and services

    View Slide

  28. @cmaneu
    Use “off-the-shelf” APIs and services

    View Slide

  29. @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, ….

    View Slide

  30. @cmaneu
    Sometimes, you may need to build things outside your business
    Permanent link to this comic: https://xkcd.com/1205/

    View Slide

  31. @cmaneu
    Sometimes, you may need to build things outside your business

    View Slide

  32. @cmaneu
    Sometimes, you may need to build things outside your business

    View Slide

  33. @cmaneu
    Help people get
    productive

    View Slide

  34. @cmaneu
    Companies are hiring devs
    faster than ever
    Companies are hiring
    more freelancers

    View Slide

  35. @cmaneu
    Ask within your teams
    Todo new dev.txt setup-dev.sh

    View Slide

  36. @cmaneu
    Start a shared notebook/wiki

    View Slide

  37. @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 !

    View Slide

  38. @cmaneu
    Create a private shortlinker
    How can we
    print something
    ?
    Aka.ms/printing

    View Slide

  39. @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
    • …

    View Slide

  40. @cmaneu
    Vive les patates !

    View Slide

  41. @cmaneu
    Vive les patates !

    View Slide

  42. @cmaneu
    Documentation – Engineering & product handbooks

    View Slide

  43. @cmaneu
    Create a contributing.md
    • Coding conventions
    • Styleguides
    • Reporting bug/features
    • Definition of done
    • Testing
    • Pull requests rules
    • How to ask questions

    View Slide

  44. @cmaneu
    Have some

    View Slide

  45. //demo
    Commit code into production
    on your first day!

    View Slide

  46. @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

    View Slide

  47. Q&A
    Christopher MANEU
    Azure Engineer & Advocate @ Microsoft R&D
    @cmaneu

    View Slide

  48. Thanks !
    Christopher MANEU
    Startups Cloud Advocate @ Microsoft
    @cmaneu
    Aka.ms/chris/slides

    View Slide

  49. Image credits
    Photo by William
    Warby on Unsplash
    Photo by Paul
    Skorupskas on Unsplash
    Photo by jesse orrico on Unsplash

    View Slide