{"url":"https://api.github.com/gists/3177c39a5b9b9c1012ea9ba9aee686b3","forks_url":"https://api.github.com/gists/3177c39a5b9b9c1012ea9ba9aee686b3/forks","commits_url":"https://api.github.com/gists/3177c39a5b9b9c1012ea9ba9aee686b3/commits","id":"3177c39a5b9b9c1012ea9ba9aee686b3","node_id":"MDQ6R2lzdDMxNzdjMzlhNWI5YjljMTAxMmVhOWJhOWFlZTY4NmIz","git_pull_url":"https://gist.github.com/3177c39a5b9b9c1012ea9ba9aee686b3.git","git_push_url":"https://gist.github.com/3177c39a5b9b9c1012ea9ba9aee686b3.git","html_url":"https://gist.github.com/michaellihs/3177c39a5b9b9c1012ea9ba9aee686b3","files":{"devops-principles.md":{"filename":"devops-principles.md","type":"text/markdown","language":"Markdown","raw_url":"https://gist.githubusercontent.com/michaellihs/3177c39a5b9b9c1012ea9ba9aee686b3/raw/3c42aac2182d645a6f9eb0c110356348ea2914d0/devops-principles.md","size":6076,"truncated":false,"content":"DevOps Principles\n=================\n\nMotivation: Assembly line\n-------------------------\n\n* try to get product on the road as fast as possible\n* every delay costs money\n* try to identify and eliminate bottlenecks\n* KPI: lead time\n* establish the Flow of things\n\n\nDevOps = more than Dev & Ops\n----------------------------\n\n* collaboration of Dev & Ops\n* DevOps does not (necessarily) mean building up your whole tech stack on bare metal\n  * provide self-service automation\n* DevOps is\n  * Culture / Collaboration\n  * Techniques\n  * Tools\n\n\nDevOps Prerequisites\n--------------------\n\n* Infrastructure automation\n  * or at least well defined (automated) interfaces for Ops services\n* Ops knowledge in Dev teams\n* high level of automation\n\n\nRecruiting of team members\n--------------------------\n\n* T-Shaped people\n* certain Ops knowledge\n* identify required skills and possible gaps with skills in team\n  * tech radar / skill radar\n\n\nArchitecture of Applications\n----------------------------\n\n* have cloud native in mind\n* 12-factor apps\n* have backing services in mind\n\n\nDevelopment of Applications\n---------------------------\n\n* Pairing\n  * avoid knowledge bottlenecks\n  * everybody in the team knows the codebase\n  * Rookie + Ninja\n* Put EVERYTHING in version control\n  * make changes transparent\n  * enable roll backs, even for infrastructure\n* code reviews\n  * knowledge sharing\n  * enable feedback loop\n* keep dev, prod and test as similar as possible\n  * avoid surprise in production\n  * get early feedback\n\n\nDeployment of Applications\n--------------------------\n\n* automate everything\n* start with documentation\n  * iterate by letting people do the job who were not involved initially\n  * refactor and refine documentation\n  * after manual review, automate it\n\n\nDev & Ops in Agile Workflows\n----------------------------\n\n* Important: identify and reduce unplanned work\n  * make work visible and transparent\n  * all tasks on the board\n* rotating Ops\n  * everybody has to do it & learn from Ops\n  * refine documentation and processe\n  * do not let Ops tasks destroy your sprint planning\n* establish Ops --> Dev feedback loop\n  * have Ops in mind during development\n* identify bottlenecks and root causes and consequently eliminate them\n  * improve automation\n  * establish self-services\n  * discuss requirements with Ops\n\n\nFeedback\n--------\n\n* Establish and speed up feedback loops\n* Pair Programming\n* Code Reviews\n* Continuous Integration / automated tests\n* Continuous Delivery / fast feedback from customers\n\n\nLEAN Approaches\n---------------\n\n* Visualize your work (Kanban Board)\n* Identify Bottlenecks\n* Reduce Handoffs\n* Small Batches\n* WIP Limits\n* MVPs\n* 5 Whys\n* Actionable metrics (AARRR)\n* Build-Measure-Learn --> speedup this cycle\n* Pivot or Persevere\n\n\nTools for DevOps\n----------------\n\n* Ticketing system\n  * define requirements\n  * define acceptance criteria\n  * document your work\n* Dev workspace -  Dev/Test/Prod parity\n  * Vagrant\n    * Dev & Prod parity (same OS, same configuration, same packages...)\n  * Docker\n    * e.g. for backing services\n    * e.g. for quickly spinning up database with sample data\n* Version Control\n  * provide transparent history of changes\n    * link (JIRA) tickets in commits\n    * write good user stories explaining what a change was made for\n  * set up code review workflow\n    * e.g. feature branches\n    * no commits to master without review\n    * establish a team guideline for what has to be checked in a code review\n* Continuous Integration server\n  * run automated tests with every commit\n  * make sure that merged features do not break the tests\n  * integrate (production-like) integration stages into your test suites\n* Configuration management\n  * keep your configuration in version control\n  * provide staging for configuration management as well\n* Artifact repositories\n  * build once, ship anywhere\n  * agree upon a versioning schema\n  * track versions in stages\n  * provide proper release notes\n    * what changes happend in a release\n    * support troubleshooting for Ops (which change might have caused an incident)\n* Deployment Server\n  * automate deployment (in any stage)\n  * put your deployment scripts in version control\n* PAM (credentials store, vault)\n  * central management of credentials\n  * least privilege principle\n* Monitoring --> pre-incident (get an alarm BEFORE something goes wrong)\n  * track all relevant KPIs / metrics\n  * have reasonable alarms on critical metrics\n  * introduce new metrics / checks as needed\n* Logging --> post incident (data for analyzing what went wrong after an incident)\n  * centeral log management\n  * provide all necessary data for easy debugging / analysing\n\n\nTeam tools for DevOps\n---------------------\n\n* motivate participation at meetups\n* have internal tech forums\n* introduce innovation days / hackathons\n* embrace (reasonable) introduction of new tools and technologies\n* do post mortems\n* continuous improvement by retrospectives\n* establish feedback loops\n\n\nResources\n=========\n\nOnline\n------\n\n* [Agile Manifesto](http://agilemanifesto.org/)\n* [Michael Lihs: Slides LEAN](http://michaellihs.github.io/showoff-presentation-lean/)\n* [Michael Lihs: Criteria for selecting CI/CD Tools](https://github.com/cicd-hackathon-stgt/docs)\n\n\nBooks\n-----\n\n### DevOps in General\n\n* [The Devops Handbook](https://itrevolution.com/book/the-devops-handbook/)\n* [Effectie DevOps](http://shop.oreilly.com/product/0636920039846.do)\n* [Site Reliability Engineering](http://shop.oreilly.com/product/0636920041528.do)\n* [The Phoenix Project](https://itrevolution.com/book/the-phoenix-project/)\n\n\n### Continuous Delivery / Continuous Integration\n\n* [Continuous Delivery](http://www.informit.com/store/continuous-delivery-reliable-software-releases-through-9780321770424?ranMID=24808)\n* [Release It!](https://pragprog.com/book/mnee2/release-it-second-edition)\n\n\n### LEAN\n\n* [Lean Bites](http://leanpub.com/lean-bites)\n* [Running Lean](http://ashmaurya.com/)\n* [Lean Enterprise](http://shop.oreilly.com/product/0636920030355.do)\n* [The Lean Startup](http://theleanstartup.com/book)\n","encoding":"utf-8"}},"public":true,"created_at":"2018-05-11T21:12:36Z","updated_at":"2025-07-10T19:37:08Z","description":"DevOps Principles","comments":4,"user":null,"comments_enabled":true,"comments_url":"https://api.github.com/gists/3177c39a5b9b9c1012ea9ba9aee686b3/comments","owner":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"forks":[{"url":"https://api.github.com/gists/f95afeea3c207dc3edc9f025e186a773","user":{"login":"jirikavi","id":5136908,"node_id":"MDQ6VXNlcjUxMzY5MDg=","avatar_url":"https://avatars.githubusercontent.com/u/5136908?v=4","gravatar_id":"","url":"https://api.github.com/users/jirikavi","html_url":"https://github.com/jirikavi","followers_url":"https://api.github.com/users/jirikavi/followers","following_url":"https://api.github.com/users/jirikavi/following{/other_user}","gists_url":"https://api.github.com/users/jirikavi/gists{/gist_id}","starred_url":"https://api.github.com/users/jirikavi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jirikavi/subscriptions","organizations_url":"https://api.github.com/users/jirikavi/orgs","repos_url":"https://api.github.com/users/jirikavi/repos","events_url":"https://api.github.com/users/jirikavi/events{/privacy}","received_events_url":"https://api.github.com/users/jirikavi/received_events","type":"User","user_view_type":"public","site_admin":false,"name":null,"company":null,"blog":"","location":null,"email":null,"hireable":null,"bio":null,"twitter_username":null,"public_repos":12,"public_gists":3,"followers":12,"following":0,"created_at":"2013-08-01T09:09:38Z","updated_at":"2026-01-31T08:21:57Z"},"id":"f95afeea3c207dc3edc9f025e186a773","created_at":"2018-10-26T22:07:17Z","updated_at":"2018-10-26T22:07:17Z"}],"history":[{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"809f5be13c634296d64fadbda1ac676f4e7b66f9","committed_at":"2018-05-22T13:29:57Z","change_status":{"total":73,"additions":69,"deletions":4},"url":"https://api.github.com/gists/3177c39a5b9b9c1012ea9ba9aee686b3/809f5be13c634296d64fadbda1ac676f4e7b66f9"},{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"442c49bff0e6d1ca05c441a1d5a9b5b2b1cab6d3","committed_at":"2018-05-11T21:30:02Z","change_status":{"total":16,"additions":15,"deletions":1},"url":"https://api.github.com/gists/3177c39a5b9b9c1012ea9ba9aee686b3/442c49bff0e6d1ca05c441a1d5a9b5b2b1cab6d3"},{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"e390ef4a95acc9b74bfcd3bfe89c4205a62ab8d9","committed_at":"2018-05-11T21:25:02Z","change_status":{"total":46,"additions":44,"deletions":2},"url":"https://api.github.com/gists/3177c39a5b9b9c1012ea9ba9aee686b3/e390ef4a95acc9b74bfcd3bfe89c4205a62ab8d9"},{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"d60bb5ec4be9cd470accf2914b09d9132b555437","committed_at":"2018-05-11T21:12:35Z","change_status":{"total":97,"additions":97,"deletions":0},"url":"https://api.github.com/gists/3177c39a5b9b9c1012ea9ba9aee686b3/d60bb5ec4be9cd470accf2914b09d9132b555437"}],"truncated":false}