Slide 1

Slide 1 text

Engineering Culture What is it? What makes it great? Wednesday, October 9, 13

Slide 2

Slide 2 text

What I learnt in college artificial intelligence graphics java data structures algorithms calculus C++ databases networking how to write code Wednesday, October 9, 13

Slide 3

Slide 3 text

...What I didn’t learn how to write code *for a company* communication code reviews conventions release process testing post mortems documentation onboarding Wednesday, October 9, 13

Slide 4

Slide 4 text

Different goals College Company Prove that we understand a concept or mastered a skill. 1. Create a product that makes users happy. 2. Create a codebase that’s maintainable and not fragile. 3. Be intellectually excited by what we’re working on. 4. Do it with limited time and resources. As fast and lean as possible. Wednesday, October 9, 13

Slide 5

Slide 5 text

That’s a lot to achieve... 1. Create a product that makes users happy. 2. Create a codebase that’s maintainable and not fragile. 3. Be intellectually excited by what we’re working on. 4. Do it with limited time and resources. As fast and lean as possible. And that’s why culture matters. Wednesday, October 9, 13

Slide 6

Slide 6 text

Why should culture matter to you? Wednesday, October 9, 13

Slide 7

Slide 7 text

Are you about to enter the job market? Don’t join a company just for their product. Join for their culture. Wednesday, October 9, 13

Slide 8

Slide 8 text

Are you a founding engineer? You are shaping the culture for all the engineers that will come after you. Make it a good one. Wednesday, October 9, 13

Slide 9

Slide 9 text

Are you in an established culture? You still have the power to change the culture. Nothing is set in stone. Wednesday, October 9, 13

Slide 10

Slide 10 text

My Experience Wednesday, October 9, 13

Slide 11

Slide 11 text

Joined when Google was X years old. Spent 5 years in developer relations Wednesday, October 9, 13

Slide 12

Slide 12 text

Joined when Coursera was 5 months old. 1 year as Frontend Engineer Wednesday, October 9, 13

Slide 13

Slide 13 text

Joined when KA was 2 years old. 2 months (so far!) as engineer/educator. Wednesday, October 9, 13

Slide 14

Slide 14 text

What makes a culture? Wednesday, October 9, 13

Slide 15

Slide 15 text

The Engineering Lifecycle Onboarding Writing Code: * Understanding existing code * Planning your code * Writing consistent code * Testing your code * Improving your code * Releasing your code * Monitoring your code * Learning from bad code while(1) { writeCode(); } Wednesday, October 9, 13

Slide 16

Slide 16 text

Onboarding Bad culture: Treats your first week as “initiation”. Good culture: Values getting everyone over the beginners hump with as many resources as possible. Wednesday, October 9, 13

Slide 17

Slide 17 text

On-boarding Monday: Morning: - Talks: Overview, HR - Take Photos for Team Page Lunch: Show & Tell Afternoon: - Talk: Backend Architecture - Talk: Frontend Architecture - Talk: Code Review Process - Deploy first change together! - Meet your team Tuesday: - Work on a small change - Deploy small change Wednesday-Friday: - Pick first big project - Brainstorming meetings with designers - Begin working on it! Wednesday, October 9, 13

Slide 18

Slide 18 text

On-boarding https://sites.google.com/a/khanacademy.org/forge/for-khan-employees/-new-employees-onboard-doc/developer-setup Self-paced on-boarding: On-demand help: Wednesday, October 9, 13

Slide 19

Slide 19 text

Understanding the current code Bad culture: Expects everyone to just “figure it out.” Good culture: Values over-communication about what the code does, and why it does it that way. Wednesday, October 9, 13

Slide 20

Slide 20 text

Comments # Deprecated - this is true if the problem was done while in # context-switching topic mode, which has since been removed from the site. # TODO(benkomalo): Remove when all references are dead topic_mode = db.BooleanProperty(indexed=False, default=False) def consume_optional_goog_info(self, goog_user): """Assigns user information from Google to this UserData. Does not call put() on this entity and expects callers to do so. Args: goog_user An instance of google.appengine.api.users.User Returns: whether or not fields were consumed and this entity was modified """ import feature_flags.infection # sad circular dependency fix :( """Holds UserData, UniqueUsername, NicknameIndex UserData: database entity holding information about a single registered user UniqueUsername: database entity of usernames that've been set on profile pages NicknameIndex: database entity allowing search for users by their nicknames """ module function TODOs + deprecation Sadness Wednesday, October 9, 13

Slide 21

Slide 21 text

High-level Docs http://blog.pamelafox.org/2013/07/rewriting-django-admin-in-backbone.html http://blog.pamelafox.org/2013/03/rewriting-our-forums-with-backbone.html http://www.youtube.com/watch?v=hgZWMSDl0P8 Wednesday, October 9, 13

Slide 22

Slide 22 text

Writing consistent code Bad culture: Doesn’t care how the code is written, as long as it works. Good culture: Values a codebase where the code looks the same and seems to all belong together. Wednesday, October 9, 13

Slide 23

Slide 23 text

https://sites.google.com/a/khanacademy.org/forge/for-developers/styleguide >> git commit Linting... LINT OKAY: No lint problems Guides Tools + Language Style Wednesday, October 9, 13

Slide 24

Slide 24 text

Design Style • coursera: com • http://khanacademy.org/style Guides Re-usable CSS + // Typography @baseFontSize: 13px; @baseFontFamily: MuseoSans300, "Helvetica Neue", Helvetica, Arial, sans- serif; @baseLineHeight: 22px; @textColor: #444; @lightTextColor: #898989; @fontSizeTiny: 11px; @fontSizeSmall: 12px; @fontSizeNormal: 14px; @fontSizeMedium: 16px; @fontSizeLarge: 18px; @fontSizeExtraLarge: 24px; @fontSizeHuge: 36px; // Buttons @primaryButtonBackground: #89b908; @primaryButtonBorder: #76a005; @buttonTextColor: lighten(@grayDark, 15%); @buttonBorderRadius: 3px; Wednesday, October 9, 13

Slide 25

Slide 25 text

Best Practices http://blog.pamelafox.org/2013/07/a-guide-to-writing-backbone-apps-at.html http://blog.pamelafox.org/2013/08/javascript-ui-library-design.html Architecture Tools/Libraries APIs ...and tons more. Wednesday, October 9, 13

Slide 26

Slide 26 text

Writing consistent code Do you follow standard conventions for every language in their stack? Do you have your own conventions for the frameworks you use? Wednesday, October 9, 13

Slide 27

Slide 27 text

Testing your code Testing your code Bad culture: Expects you to write “safe” code, that’s magically free of bugs because you’re all so smart. Good culture: Realizes that tests are the key to a stable and maintainable codebase. Wednesday, October 9, 13

Slide 28

Slide 28 text

Backend: Python/Django unit tests Testing Code http://blog.pamelafox.org/2013/06/testing-backbone-frontends.html Frontend: Mocha/Chai/JSDom Integration: Selenium* Manual: QA Process, Engineer, and Team Automated tests CI + Wednesday, October 9, 13

Slide 29

Slide 29 text

Testing Code Test education Test engineers http://googletesting.blogspot.com/2007/01/introducing-testing-on-toilet.html https://www.google.com/about/jobs/search/#!t=jo&jid=35182& Wednesday, October 9, 13

Slide 30

Slide 30 text

Testing your code Testing your code Are there any tests? What kind of tests? How often are the tests run? Is there a testing requirement for new features? Is there a testing engineer or testing team? Wednesday, October 9, 13

Slide 31

Slide 31 text

Improving your code Bad culture: Gives you no feedback on your code or gives you non-constructive criticism on your code. Good culture: Recognizes that code reviews are a great way for everyone to learn from each other. Wednesday, October 9, 13

Slide 32

Slide 32 text

Code Reviews http://phabricator.org/ >> arc diff >> arc land --onto master Tools Wednesday, October 9, 13

Slide 33

Slide 33 text

Code Reviews https://sites.google.com/a/khanacademy.org/forge/for-developers/code-review-policy + Docs Wednesday, October 9, 13

Slide 34

Slide 34 text

Improving your code Are code reviews a part of the engineering process? Are code reviews *required*? What tool do you use for code reviews? Wednesday, October 9, 13

Slide 35

Slide 35 text

Releasing your code Bad culture: Makes it hard to release code early and often. Good culture: Enables everyone to release their code with minimal time and pain. Wednesday, October 9, 13

Slide 36

Slide 36 text

Release Process http://betacs.pro/blog/2013/07/06/wayland/ 8 minutes to deploy 2 minutes to rollback Wednesday, October 9, 13

Slide 37

Slide 37 text

Releasing your code How often is code deployed? How fast is the process? How fast is the rollback? Who's in charge of a deploy? Wednesday, October 9, 13

Slide 38

Slide 38 text

Monitoring your code Bad culture: Releases code without paying attention to how it fares in the wild. Good culture: Recognizes the value of logging, alerts, and user feedback mechanisms to ensure code validity. Wednesday, October 9, 13

Slide 39

Slide 39 text

Monitoring Backend monitoring + Alerts Wednesday, October 9, 13

Slide 40

Slide 40 text

Monitoring Frontend monitoring User feedback alerts Wednesday, October 9, 13

Slide 41

Slide 41 text

Monitoring your code Are backend and frontend errors monitored? Are there user feedback mechanisms? Are there smart alerts set up? Wednesday, October 9, 13

Slide 42

Slide 42 text

Learning from bad code Bad culture: Sweeps mistakes under the rug, refusing to acknowledge or learn from them, or blames them on a bad coder. Good culture: Realizes that mistakes are an opportunity for the *whole team* to learn and improve. Wednesday, October 9, 13

Slide 43

Slide 43 text

Post-Mortems • Timeline of events • What went wrong? • What went right? • What specific action items would prevent this from happening in the future? https://groups.google.com/forum/#!topic/google-appengine/p2QKJ0OSLc8 Don’t blame. Learn. Wednesday, October 9, 13

Slide 44

Slide 44 text

Post-Mortems • Coding bugs: “The Mass Unenrollment” • Server faults: “The Overloaded Database” • Security issues: “Cross-site-scripting in PHP” • Process flaws: “The Class Recyling Project” Wednesday, October 9, 13

Slide 45

Slide 45 text

Learning from your code When bad decisions are made in code, how does the the team learn from them? Wednesday, October 9, 13

Slide 46

Slide 46 text

Now what? Learn from others Share with your team Experiment Share with others “Team Geek” by Fitzpatrick and Collins-Sussman http://blog.pamelafox.org/2013/07/what-to-look-for-in-software.html http://www.joelonsoftware.com/articles/fog0000000043.html Wednesday, October 9, 13

Slide 47

Slide 47 text

The culture matters as much as the product. Wednesday, October 9, 13

Slide 48

Slide 48 text

THAR! Here be dragons! Wednesday, October 9, 13

Slide 49

Slide 49 text

Planning your code Bad culture: Expects great code to emerge with no thought or collaboration. Good culture: Values the process of planning code. Wednesday, October 9, 13

Slide 50

Slide 50 text

Design Docs • google template? • can happen in a jira discussion Wednesday, October 9, 13

Slide 51

Slide 51 text

Design Discussions • whiteboard Wednesday, October 9, 13