Successfully reported this slideshow.
Your SlideShare is downloading. ×

Don't Rely On Discipline

Upcoming SlideShare
Building robust REST APIs
Building robust REST APIs
Loading in …3
×

Check these out next

1 of 54 Ad
1 of 54 Ad

Don't Rely On Discipline

Download to read offline

In the programming field we often rely on discipline. We expect from ourselves and from others that we will not introduce bugs and cause problems. That we will use the libraries and APIs as they are intended. That we will not cut corners.

Sadly, tales from the industry tell us otherwise.

This talk explores why we should not rely on discipline as a bouncer against bugs, and what to rely on instead.

https://pycon.it/en/talk/dont-rely-on-discipline?day=2022-06-05

In the programming field we often rely on discipline. We expect from ourselves and from others that we will not introduce bugs and cause problems. That we will use the libraries and APIs as they are intended. That we will not cut corners.

Sadly, tales from the industry tell us otherwise.

This talk explores why we should not rely on discipline as a bouncer against bugs, and what to rely on instead.

https://pycon.it/en/talk/dont-rely-on-discipline?day=2022-06-05

Advertisement
Advertisement

More Related Content

Advertisement

Don't Rely On Discipline

  1. 1. Don’t Rely On Discipline Neyts Zupan — @nzupan https://paretosecurity.com
  2. 2. @nzupan
  3. 3. @nzupan
  4. 4. Types are the “unit-tests” of the coming decade @nzupan
  5. 5. class Person: def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self): grandparents = [] grandparents.append(self.mother.mother) grandparents.append(self.mother.father) grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents @nzupan https://github.com/zupo/discipline
  6. 6. jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) @nzupan
  7. 7. def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] @nzupan
  8. 8. class Person: def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self): grandparents = [] grandparents.append(self.mother.mother) grandparents.append(self.mother.father) grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] @nzupan
  9. 9. class Person: def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self): grandparents = [] grandparents.append(self.mother.mother) grandparents.append(self.mother.father) grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] @nzupan
  10. 10. class Person: def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self): grandparents = [] grandparents.append(self.mother.mother) grandparents.append(self.mother.father) grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] @nzupan
  11. 11. class Person: def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self): grandparents = [] grandparents.append(self.mother.mother) grandparents.append(self.mother.father) grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] >>> han.grandparents Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/zupo/work/discipline/step1.py", line 13, in grandparents grandparents.append(self.mother.mother) AttributeError: 'NoneType' object has no attribute 'mother' @nzupan
  12. 12. import typing as t class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self: Person): grandparents = [] grandparents.append(self.mother.mother) grandparents.append(self.mother.father) grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents @nzupan
  13. 13. jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] import typing as t class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self: Person): grandparents = [] grandparents.append(self.mother.mother) grandparents.append(self.mother.father) grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents @nzupan
  14. 14. jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] import typing as t class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self: Person): grandparents = [] grandparents.append(self.mother.mother) grandparents.append(self.mother.father) grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents @nzupan
  15. 15. jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] $ mypy step2.py step2.py:21: error: Item "None" of "Optional[Person]" has no attribute "mother" step2.py:22: error: Item "None" of "Optional[Person]" has no attribute "father" step2.py:23: error: Item "None" of "Optional[Person]" has no attribute "mother" step2.py:24: error: Item "None" of "Optional[Person]" has no attribute "father" Found 4 errors in 1 file (checked 1 source file) import typing as t class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self: Person): grandparents = [] grandparents.append(self.mother.mother) grandparents.append(self.mother.father) grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents @nzupan
  16. 16. import typing as t class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self: Person): grandparents = [] if self.mother: grandparents.append(self.mother.mother) grandparents.append(self.mother.father) if self.father: grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents
  17. 17. jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] assert han.grandparents == [] import typing as t class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self: Person): grandparents = [] if self.mother: grandparents.append(self.mother.mother) grandparents.append(self.mother.father) if self.father: grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents @nzupan
  18. 18. jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] assert han.grandparents == [] import typing as t class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self: Person): grandparents = [] if self.mother: grandparents.append(self.mother.mother) grandparents.append(self.mother.father) if self.father: grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents @nzupan
  19. 19. jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] assert han.grandparents == [] import typing as t class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self: Person): grandparents = [] if self.mother: grandparents.append(self.mother.mother) grandparents.append(self.mother.father) if self.father: grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents @nzupan
  20. 20. import typing as t class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self: Person) -> t.List[Person]: grandparents = [] if self.mother: grandparents.append(self.mother.mother) grandparents.append(self.mother.father) if self.father: grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents
  21. 21. jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] assert han.grandparents == [] import typing as t class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self: Person) -> t.List[Person]: grandparents = [] if self.mother: grandparents.append(self.mother.mother) grandparents.append(self.mother.father) if self.father: grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents @nzupan
  22. 22. jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] assert han.grandparents == [] import typing as t class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self: Person) -> t.List[Person]: grandparents = [] if self.mother: grandparents.append(self.mother.mother) grandparents.append(self.mother.father) if self.father: grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents @nzupan
  23. 23. $ mypy step4.py step4.py:26: error: Incompatible return value type (got “List[Optional[Person]]", expected "List[Person]") Found 1 error in 1 file (checked 1 source file) import typing as t class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self: Person) -> t.List[Person]: grandparents = [] if self.mother: grandparents.append(self.mother.mother) grandparents.append(self.mother.father) if self.father: grandparents.append(self.father.mother) grandparents.append(self.father.father) return grandparents jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] assert han.grandparents == []
  24. 24. class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self: Person) -> t.List[Person]: grandparents = [] if self.mother: grandparents.append(self.mother.mother) grandparents.append(self.mother.father) if self.father: grandparents.append(self.father.mother) grandparents.append(self.father.father) return [ person for person in grandparents if person is not None ]
  25. 25. jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] assert han.grandparents == [] assert kylo.grandparents == [padme, anakin] import typing as t class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def grandparents(self: Person) -> t.List[Person]: grandparents = [] if self.mother: grandparents.append(self.mother.mother) grandparents.append(self.mother.father) if self.father: grandparents.append(self.father.mother) grandparents.append(self.father.father) return [ person for person in grandparents if person is not None ] @nzupan
  26. 26. jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] assert han.grandparents == [] assert kylo.grandparents == [padme, anakin] def test_json(): assert ( json.dumps(han.json) == '{"name": "Han Solo", "mother": null, "father": null}' ) class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def json(self) -> t.Dict[str, t.Optional[str]]: return { "name": self.name, "mother": self.mother.name if self.mother else None, "father": self.father.name if self.father else None, } @property def grandparents(self: Person) -> t.List[Person]: grandparents = [] if self.mother: grandparents.append(self.mother.mother) grandparents.append(self.mother.father) if self.father: grandparents.append(self.father.mother) grandparents.append(self.father.father) return [ person for person in grandparents if person is not None ]
  27. 27. jobal = Person("Jobal Naberrie") ruwee = Person("Ruwee Naberrie") padme = Person("Padme Amidala", mother=jobal, father=ruwee) shmi = Person("Shmi Skywalker Lars") force = Person("The Force") anakin = Person("Anakin Skywalker", mother=shmi, father=force) luke = Person("Luke Skywalker", mother=padme, father=anakin) leia = Person("Leia Organa", mother=padme, father=anakin) han = Person("Han Solo") kylo = Person("Kylo Ren", mother=leia, father=han) def test_person(): foo = Person("foo") assert f"{foo}" == "foo" assert foo.name == "foo" def test_grandparents(): assert luke.grandparents == [jobal, ruwee, shmi, force] assert han.grandparents == [] assert kylo.grandparents == [padme, anakin] def test_json(): assert ( json.dumps(han.json) == '{"name": "Han Solo", "mother": null, "father": null}' ) class Person: mother: t.Optional[Person] 
 father: t.Optional[Person] def __init__(self, name, mother=None, father=None): self.name = name self.mother = mother self.father = father def __repr__(self): return self.name @property def json(self) -> t.Dict[str, t.Optional[str]]: return { "name": self.name, "mother": self.mother.name if self.mother else None, "father": self.father.name if self.father else None, } @property def grandparents(self: Person) -> t.List[Person]: grandparents = [] if self.mother: grandparents.append(self.mother.mother) grandparents.append(self.mother.father) if self.father: grandparents.append(self.father.mother) grandparents.append(self.father.father) return [ person for person in grandparents if person is not None ]
  28. 28. from __future__ import annotations import json import typing as t class Person: mother: t.Optional[Person] father: t.Optional[Person] def __init__( self, name: str, mother: t.Optional[Person] = None, father: t.Optional[Person] = None, ) -> None: self.name = name self.mother = mother self.father = father def __repr__(self: Person) -> str: return self.name @property def json(self: Person) -> t.Dict[str, t.Optional[str]]: return { "name": self.name, "mother": self.mother.name if self.mother else None, "father": self.father.name if self.father else None, } @property def grandparents(self: Person) -> t.List[Person]: grandparents = [] if self.mother: grandparents.append(self.mother.mother) grandparents.append(self.mother.father) if self.father: grandparents.append(self.father.mother) grandparents.append(self.father.father) return [ person for person in grandparents if person is not None ] @nzupan
  29. 29. @nzupan
  30. 30. Documentation is bad, m’kay @nzupan
  31. 31. @nzupan
  32. 32. @nzupan
  33. 33. @nzupan
  34. 34. @nzupan
  35. 35. @nzupan
  36. 36. @nzupan
  37. 37. -Oh no … Homebrew does not have this lib that I need, now what :( -Gawd, need to install 15 system-wide C-based dependencies just to try this Python graphing lib -What is this “libfoo” doing in my /var/lib, is it a leftover from an ancient project and can be removed? -“Works on my machine” ¯_(ツ)_/¯ -New contractor needs help setting up their local dev env … there goes my day :(
  38. 38. -Every ~3 months nuke my Python from orbit: -strange Homebrew / pyenv permission errors -strange bugs or failing tests -completely broken side project
  39. 39. @nzupan https://niteo.co/blog/project- isolation-beyond-requirements-txt
  40. 40. @nzupan
  41. 41. @nzupan
  42. 42. “PYCONIT” for 30% o f https://paretosecurity.com
  43. 43. https://github.com/pylons/ pyramid_openapi3
  44. 44. @nzupan
  45. 45. @nzupan
  46. 46. Neyts Zupan — @nzupan https://paretosecurity.com Something needs documenting? Write code instead!

×