From 46ec96a9b8590592b5348fcf23260323583b8b1e Mon Sep 17 00:00:00 2001 From: pintergreg Date: Sat, 23 Nov 2024 13:19:18 +0000 Subject: [PATCH] deploy: 55035065b580ecd7779dd001246d2c3adb45d2fd --- slides/mindmap.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/mindmap.html b/slides/mindmap.html index 8f18503..ff4b41f 100644 --- a/slides/mindmap.html +++ b/slides/mindmap.html @@ -2024,6 +2024,6 @@ (getOptions || markmap.deriveOptions)(jsonOptions), root2 ); - })(() => window.markmap,null,{"content":"software engineering","children":[{"content":"SDLC","children":[{"content":"waterfall","children":[{"content":"earliest SDLC model","children":[],"payload":{"lines":"5,6"}},{"content":"progress flows in one direction","children":[],"payload":{"lines":"6,7"}},{"content":"not iterative, not flexible","children":[],"payload":{"lines":"7,8"}},{"content":"linear, sequential phases","children":[],"payload":{"lines":"8,9"}},{"content":"later it was extended with feedback loops","children":[],"payload":{"lines":"9,11"}}],"payload":{"lines":"3,4"}},{"content":"V Model","children":[{"content":"rigid model","children":[],"payload":{"lines":"13,14"}},{"content":"each phase has output and a review process","children":[{"content":"errors are found at early stage","children":[],"payload":{"lines":"15,16"}},{"content":"decreases the risk of failure","children":[],"payload":{"lines":"16,17"}}],"payload":{"lines":"14,17"}},{"content":"large to small: testing is done in a hierarchical perspective","children":[],"payload":{"lines":"17,19"}}],"payload":{"lines":"11,12"}},{"content":"iterative model","children":[{"content":"software is built incrementally","children":[{"content":"with each iteration adding new features or refining existing ones","children":[],"payload":{"lines":"22,23"}}],"payload":{"lines":"21,23"}},{"content":"possible to get feedback after each iteration","children":[],"payload":{"lines":"23,24"}},{"content":"can be rigid within an iteration","children":[],"payload":{"lines":"24,26"}}],"payload":{"lines":"19,20"}},{"content":"agile","children":[{"content":"manifesto","children":[{"content":"individuals and interactions over processes and tools","children":[],"payload":{"lines":"30,31"}},{"content":"working software over comprehensive documentation","children":[],"payload":{"lines":"31,32"}},{"content":"customer collaboration over contract negotiation","children":[],"payload":{"lines":"32,33"}},{"content":"responding to change over following a plan","children":[],"payload":{"lines":"33,35"}}],"payload":{"lines":"28,29"}},{"content":"scrum","children":[{"content":"roles","children":[{"content":"scrum master","children":[{"content":"developer representative","children":[],"payload":{"lines":"39,40"}},{"content":"responsible for the scrum team’s effectiveness","children":[],"payload":{"lines":"40,41"}},{"content":"impediment handler","children":[],"payload":{"lines":"41,42"}},{"content":"ensures calm and uninterrupted working","children":[],"payload":{"lines":"42,43"}}],"payload":{"lines":"38,43"}},{"content":"product owner","children":[{"content":"customer representative","children":[],"payload":{"lines":"44,45"}},{"content":"creates product backlog","children":[],"payload":{"lines":"45,46"}},{"content":"prioritizes items in product backlog","children":[],"payload":{"lines":"46,47"}},{"content":"responsible for maximizing the value of the product","children":[],"payload":{"lines":"47,48"}}],"payload":{"lines":"43,48"}},{"content":"developer team","children":[{"content":"optimally 3 to 9 people","children":[],"payload":{"lines":"49,50"}},{"content":"self-organizing","children":[],"payload":{"lines":"50,51"}},{"content":"cross-functional","children":[],"payload":{"lines":"51,52"}}],"payload":{"lines":"48,52"}}],"payload":{"lines":"37,52"}},{"content":"epic","children":[{"content":"user story","children":[{"content":"task","children":[],"payload":{"lines":"54,55"}}],"payload":{"lines":"53,55"}}],"payload":{"lines":"52,55"}},{"content":"events","children":[{"content":"sprint planning","children":[{"content":"initiates the sprint","children":[],"payload":{"lines":"57,58"}},{"content":"max 8 hours for a four-week sprint","children":[],"payload":{"lines":"58,59"}},{"content":"defining sprint goal","children":[],"payload":{"lines":"59,60"}}],"payload":{"lines":"56,60"}},{"content":"sprint","children":[{"content":"1-4 week long","children":[],"payload":{"lines":"61,62"}},{"content":"considered a short project","children":[],"payload":{"lines":"62,63"}},{"content":"turns backlog items into increments","children":[],"payload":{"lines":"63,64"}},{"content":"includes daily scrum","children":[],"payload":{"lines":"64,65"}}],"payload":{"lines":"60,65"}},{"content":"daily standup","children":[{"content":"a.k.a. daily scrum","children":[],"payload":{"lines":"66,67"}},{"content":"3 questions","children":[],"payload":{"lines":"67,68"}},{"content":"timebox: 15 minutes","children":[],"payload":{"lines":"68,69"}},{"content":"always on the same time and at the same place","children":[],"payload":{"lines":"69,70"}},{"content":"standing up","children":[],"payload":{"lines":"70,71"}}],"payload":{"lines":"65,71"}},{"content":"backlog grooming","children":[{"content":"refinement of user story dod","children":[{"content":"smart goals","children":[],"payload":{"lines":"73,74"}}],"payload":{"lines":"72,74"}},{"content":"effort estimation","children":[],"payload":{"lines":"74,75"}}],"payload":{"lines":"71,75"}},{"content":"sprint review","children":[{"content":"a.k.a. demo","children":[],"payload":{"lines":"76,77"}},{"content":"scrum team presents the their work to the stakeholders","children":[],"payload":{"lines":"77,78"}},{"content":"increment is evaluated","children":[],"payload":{"lines":"78,79"}},{"content":"max 4 hours for a four-week sprint","children":[],"payload":{"lines":"79,80"}}],"payload":{"lines":"75,80"}},{"content":"retrospective","children":[{"content":"concludes the sprint","children":[],"payload":{"lines":"81,82"}},{"content":"max 3 hours for a four-week sprint","children":[],"payload":{"lines":"82,83"}},{"content":"retrospective starfish","children":[{"content":"start","children":[],"payload":{"lines":"84,85"}},{"content":"stop","children":[],"payload":{"lines":"85,86"}},{"content":"more","children":[],"payload":{"lines":"86,87"}},{"content":"less","children":[],"payload":{"lines":"87,88"}},{"content":"continue","children":[],"payload":{"lines":"88,89"}}],"payload":{"lines":"83,89"}}],"payload":{"lines":"80,89"}}],"payload":{"lines":"55,89"}},{"content":"artifacts","children":[{"content":"sprint backlog","children":[],"payload":{"lines":"90,91"}},{"content":"product backlog","children":[],"payload":{"lines":"91,92"}},{"content":"sprint goal","children":[],"payload":{"lines":"92,93"}},{"content":"definition of done","children":[],"payload":{"lines":"93,94"}},{"content":"burndown chart","children":[],"payload":{"lines":"94,95"}},{"content":"board","children":[],"payload":{"lines":"95,97"}}],"payload":{"lines":"89,97"}}],"payload":{"lines":"35,36"}},{"content":"kanban","children":[{"content":"pull-based system","children":[],"payload":{"lines":"99,100"}},{"content":"uses a visual workflow","children":[],"payload":{"lines":"100,101"}},{"content":"uses columns for states of the product","children":[],"payload":{"lines":"101,102"}},{"content":"continuous flow (not iterative)","children":[],"payload":{"lines":"102,103"}},{"content":"no roles, no events","children":[],"payload":{"lines":"103,104"}},{"content":"pick top right task","children":[],"payload":{"lines":"104,105"}},{"content":"encourages to improve the workflow","children":[],"payload":{"lines":"105,107"}}],"payload":{"lines":"97,98"}},{"content":"extreme programming","children":[{"content":"frequent releases, short development cycles","children":[],"payload":{"lines":"109,110"}},{"content":"intended to improve productivity and","children":[],"payload":{"lines":"110,111"}},{"content":"introduce checkpoints for customer requirements","children":[],"payload":{"lines":"111,112"}},{"content":"features","children":[{"content":"pair programming","children":[],"payload":{"lines":"113,114"}},{"content":"doing extensive code review","children":[],"payload":{"lines":"114,115"}},{"content":"unit testing of all code","children":[],"payload":{"lines":"115,116"}},{"content":"not programming features until they are actually needed","children":[],"payload":{"lines":"116,117"}},{"content":"flat management structure","children":[],"payload":{"lines":"117,119"}}],"payload":{"lines":"112,119"}}],"payload":{"lines":"107,108"}}],"payload":{"lines":"26,27"}}],"payload":{"lines":"1,2"}},{"content":"requirement analysis","children":[{"content":"user story mapping","children":[{"content":"performed in workshops","children":[],"payload":{"lines":"172,173"}},{"content":"build a shared understanding","children":[],"payload":{"lines":"173,174"}},{"content":"user story map","children":[{"content":"three levels","children":[{"content":"activities","children":[{"content":"big thing that users do","children":[],"payload":{"lines":"177,178"}},{"content":"has multiple steps","children":[],"payload":{"lines":"178,179"}},{"content":"not always has a precise workflow","children":[],"payload":{"lines":"179,180"}},{"content":"has roles","children":[],"payload":{"lines":"180,181"}}],"payload":{"lines":"176,181"}},{"content":"steps","children":[],"payload":{"lines":"181,182"}},{"content":"details","children":[],"payload":{"lines":"182,183"}}],"payload":{"lines":"175,183"}},{"content":"zooms from an overview to details","children":[],"payload":{"lines":"183,184"}},{"content":"multiple interations","children":[{"content":"living document","children":[],"payload":{"lines":"185,186"}},{"content":"versions","children":[],"payload":{"lines":"186,187"}}],"payload":{"lines":"184,187"}},{"content":"backbone","children":[],"payload":{"lines":"187,188"}},{"content":"skeleton","children":[],"payload":{"lines":"188,191"}}],"payload":{"lines":"174,191"}}],"payload":{"lines":"170,171"}}],"payload":{"lines":"119,120"}},{"content":"design","children":[{"content":"unified modelling language","children":[{"content":"structural diagrams","children":[{"content":"class","children":[{"content":"describes the structure of a system","children":[],"payload":{"lines":"197,198"}},{"content":"main building block of the object-oriented modeling","children":[],"payload":{"lines":"198,199"}}],"payload":{"lines":"196,199"}},{"content":"object","children":[{"content":"represents the objects and their relationships at a specific moment","children":[],"payload":{"lines":"200,201"}},{"content":"snapshot","children":[],"payload":{"lines":"201,202"}},{"content":"does not show anything architecturally different to class diagram","children":[],"payload":{"lines":"202,203"}}],"payload":{"lines":"199,203"}},{"content":"component","children":[{"content":"depicts the component structure and relations","children":[],"payload":{"lines":"204,205"}},{"content":"highlights the interfaces","children":[],"payload":{"lines":"205,206"}}],"payload":{"lines":"203,206"}}],"payload":{"lines":"195,206"}},{"content":"behavior diagrams","children":[{"content":"use case","children":[{"content":"depicts the interactions between system users","children":[],"payload":{"lines":"208,209"}},{"content":"high-level view","children":[],"payload":{"lines":"209,210"}},{"content":"similar to a user story","children":[],"payload":{"lines":"210,211"}},{"content":"helping stakeholders to understand the system's functionality","children":[],"payload":{"lines":"211,212"}}],"payload":{"lines":"207,212"}},{"content":"activity","children":[{"content":"represents workflows","children":[],"payload":{"lines":"213,214"}},{"content":"similar to flowchart","children":[],"payload":{"lines":"214,215"}},{"content":"parallel processing","children":[],"payload":{"lines":"215,216"}},{"content":"swimlanes","children":[],"payload":{"lines":"216,217"}}],"payload":{"lines":"212,217"}},{"content":"state machine","children":[{"content":"shows the states of a system","children":[],"payload":{"lines":"218,219"}},{"content":"shows transitions between states","children":[],"payload":{"lines":"219,220"}},{"content":"shows the system's life cycle","children":[],"payload":{"lines":"220,221"}}],"payload":{"lines":"217,221"}},{"content":"sequence","children":[{"content":"process interactions arranged in time sequence","children":[],"payload":{"lines":"222,223"}},{"content":"shows objects","children":[],"payload":{"lines":"223,224"}},{"content":"message exchange between software systems","children":[],"payload":{"lines":"224,225"}}],"payload":{"lines":"221,225"}},{"content":"timing","children":[{"content":"chronological order of events","children":[],"payload":{"lines":"226,227"}},{"content":"useful in real-time systems","children":[],"payload":{"lines":"227,228"}},{"content":"more like for documentation rather than modelling","children":[],"payload":{"lines":"228,230"}}],"payload":{"lines":"225,230"}}],"payload":{"lines":"206,230"}}],"payload":{"lines":"193,194"}},{"content":"C4","children":[{"content":"hierarchical set of software architecture diagrams","children":[],"payload":{"lines":"232,233"}},{"content":"has four levels","children":[{"content":"context","children":[{"content":"how the software fits into the world","children":[],"payload":{"lines":"235,236"}},{"content":"who use the software","children":[],"payload":{"lines":"236,237"}},{"content":"what other software interacts with","children":[],"payload":{"lines":"237,238"}},{"content":"similar to use case diagram","children":[],"payload":{"lines":"238,239"}},{"content":"understandable for non-technical people","children":[],"payload":{"lines":"239,240"}}],"payload":{"lines":"234,240"}},{"content":"containers","children":[{"content":"zooms into the software system, shows its parts","children":[],"payload":{"lines":"241,242"}},{"content":"technology decisions are a key part","children":[],"payload":{"lines":"242,243"}}],"payload":{"lines":"240,243"}},{"content":"components","children":[{"content":"decomposition of each container","children":[],"payload":{"lines":"244,245"}},{"content":"shows components, their interactions and responsibilities","children":[],"payload":{"lines":"245,246"}},{"content":"also shows technology / implementation details","children":[],"payload":{"lines":"246,247"}},{"content":"roughly equivalent with the UML component diagram","children":[],"payload":{"lines":"247,248"}}],"payload":{"lines":"243,248"}},{"content":"code","children":[{"content":"optional level of detail","children":[],"payload":{"lines":"249,250"}},{"content":"ideally automatically generated","children":[],"payload":{"lines":"250,251"}},{"content":"if required, it can zoom into an individual component","children":[],"payload":{"lines":"251,252"}},{"content":"but show only those attributes and methods that really needed for the storytelling","children":[],"payload":{"lines":"252,253"}},{"content":"UML class diagram can be used","children":[],"payload":{"lines":"253,255"}}],"payload":{"lines":"248,255"}}],"payload":{"lines":"233,255"}}],"payload":{"lines":"230,231"}},{"content":"wireframing","children":[{"content":"UI/UX designers' responsibility","children":[],"payload":{"lines":"257,258"}},{"content":"iterative process","children":[{"content":"presented to the stakeholders","children":[],"payload":{"lines":"259,260"}},{"content":"feedback","children":[],"payload":{"lines":"260,261"}}],"payload":{"lines":"258,261"}},{"content":"wireframe","children":[{"content":"outline / blueprint / concept art","children":[],"payload":{"lines":"262,263"}},{"content":"visual understanding","children":[{"content":"structure, layout, user flow, functionality and intended behaviours","children":[],"payload":{"lines":"264,265"}}],"payload":{"lines":"263,265"}},{"content":"low fidelity","children":[{"content":"first sketch","children":[],"payload":{"lines":"266,267"}},{"content":"simple","children":[],"payload":{"lines":"267,268"}},{"content":"don't include actual content","children":[],"payload":{"lines":"268,269"}},{"content":"don't consider scale or pixel accuracy","children":[],"payload":{"lines":"269,270"}},{"content":"can be hand-drawn","children":[],"payload":{"lines":"270,271"}}],"payload":{"lines":"265,271"}},{"content":"mid fidelity","children":[{"content":"more details","children":[],"payload":{"lines":"272,273"}},{"content":"usually no images, typography","children":[],"payload":{"lines":"273,274"}},{"content":"no colors, grayscale","children":[],"payload":{"lines":"274,275"}},{"content":"usually made with digital tool","children":[],"payload":{"lines":"275,276"}}],"payload":{"lines":"271,276"}},{"content":"high fidelity","children":[{"content":"finalising the design","children":[{"content":"can be an initial prototype","children":[],"payload":{"lines":"278,279"}}],"payload":{"lines":"277,279"}},{"content":"created using a digital tool","children":[],"payload":{"lines":"279,280"}},{"content":"pixel-specific layouts","children":[],"payload":{"lines":"280,281"}},{"content":"has actual typography,","children":[],"payload":{"lines":"281,282"}},{"content":"detailed design elements (logos)","children":[],"payload":{"lines":"282,283"}}],"payload":{"lines":"276,283"}}],"payload":{"lines":"261,283"}},{"content":"wireframe map","children":[{"content":"shows user flow","children":[],"payload":{"lines":"284,286"}}],"payload":{"lines":"283,286"}}],"payload":{"lines":"255,256"}},{"content":"interface","children":[{"content":"like an agreement","children":[],"payload":{"lines":"288,289"}},{"content":"shared boundary across two or more components","children":[],"payload":{"lines":"289,290"}},{"content":"a boundary where a module can be separated","children":[],"payload":{"lines":"290,291"}},{"content":"separation of concerns","children":[],"payload":{"lines":"291,292"}},{"content":"hides inner details","children":[],"payload":{"lines":"292,293"}},{"content":"communicate change","children":[{"content":"between teams during design","children":[],"payload":{"lines":"294,295"}},{"content":"API level","children":[],"payload":{"lines":"295,296"}},{"content":"code level","children":[],"payload":{"lines":"296,298"}}],"payload":{"lines":"293,298"}}],"payload":{"lines":"286,287"}},{"content":"architecture decision record","children":[{"content":"capture the decision","children":[],"payload":{"lines":"300,301"}},{"content":"helps to understand why the feature is built in a way and not some other way","children":[],"payload":{"lines":"301,302"}},{"content":"form of communication","children":[{"content":"for the future you","children":[],"payload":{"lines":"303,304"}},{"content":"for colleagues","children":[],"payload":{"lines":"304,305"}},{"content":"asynchronous way of communication","children":[],"payload":{"lines":"305,307"}}],"payload":{"lines":"302,307"}}],"payload":{"lines":"298,299"}}],"payload":{"lines":"191,192"}},{"content":"design patterns","children":[{"content":"programming paradigms","children":[{"content":"structural","children":[],"payload":{"lines":"310,311"}},{"content":"procedural","children":[],"payload":{"lines":"311,312"}},{"content":"object oriented","children":[],"payload":{"lines":"312,313"}},{"content":"functional","children":[],"payload":{"lines":"313,314"}}],"payload":{"lines":"309,314"}},{"content":"paradigm principles","children":[{"content":"object oriented","children":[{"content":"inheritance","children":[],"payload":{"lines":"316,317"}},{"content":"abstraction","children":[],"payload":{"lines":"317,318"}},{"content":"encapsulation","children":[],"payload":{"lines":"318,319"}},{"content":"polymorphism","children":[],"payload":{"lines":"319,320"}}],"payload":{"lines":"315,320"}},{"content":"functional","children":[{"content":"immutability","children":[],"payload":{"lines":"321,322"}},{"content":"lambda","children":[],"payload":{"lines":"322,323"}},{"content":"structural pattern matching","children":[],"payload":{"lines":"323,324"}},{"content":"algebraic data structures","children":[],"payload":{"lines":"324,325"}}],"payload":{"lines":"320,325"}}],"payload":{"lines":"314,325"}},{"content":"design principles","children":[{"content":"SOLID","children":[{"content":"single responsibility principle","children":[{"content":"do one thing","children":[],"payload":{"lines":"328,329"}}],"payload":{"lines":"327,329"}},{"content":"open-closed principle","children":[{"content":"classes should be open for extension and closed to modification","children":[],"payload":{"lines":"330,331"}}],"payload":{"lines":"329,331"}},{"content":"Liskov substitution principle","children":[{"content":"classes should be able to substituted by subclasses without disrupting the behavior","children":[],"payload":{"lines":"332,333"}}],"payload":{"lines":"331,333"}},{"content":"interface segregation principle","children":[{"content":"client-specific interfaces are better than one general-purpose interface","children":[],"payload":{"lines":"334,335"}},{"content":"clients should not be forced to implement a function they do no need","children":[],"payload":{"lines":"335,336"}}],"payload":{"lines":"333,336"}},{"content":"dependency inversion principle","children":[{"content":"modules should depend on interfaces (or abstract classes), not concrete classes","children":[],"payload":{"lines":"337,338"}}],"payload":{"lines":"336,338"}}],"payload":{"lines":"326,338"}},{"content":"DRY","children":[{"content":"don't repeat yourself","children":[],"payload":{"lines":"339,340"}}],"payload":{"lines":"338,340"}},{"content":"YAGNI","children":[{"content":"you aren't gonna need it","children":[],"payload":{"lines":"341,342"}},{"content":"originates from extreme programming","children":[],"payload":{"lines":"342,343"}},{"content":"do not add functionality until needed","children":[],"payload":{"lines":"343,344"}}],"payload":{"lines":"340,344"}}],"payload":{"lines":"325,344"}},{"content":"design patterns","children":[{"content":"gang of four (OOP)","children":[{"content":"23 common software design patterns","children":[],"payload":{"lines":"346,347"}},{"content":"solutions to common OOP design problems","children":[],"payload":{"lines":"347,348"}},{"content":"three categories","children":[{"content":"creational","children":[],"payload":{"lines":"349,350"}},{"content":"structural","children":[],"payload":{"lines":"350,351"}},{"content":"behavioral","children":[],"payload":{"lines":"351,352"}}],"payload":{"lines":"348,352"}}],"payload":{"lines":"345,352"}},{"content":"functional","children":[{"content":"filter-map-reduce","children":[],"payload":{"lines":"353,354"}},{"content":"monad","children":[],"payload":{"lines":"354,355"}}],"payload":{"lines":"352,355"}}],"payload":{"lines":"344,355"}},{"content":"architectural principles","children":[{"content":"coupling and cohesion","children":[{"content":"coupling is the degree of interdependence between software modules","children":[],"payload":{"lines":"357,358"}},{"content":"low coupling often correlates with high cohesion","children":[],"payload":{"lines":"358,359"}}],"payload":{"lines":"356,359"}},{"content":"dependencies","children":[],"payload":{"lines":"359,360"}},{"content":"boundaries","children":[],"payload":{"lines":"360,361"}}],"payload":{"lines":"355,361"}},{"content":"architectural styles","children":[{"content":"client-server","children":[{"content":"client initiates a connection to the server","children":[],"payload":{"lines":"363,364"}},{"content":"distributed","children":[],"payload":{"lines":"364,365"}}],"payload":{"lines":"362,365"}},{"content":"message-bus","children":[{"content":"shared communication channe","children":[],"payload":{"lines":"366,367"}},{"content":"connects multiple components","children":[],"payload":{"lines":"367,368"}},{"content":"simple","children":[],"payload":{"lines":"368,369"}},{"content":"models","children":[{"content":"publish-subscribe model","children":[{"content":"one to many","children":[],"payload":{"lines":"371,372"}}],"payload":{"lines":"370,372"}},{"content":"point-to-point model","children":[{"content":"one to one","children":[],"payload":{"lines":"373,374"}}],"payload":{"lines":"372,374"}}],"payload":{"lines":"369,374"}},{"content":"delivery guarantee","children":[{"content":"at most once","children":[],"payload":{"lines":"375,376"}},{"content":"at least once","children":[],"payload":{"lines":"376,377"}},{"content":"exactly once","children":[],"payload":{"lines":"377,378"}}],"payload":{"lines":"374,378"}}],"payload":{"lines":"365,378"}},{"content":"layered","children":[{"content":"simple","children":[],"payload":{"lines":"379,380"}},{"content":"easy to implement","children":[],"payload":{"lines":"380,381"}},{"content":"separated components","children":[{"content":"helps testing","children":[],"payload":{"lines":"382,383"}}],"payload":{"lines":"381,383"}},{"content":"difficult to scale","children":[],"payload":{"lines":"383,384"}},{"content":"can be difficult to maintain","children":[],"payload":{"lines":"384,385"}},{"content":"a layer depends on the layer above it","children":[],"payload":{"lines":"385,386"}}],"payload":{"lines":"378,386"}},{"content":"onion","children":[{"content":"code can depend on layers more central","children":[],"payload":{"lines":"387,388"}},{"content":"coupling towards the center","children":[],"payload":{"lines":"388,389"}},{"content":"database is not the center, it is external","children":[],"payload":{"lines":"389,390"}},{"content":"relies on the dependency inversion principle","children":[],"payload":{"lines":"390,391"}}],"payload":{"lines":"386,391"}},{"content":"clean architecture","children":[{"content":"similar to onion","children":[],"payload":{"lines":"392,393"}},{"content":"different terminology","children":[],"payload":{"lines":"393,394"}}],"payload":{"lines":"391,394"}},{"content":"hexagonal","children":[{"content":"ports and adapters","children":[],"payload":{"lines":"395,396"}},{"content":"isolates responsibilities","children":[],"payload":{"lines":"396,397"}},{"content":"focus on interface definition","children":[],"payload":{"lines":"397,398"}},{"content":"inner structure is not defined","children":[],"payload":{"lines":"398,399"}},{"content":"extra effort for port-adapter implementation","children":[],"payload":{"lines":"399,400"}}],"payload":{"lines":"394,400"}}],"payload":{"lines":"361,400"}},{"content":"architectural patterns","children":[{"content":"model-view-controller","children":[{"content":"view is responsible for rendering UI","children":[],"payload":{"lines":"402,403"}},{"content":"controller handles the user input and performs interactions on the data model","children":[],"payload":{"lines":"403,404"}},{"content":"model is responsible for managing the data","children":[],"payload":{"lines":"404,405"}},{"content":"view is monolithic","children":[],"payload":{"lines":"405,406"}},{"content":"view and the model are tightly coupled","children":[],"payload":{"lines":"406,407"}},{"content":"multiple views","children":[],"payload":{"lines":"407,408"}}],"payload":{"lines":"401,408"}},{"content":"model-view-presenter","children":[{"content":"desktop","children":[],"payload":{"lines":"409,410"}},{"content":"one view","children":[],"payload":{"lines":"410,411"}},{"content":"view hamdles input","children":[],"payload":{"lines":"411,412"}}],"payload":{"lines":"408,412"}},{"content":"model-view-viewmodel","children":[{"content":"multiple views","children":[],"payload":{"lines":"413,414"}},{"content":"view hamdles input","children":[],"payload":{"lines":"414,415"}},{"content":"removes coupling between view and model","children":[],"payload":{"lines":"415,416"}}],"payload":{"lines":"412,416"}}],"payload":{"lines":"400,416"}}],"payload":{"lines":"307,308"}}]},{"colorFreezeLevel":3,"initialExpandLevel":2}) + })(() => window.markmap,null,{"content":"software engineering","children":[{"content":"SDLC","children":[{"content":"waterfall","children":[{"content":"earliest SDLC model","children":[],"payload":{"lines":"5,6"}},{"content":"progress flows in one direction","children":[],"payload":{"lines":"6,7"}},{"content":"not iterative, not flexible","children":[],"payload":{"lines":"7,8"}},{"content":"linear, sequential phases","children":[],"payload":{"lines":"8,9"}},{"content":"later it was extended with feedback loops","children":[],"payload":{"lines":"9,11"}}],"payload":{"lines":"3,4"}},{"content":"V Model","children":[{"content":"rigid model","children":[],"payload":{"lines":"13,14"}},{"content":"each phase has output and a review process","children":[{"content":"errors are found at early stage","children":[],"payload":{"lines":"15,16"}},{"content":"decreases the risk of failure","children":[],"payload":{"lines":"16,17"}}],"payload":{"lines":"14,17"}},{"content":"large to small: testing is done in a hierarchical perspective","children":[],"payload":{"lines":"17,19"}}],"payload":{"lines":"11,12"}},{"content":"iterative model","children":[{"content":"software is built incrementally","children":[{"content":"with each iteration adding new features or refining existing ones","children":[],"payload":{"lines":"22,23"}}],"payload":{"lines":"21,23"}},{"content":"possible to get feedback after each iteration","children":[],"payload":{"lines":"23,24"}},{"content":"can be rigid within an iteration","children":[],"payload":{"lines":"24,26"}}],"payload":{"lines":"19,20"}},{"content":"agile","children":[{"content":"manifesto","children":[{"content":"individuals and interactions over processes and tools","children":[],"payload":{"lines":"30,31"}},{"content":"working software over comprehensive documentation","children":[],"payload":{"lines":"31,32"}},{"content":"customer collaboration over contract negotiation","children":[],"payload":{"lines":"32,33"}},{"content":"responding to change over following a plan","children":[],"payload":{"lines":"33,35"}}],"payload":{"lines":"28,29"}},{"content":"scrum","children":[{"content":"roles","children":[{"content":"scrum master","children":[{"content":"developer representative","children":[],"payload":{"lines":"39,40"}},{"content":"responsible for the scrum team’s effectiveness","children":[],"payload":{"lines":"40,41"}},{"content":"impediment handler","children":[],"payload":{"lines":"41,42"}},{"content":"ensures calm and uninterrupted working","children":[],"payload":{"lines":"42,43"}}],"payload":{"lines":"38,43"}},{"content":"product owner","children":[{"content":"customer representative","children":[],"payload":{"lines":"44,45"}},{"content":"creates product backlog","children":[],"payload":{"lines":"45,46"}},{"content":"prioritizes items in product backlog","children":[],"payload":{"lines":"46,47"}},{"content":"responsible for maximizing the value of the product","children":[],"payload":{"lines":"47,48"}}],"payload":{"lines":"43,48"}},{"content":"developer team","children":[{"content":"optimally 3 to 9 people","children":[],"payload":{"lines":"49,50"}},{"content":"self-organizing","children":[],"payload":{"lines":"50,51"}},{"content":"cross-functional","children":[],"payload":{"lines":"51,52"}}],"payload":{"lines":"48,52"}}],"payload":{"lines":"37,52"}},{"content":"epic","children":[{"content":"user story","children":[{"content":"task","children":[],"payload":{"lines":"54,55"}}],"payload":{"lines":"53,55"}}],"payload":{"lines":"52,55"}},{"content":"events","children":[{"content":"sprint planning","children":[{"content":"initiates the sprint","children":[],"payload":{"lines":"57,58"}},{"content":"max 8 hours for a four-week sprint","children":[],"payload":{"lines":"58,59"}},{"content":"defining sprint goal","children":[],"payload":{"lines":"59,60"}}],"payload":{"lines":"56,60"}},{"content":"sprint","children":[{"content":"1-4 week long","children":[],"payload":{"lines":"61,62"}},{"content":"considered a short project","children":[],"payload":{"lines":"62,63"}},{"content":"turns backlog items into increments","children":[],"payload":{"lines":"63,64"}},{"content":"includes daily scrum","children":[],"payload":{"lines":"64,65"}}],"payload":{"lines":"60,65"}},{"content":"daily standup","children":[{"content":"a.k.a. daily scrum","children":[],"payload":{"lines":"66,67"}},{"content":"3 questions","children":[],"payload":{"lines":"67,68"}},{"content":"timebox: 15 minutes","children":[],"payload":{"lines":"68,69"}},{"content":"always on the same time and at the same place","children":[],"payload":{"lines":"69,70"}},{"content":"standing up","children":[],"payload":{"lines":"70,71"}}],"payload":{"lines":"65,71"}},{"content":"backlog grooming","children":[{"content":"refinement of user story dod","children":[{"content":"smart goals","children":[],"payload":{"lines":"73,74"}}],"payload":{"lines":"72,74"}},{"content":"effort estimation","children":[],"payload":{"lines":"74,75"}}],"payload":{"lines":"71,75"}},{"content":"sprint review","children":[{"content":"a.k.a. demo","children":[],"payload":{"lines":"76,77"}},{"content":"scrum team presents the their work to the stakeholders","children":[],"payload":{"lines":"77,78"}},{"content":"increment is evaluated","children":[],"payload":{"lines":"78,79"}},{"content":"max 4 hours for a four-week sprint","children":[],"payload":{"lines":"79,80"}}],"payload":{"lines":"75,80"}},{"content":"retrospective","children":[{"content":"concludes the sprint","children":[],"payload":{"lines":"81,82"}},{"content":"max 3 hours for a four-week sprint","children":[],"payload":{"lines":"82,83"}},{"content":"retrospective starfish","children":[{"content":"start","children":[],"payload":{"lines":"84,85"}},{"content":"stop","children":[],"payload":{"lines":"85,86"}},{"content":"more","children":[],"payload":{"lines":"86,87"}},{"content":"less","children":[],"payload":{"lines":"87,88"}},{"content":"continue","children":[],"payload":{"lines":"88,89"}}],"payload":{"lines":"83,89"}}],"payload":{"lines":"80,89"}}],"payload":{"lines":"55,89"}},{"content":"artifacts","children":[{"content":"sprint backlog","children":[],"payload":{"lines":"90,91"}},{"content":"product backlog","children":[],"payload":{"lines":"91,92"}},{"content":"sprint goal","children":[],"payload":{"lines":"92,93"}},{"content":"definition of done","children":[],"payload":{"lines":"93,94"}},{"content":"burndown chart","children":[],"payload":{"lines":"94,95"}},{"content":"board","children":[],"payload":{"lines":"95,97"}}],"payload":{"lines":"89,97"}}],"payload":{"lines":"35,36"}},{"content":"kanban","children":[{"content":"pull-based system","children":[],"payload":{"lines":"99,100"}},{"content":"uses a visual workflow","children":[],"payload":{"lines":"100,101"}},{"content":"uses columns for states of the product","children":[],"payload":{"lines":"101,102"}},{"content":"continuous flow (not iterative)","children":[],"payload":{"lines":"102,103"}},{"content":"no roles, no events","children":[],"payload":{"lines":"103,104"}},{"content":"pick top right task","children":[],"payload":{"lines":"104,105"}},{"content":"encourages to improve the workflow","children":[],"payload":{"lines":"105,107"}}],"payload":{"lines":"97,98"}},{"content":"extreme programming","children":[{"content":"frequent releases, short development cycles","children":[],"payload":{"lines":"109,110"}},{"content":"intended to improve productivity and","children":[],"payload":{"lines":"110,111"}},{"content":"introduce checkpoints for customer requirements","children":[],"payload":{"lines":"111,112"}},{"content":"features","children":[{"content":"pair programming","children":[],"payload":{"lines":"113,114"}},{"content":"doing extensive code review","children":[],"payload":{"lines":"114,115"}},{"content":"unit testing of all code","children":[],"payload":{"lines":"115,116"}},{"content":"not programming features until they are actually needed","children":[],"payload":{"lines":"116,117"}},{"content":"flat management structure","children":[],"payload":{"lines":"117,119"}}],"payload":{"lines":"112,119"}}],"payload":{"lines":"107,108"}}],"payload":{"lines":"26,27"}}],"payload":{"lines":"1,2"}},{"content":"requirement analysis","children":[{"content":"user story mapping","children":[{"content":"performed in workshops","children":[],"payload":{"lines":"172,173"}},{"content":"build a shared understanding","children":[],"payload":{"lines":"173,174"}},{"content":"user story map","children":[{"content":"three levels","children":[{"content":"activities","children":[{"content":"big thing that users do","children":[],"payload":{"lines":"177,178"}},{"content":"has multiple steps","children":[],"payload":{"lines":"178,179"}},{"content":"not always has a precise workflow","children":[],"payload":{"lines":"179,180"}},{"content":"has roles","children":[],"payload":{"lines":"180,181"}}],"payload":{"lines":"176,181"}},{"content":"steps","children":[],"payload":{"lines":"181,182"}},{"content":"details","children":[],"payload":{"lines":"182,183"}}],"payload":{"lines":"175,183"}},{"content":"zooms from an overview to details","children":[],"payload":{"lines":"183,184"}},{"content":"multiple interations","children":[{"content":"living document","children":[],"payload":{"lines":"185,186"}},{"content":"versions","children":[],"payload":{"lines":"186,187"}}],"payload":{"lines":"184,187"}},{"content":"backbone","children":[],"payload":{"lines":"187,188"}},{"content":"skeleton","children":[],"payload":{"lines":"188,191"}}],"payload":{"lines":"174,191"}}],"payload":{"lines":"170,171"}}],"payload":{"lines":"119,120"}},{"content":"design","children":[{"content":"unified modelling language","children":[{"content":"structural diagrams","children":[{"content":"class","children":[{"content":"describes the structure of a system","children":[],"payload":{"lines":"197,198"}},{"content":"main building block of the object-oriented modeling","children":[],"payload":{"lines":"198,199"}}],"payload":{"lines":"196,199"}},{"content":"object","children":[{"content":"represents the objects and their relationships at a specific moment","children":[],"payload":{"lines":"200,201"}},{"content":"snapshot","children":[],"payload":{"lines":"201,202"}},{"content":"does not show anything architecturally different to class diagram","children":[],"payload":{"lines":"202,203"}}],"payload":{"lines":"199,203"}},{"content":"component","children":[{"content":"depicts the component structure and relations","children":[],"payload":{"lines":"204,205"}},{"content":"highlights the interfaces","children":[],"payload":{"lines":"205,206"}}],"payload":{"lines":"203,206"}}],"payload":{"lines":"195,206"}},{"content":"behavior diagrams","children":[{"content":"use case","children":[{"content":"depicts the interactions between system users","children":[],"payload":{"lines":"208,209"}},{"content":"high-level view","children":[],"payload":{"lines":"209,210"}},{"content":"similar to a user story","children":[],"payload":{"lines":"210,211"}},{"content":"helping stakeholders to understand the system's functionality","children":[],"payload":{"lines":"211,212"}}],"payload":{"lines":"207,212"}},{"content":"activity","children":[{"content":"represents workflows","children":[],"payload":{"lines":"213,214"}},{"content":"similar to flowchart","children":[],"payload":{"lines":"214,215"}},{"content":"parallel processing","children":[],"payload":{"lines":"215,216"}},{"content":"swimlanes","children":[],"payload":{"lines":"216,217"}}],"payload":{"lines":"212,217"}},{"content":"state machine","children":[{"content":"shows the states of a system","children":[],"payload":{"lines":"218,219"}},{"content":"shows transitions between states","children":[],"payload":{"lines":"219,220"}},{"content":"shows the system's life cycle","children":[],"payload":{"lines":"220,221"}}],"payload":{"lines":"217,221"}},{"content":"sequence","children":[{"content":"process interactions arranged in time sequence","children":[],"payload":{"lines":"222,223"}},{"content":"shows objects","children":[],"payload":{"lines":"223,224"}},{"content":"message exchange between software systems","children":[],"payload":{"lines":"224,225"}}],"payload":{"lines":"221,225"}},{"content":"timing","children":[{"content":"chronological order of events","children":[],"payload":{"lines":"226,227"}},{"content":"useful in real-time systems","children":[],"payload":{"lines":"227,228"}},{"content":"more like for documentation rather than modelling","children":[],"payload":{"lines":"228,230"}}],"payload":{"lines":"225,230"}}],"payload":{"lines":"206,230"}}],"payload":{"lines":"193,194"}},{"content":"C4","children":[{"content":"hierarchical set of software architecture diagrams","children":[],"payload":{"lines":"232,233"}},{"content":"has four levels","children":[{"content":"context","children":[{"content":"how the software fits into the world","children":[],"payload":{"lines":"235,236"}},{"content":"who use the software","children":[],"payload":{"lines":"236,237"}},{"content":"what other software interacts with","children":[],"payload":{"lines":"237,238"}},{"content":"similar to use case diagram","children":[],"payload":{"lines":"238,239"}},{"content":"understandable for non-technical people","children":[],"payload":{"lines":"239,240"}}],"payload":{"lines":"234,240"}},{"content":"containers","children":[{"content":"zooms into the software system, shows its parts","children":[],"payload":{"lines":"241,242"}},{"content":"technology decisions are a key part","children":[],"payload":{"lines":"242,243"}}],"payload":{"lines":"240,243"}},{"content":"components","children":[{"content":"decomposition of each container","children":[],"payload":{"lines":"244,245"}},{"content":"shows components, their interactions and responsibilities","children":[],"payload":{"lines":"245,246"}},{"content":"also shows technology / implementation details","children":[],"payload":{"lines":"246,247"}},{"content":"roughly equivalent with the UML component diagram","children":[],"payload":{"lines":"247,248"}}],"payload":{"lines":"243,248"}},{"content":"code","children":[{"content":"optional level of detail","children":[],"payload":{"lines":"249,250"}},{"content":"ideally automatically generated","children":[],"payload":{"lines":"250,251"}},{"content":"if required, it can zoom into an individual component","children":[],"payload":{"lines":"251,252"}},{"content":"but show only those attributes and methods that really needed for the storytelling","children":[],"payload":{"lines":"252,253"}},{"content":"UML class diagram can be used","children":[],"payload":{"lines":"253,255"}}],"payload":{"lines":"248,255"}}],"payload":{"lines":"233,255"}}],"payload":{"lines":"230,231"}},{"content":"wireframing","children":[{"content":"UI/UX designers' responsibility","children":[],"payload":{"lines":"257,258"}},{"content":"iterative process","children":[{"content":"presented to the stakeholders","children":[],"payload":{"lines":"259,260"}},{"content":"feedback","children":[],"payload":{"lines":"260,261"}}],"payload":{"lines":"258,261"}},{"content":"wireframe","children":[{"content":"outline / blueprint / concept art","children":[],"payload":{"lines":"262,263"}},{"content":"visual understanding","children":[{"content":"structure, layout, user flow, functionality and intended behaviours","children":[],"payload":{"lines":"264,265"}}],"payload":{"lines":"263,265"}},{"content":"low fidelity","children":[{"content":"first sketch","children":[],"payload":{"lines":"266,267"}},{"content":"simple","children":[],"payload":{"lines":"267,268"}},{"content":"don't include actual content","children":[],"payload":{"lines":"268,269"}},{"content":"don't consider scale or pixel accuracy","children":[],"payload":{"lines":"269,270"}},{"content":"can be hand-drawn","children":[],"payload":{"lines":"270,271"}}],"payload":{"lines":"265,271"}},{"content":"mid fidelity","children":[{"content":"more details","children":[],"payload":{"lines":"272,273"}},{"content":"usually no images, typography","children":[],"payload":{"lines":"273,274"}},{"content":"no colors, grayscale","children":[],"payload":{"lines":"274,275"}},{"content":"usually made with digital tool","children":[],"payload":{"lines":"275,276"}}],"payload":{"lines":"271,276"}},{"content":"high fidelity","children":[{"content":"finalising the design","children":[{"content":"can be an initial prototype","children":[],"payload":{"lines":"278,279"}}],"payload":{"lines":"277,279"}},{"content":"created using a digital tool","children":[],"payload":{"lines":"279,280"}},{"content":"pixel-specific layouts","children":[],"payload":{"lines":"280,281"}},{"content":"has actual typography,","children":[],"payload":{"lines":"281,282"}},{"content":"detailed design elements (logos)","children":[],"payload":{"lines":"282,283"}}],"payload":{"lines":"276,283"}}],"payload":{"lines":"261,283"}},{"content":"wireframe map","children":[{"content":"shows user flow","children":[],"payload":{"lines":"284,286"}}],"payload":{"lines":"283,286"}}],"payload":{"lines":"255,256"}},{"content":"interface","children":[{"content":"like an agreement","children":[],"payload":{"lines":"288,289"}},{"content":"shared boundary across two or more components","children":[],"payload":{"lines":"289,290"}},{"content":"a boundary where a module can be separated","children":[],"payload":{"lines":"290,291"}},{"content":"separation of concerns","children":[],"payload":{"lines":"291,292"}},{"content":"hides inner details","children":[],"payload":{"lines":"292,293"}},{"content":"communicate change","children":[{"content":"between teams during design","children":[],"payload":{"lines":"294,295"}},{"content":"API level","children":[],"payload":{"lines":"295,296"}},{"content":"code level","children":[],"payload":{"lines":"296,298"}}],"payload":{"lines":"293,298"}}],"payload":{"lines":"286,287"}},{"content":"architecture decision record","children":[{"content":"capture the decision","children":[],"payload":{"lines":"300,301"}},{"content":"helps to understand why the feature is built in a way and not some other way","children":[],"payload":{"lines":"301,302"}},{"content":"form of communication","children":[{"content":"for the future you","children":[],"payload":{"lines":"303,304"}},{"content":"for colleagues","children":[],"payload":{"lines":"304,305"}},{"content":"asynchronous way of communication","children":[],"payload":{"lines":"305,307"}}],"payload":{"lines":"302,307"}}],"payload":{"lines":"298,299"}}],"payload":{"lines":"191,192"}},{"content":"design patterns","children":[{"content":"programming paradigms","children":[{"content":"structural","children":[],"payload":{"lines":"310,311"}},{"content":"procedural","children":[],"payload":{"lines":"311,312"}},{"content":"object oriented","children":[],"payload":{"lines":"312,313"}},{"content":"functional","children":[],"payload":{"lines":"313,314"}}],"payload":{"lines":"309,314"}},{"content":"paradigm principles","children":[{"content":"object oriented","children":[{"content":"inheritance","children":[],"payload":{"lines":"316,317"}},{"content":"abstraction","children":[],"payload":{"lines":"317,318"}},{"content":"encapsulation","children":[],"payload":{"lines":"318,319"}},{"content":"polymorphism","children":[],"payload":{"lines":"319,320"}}],"payload":{"lines":"315,320"}},{"content":"functional","children":[{"content":"immutability","children":[],"payload":{"lines":"321,322"}},{"content":"lambda","children":[],"payload":{"lines":"322,323"}},{"content":"structural pattern matching","children":[],"payload":{"lines":"323,324"}},{"content":"algebraic data structures","children":[],"payload":{"lines":"324,325"}}],"payload":{"lines":"320,325"}}],"payload":{"lines":"314,325"}},{"content":"design principles","children":[{"content":"SOLID","children":[{"content":"single responsibility principle","children":[{"content":"do one thing","children":[],"payload":{"lines":"328,329"}}],"payload":{"lines":"327,329"}},{"content":"open-closed principle","children":[{"content":"classes should be open for extension and closed to modification","children":[],"payload":{"lines":"330,331"}}],"payload":{"lines":"329,331"}},{"content":"Liskov substitution principle","children":[{"content":"classes should be able to substituted by subclasses without disrupting the behavior","children":[],"payload":{"lines":"332,333"}}],"payload":{"lines":"331,333"}},{"content":"interface segregation principle","children":[{"content":"client-specific interfaces are better than one general-purpose interface","children":[],"payload":{"lines":"334,335"}},{"content":"clients should not be forced to implement a function they do no need","children":[],"payload":{"lines":"335,336"}}],"payload":{"lines":"333,336"}},{"content":"dependency inversion principle","children":[{"content":"modules should depend on interfaces (or abstract classes), not concrete classes","children":[],"payload":{"lines":"337,338"}}],"payload":{"lines":"336,338"}}],"payload":{"lines":"326,338"}},{"content":"DRY","children":[{"content":"don't repeat yourself","children":[],"payload":{"lines":"339,340"}}],"payload":{"lines":"338,340"}},{"content":"YAGNI","children":[{"content":"you aren't gonna need it","children":[],"payload":{"lines":"341,342"}},{"content":"originates from extreme programming","children":[],"payload":{"lines":"342,343"}},{"content":"do not add functionality until needed","children":[],"payload":{"lines":"343,344"}}],"payload":{"lines":"340,344"}}],"payload":{"lines":"325,344"}},{"content":"design patterns","children":[{"content":"gang of four (OOP)","children":[{"content":"23 common software design patterns","children":[],"payload":{"lines":"346,347"}},{"content":"solutions to common OOP design problems","children":[],"payload":{"lines":"347,348"}},{"content":"three categories","children":[{"content":"creational","children":[],"payload":{"lines":"349,350"}},{"content":"structural","children":[],"payload":{"lines":"350,351"}},{"content":"behavioral","children":[],"payload":{"lines":"351,352"}}],"payload":{"lines":"348,352"}}],"payload":{"lines":"345,352"}},{"content":"functional","children":[{"content":"filter-map-reduce","children":[],"payload":{"lines":"353,354"}},{"content":"monad","children":[],"payload":{"lines":"354,355"}}],"payload":{"lines":"352,355"}}],"payload":{"lines":"344,355"}},{"content":"architectural principles","children":[{"content":"coupling and cohesion","children":[{"content":"coupling is the degree of interdependence between software modules","children":[],"payload":{"lines":"357,358"}},{"content":"low coupling often correlates with high cohesion","children":[],"payload":{"lines":"358,359"}}],"payload":{"lines":"356,359"}},{"content":"dependencies","children":[],"payload":{"lines":"359,360"}},{"content":"boundaries","children":[],"payload":{"lines":"360,361"}}],"payload":{"lines":"355,361"}},{"content":"architectural styles","children":[{"content":"client-server","children":[{"content":"client initiates a connection to the server","children":[],"payload":{"lines":"363,364"}},{"content":"distributed","children":[],"payload":{"lines":"364,365"}}],"payload":{"lines":"362,365"}},{"content":"message-bus","children":[{"content":"shared communication channel","children":[],"payload":{"lines":"366,367"}},{"content":"connects multiple components","children":[],"payload":{"lines":"367,368"}},{"content":"simple","children":[],"payload":{"lines":"368,369"}},{"content":"models","children":[{"content":"publish-subscribe model","children":[{"content":"one to many","children":[],"payload":{"lines":"371,372"}}],"payload":{"lines":"370,372"}},{"content":"point-to-point model","children":[{"content":"one to one","children":[],"payload":{"lines":"373,374"}}],"payload":{"lines":"372,374"}}],"payload":{"lines":"369,374"}},{"content":"delivery guarantee","children":[{"content":"at most once","children":[],"payload":{"lines":"375,376"}},{"content":"at least once","children":[],"payload":{"lines":"376,377"}},{"content":"exactly once","children":[],"payload":{"lines":"377,378"}}],"payload":{"lines":"374,378"}}],"payload":{"lines":"365,378"}},{"content":"layered","children":[{"content":"simple","children":[],"payload":{"lines":"379,380"}},{"content":"easy to implement","children":[],"payload":{"lines":"380,381"}},{"content":"separated components","children":[{"content":"helps testing","children":[],"payload":{"lines":"382,383"}}],"payload":{"lines":"381,383"}},{"content":"difficult to scale","children":[],"payload":{"lines":"383,384"}},{"content":"can be difficult to maintain","children":[],"payload":{"lines":"384,385"}},{"content":"a layer depends on the layer above it","children":[],"payload":{"lines":"385,386"}}],"payload":{"lines":"378,386"}},{"content":"onion","children":[{"content":"code can depend on layers more central","children":[],"payload":{"lines":"387,388"}},{"content":"coupling towards the center","children":[],"payload":{"lines":"388,389"}},{"content":"database is not the center, it is external","children":[],"payload":{"lines":"389,390"}},{"content":"relies on the dependency inversion principle","children":[],"payload":{"lines":"390,391"}}],"payload":{"lines":"386,391"}},{"content":"clean architecture","children":[{"content":"similar to onion","children":[],"payload":{"lines":"392,393"}}],"payload":{"lines":"391,393"}},{"content":"hexagonal","children":[{"content":"ports and adapters","children":[],"payload":{"lines":"394,395"}},{"content":"isolates responsibilities","children":[],"payload":{"lines":"395,396"}},{"content":"focus on interface definition","children":[],"payload":{"lines":"396,397"}},{"content":"inner structure is not defined","children":[],"payload":{"lines":"397,398"}},{"content":"extra effort for port-adapter implementation","children":[],"payload":{"lines":"398,399"}}],"payload":{"lines":"393,399"}}],"payload":{"lines":"361,399"}},{"content":"architectural patterns","children":[{"content":"model-view-controller","children":[{"content":"view is responsible for rendering UI","children":[],"payload":{"lines":"401,402"}},{"content":"controller handles the user input and performs interactions on the data model","children":[],"payload":{"lines":"402,403"}},{"content":"model is responsible for managing the data","children":[],"payload":{"lines":"403,404"}},{"content":"view is monolithic","children":[],"payload":{"lines":"404,405"}},{"content":"view and the model are tightly coupled","children":[],"payload":{"lines":"405,406"}},{"content":"multiple views","children":[],"payload":{"lines":"406,407"}}],"payload":{"lines":"400,407"}},{"content":"model-view-presenter","children":[{"content":"desktop","children":[],"payload":{"lines":"408,409"}},{"content":"one view","children":[],"payload":{"lines":"409,410"}},{"content":"view hamdles input","children":[],"payload":{"lines":"410,411"}}],"payload":{"lines":"407,411"}},{"content":"model-view-viewmodel","children":[{"content":"multiple views","children":[],"payload":{"lines":"412,413"}},{"content":"view hamdles input","children":[],"payload":{"lines":"413,414"}},{"content":"removes coupling between view and model","children":[],"payload":{"lines":"414,415"}}],"payload":{"lines":"411,415"}}],"payload":{"lines":"399,415"}}],"payload":{"lines":"307,308"}},{"content":"implementation planning","children":[{"content":"define goals","children":[],"payload":{"lines":"419,420"}},{"content":"conduct research","children":[{"content":"learning can be a task","children":[{"content":"new codebase","children":[],"payload":{"lines":"422,423"}},{"content":"new technology","children":[],"payload":{"lines":"423,424"}}],"payload":{"lines":"421,424"}},{"content":"do experiments","children":[],"payload":{"lines":"424,425"}},{"content":"fail fast","children":[{"content":"proof of contradiction","children":[],"payload":{"lines":"426,427"}},{"content":"eliminate candidates as soon as possible","children":[],"payload":{"lines":"427,428"}}],"payload":{"lines":"425,428"}},{"content":"document findings","children":[],"payload":{"lines":"428,429"}},{"content":"minimal workable example","children":[],"payload":{"lines":"429,430"}}],"payload":{"lines":"420,430"}},{"content":"identify risks","children":[{"content":"prioritize risks","children":[],"payload":{"lines":"431,432"}},{"content":"probability","children":[{"content":"how likely is it that the risk will happen?","children":[],"payload":{"lines":"433,434"}}],"payload":{"lines":"432,434"}},{"content":"impact","children":[{"content":"what is the negative impact if the risk does occur?","children":[],"payload":{"lines":"435,436"}}],"payload":{"lines":"434,436"}},{"content":"risk register","children":[{"content":"document","children":[],"payload":{"lines":"437,438"}},{"content":"risk management tool","children":[],"payload":{"lines":"438,439"}},{"content":"table or scatterplot","children":[],"payload":{"lines":"439,440"}},{"content":"additional info","children":[{"content":"nature of the risk","children":[],"payload":{"lines":"441,442"}},{"content":"probability","children":[],"payload":{"lines":"442,443"}},{"content":"impact","children":[],"payload":{"lines":"443,444"}},{"content":"reference and owner","children":[],"payload":{"lines":"444,445"}},{"content":"mitigation measures","children":[],"payload":{"lines":"445,446"}}],"payload":{"lines":"440,446"}}],"payload":{"lines":"436,446"}},{"content":"risk storming","children":[{"content":"visual and collaborative risk identification","children":[],"payload":{"lines":"447,448"}},{"content":"collaborative activity","children":[],"payload":{"lines":"448,449"}},{"content":"steps","children":[{"content":"draw some software architecture diagrams","children":[{"content":"ideally C4","children":[],"payload":{"lines":"451,452"}}],"payload":{"lines":"450,452"}},{"content":"identify the risks individually","children":[{"content":"sticky notes","children":[{"content":"color for priority","children":[],"payload":{"lines":"454,455"}}],"payload":{"lines":"453,455"}},{"content":"10 minutes","children":[],"payload":{"lines":"455,456"}},{"content":"in silence","children":[],"payload":{"lines":"456,457"}}],"payload":{"lines":"452,457"}},{"content":"converge the risks on the diagrams","children":[],"payload":{"lines":"457,458"}},{"content":"review and summarise the risks","children":[{"content":"focusing on risks that only one person identified","children":[],"payload":{"lines":"459,460"}},{"content":"disagreement on the priority","children":[],"payload":{"lines":"460,461"}}],"payload":{"lines":"458,461"}}],"payload":{"lines":"449,461"}}],"payload":{"lines":"446,461"}},{"content":"mitigating risks","children":[{"content":"after risks are identified and prioritized","children":[],"payload":{"lines":"462,463"}},{"content":"either to prevent the risks from happening","children":[],"payload":{"lines":"463,464"}},{"content":"or to take corrective action if the risk does occur","children":[],"payload":{"lines":"464,465"}}],"payload":{"lines":"461,465"}},{"content":"mitigation strategies","children":[{"content":"education","children":[],"payload":{"lines":"466,467"}},{"content":"writing code","children":[{"content":"create prototypes","children":[],"payload":{"lines":"468,469"}},{"content":"proofs of concept","children":[],"payload":{"lines":"469,470"}},{"content":"walking skeletons","children":[{"content":"tiny implementation of the system","children":[],"payload":{"lines":"471,472"}},{"content":"performs a small end-to-end function","children":[],"payload":{"lines":"472,473"}},{"content":"do not use the final architecture","children":[],"payload":{"lines":"473,474"}},{"content":"link together the main architectural components","children":[],"payload":{"lines":"474,475"}}],"payload":{"lines":"470,475"}}],"payload":{"lines":"467,475"}},{"content":"rework","children":[{"content":"change software architecture","children":[],"payload":{"lines":"476,477"}},{"content":"and repeat risk storming","children":[],"payload":{"lines":"477,478"}}],"payload":{"lines":"475,478"}}],"payload":{"lines":"465,478"}}],"payload":{"lines":"430,478"}},{"content":"schedule milestones","children":[{"content":"pay attention to holidays","children":[],"payload":{"lines":"479,480"}},{"content":"Gantt chart","children":[],"payload":{"lines":"480,481"}},{"content":"add safety margin","children":[],"payload":{"lines":"481,482"}}],"payload":{"lines":"478,482"}},{"content":"assign responsibilities and tasks","children":[{"content":"define area of responsibility","children":[],"payload":{"lines":"483,484"}},{"content":"exactly one person should be responsible","children":[],"payload":{"lines":"484,485"}},{"content":"share responsibilities","children":[{"content":"scrum board","children":[],"payload":{"lines":"486,487"}},{"content":"kanban","children":[],"payload":{"lines":"487,488"}},{"content":"ticket/issue tracker","children":[],"payload":{"lines":"488,489"}}],"payload":{"lines":"485,489"}}],"payload":{"lines":"482,489"}},{"content":"allocate resources","children":[{"content":"estimating time requirement","children":[],"payload":{"lines":"490,491"}},{"content":"story points","children":[{"content":"unit of effort required to fully implement a task","children":[],"payload":{"lines":"492,493"}},{"content":"Fibonacci sequence","children":[],"payload":{"lines":"493,494"}},{"content":"powers of 2","children":[],"payload":{"lines":"494,495"}}],"payload":{"lines":"491,495"}},{"content":"planning poker","children":[{"content":"gamified technique","children":[],"payload":{"lines":"496,497"}},{"content":"make estimates by playing numbered cards face-down","children":[{"content":"avoid the cognitive bias of anchoring","children":[{"content":"first number spoken aloud sets a precedent","children":[],"payload":{"lines":"499,500"}}],"payload":{"lines":"498,500"}}],"payload":{"lines":"497,500"}},{"content":"estimates are then discussed","children":[{"content":"high and low estimates are explained","children":[],"payload":{"lines":"501,502"}}],"payload":{"lines":"500,502"}},{"content":"consensus-based","children":[{"content":"repeat until estimates converge","children":[],"payload":{"lines":"503,504"}}],"payload":{"lines":"502,504"}}],"payload":{"lines":"495,504"}},{"content":"measure instead of guessing","children":[{"content":"infer from previous tasks","children":[],"payload":{"lines":"505,506"}},{"content":"burn down charts","children":[],"payload":{"lines":"506,507"}},{"content":"cumulative flow diagram","children":[],"payload":{"lines":"507,508"}},{"content":"Brooks’s law","children":[{"content":"Adding manpower to a late software project makes it later.","children":[],"payload":{"lines":"509,511"}}],"payload":{"lines":"508,511"}}],"payload":{"lines":"504,511"}}],"payload":{"lines":"489,511"}}],"payload":{"lines":"417,418"}},{"content":"clean code","children":[{"content":"communication","children":[{"content":"understanding what it does","children":[],"payload":{"lines":"514,515"}}],"payload":{"lines":"513,515"}},{"content":"style guidelines","children":[{"content":"formatting and best practices","children":[],"payload":{"lines":"516,517"}},{"content":"hierarchy","children":[{"content":"language","children":[],"payload":{"lines":"518,519"}},{"content":"organization","children":[],"payload":{"lines":"519,520"}},{"content":"project","children":[],"payload":{"lines":"520,521"}}],"payload":{"lines":"517,521"}},{"content":"meaningful names","children":[{"content":"intention-revealing names","children":[],"payload":{"lines":"522,523"}},{"content":"avoid disinformation","children":[],"payload":{"lines":"523,524"}},{"content":"make meaningful distinctions","children":[],"payload":{"lines":"524,525"}},{"content":"use pronounceable names","children":[],"payload":{"lines":"525,526"}},{"content":"use searchable names","children":[{"content":"\"The length of a name should correspond to the size of its scope.\"","children":[],"payload":{"lines":"527,528"}}],"payload":{"lines":"526,528"}},{"content":"noun for a class","children":[{"content":"model / blueprint of something","children":[],"payload":{"lines":"529,530"}}],"payload":{"lines":"528,530"}},{"content":"verb for a function","children":[{"content":"does something","children":[],"payload":{"lines":"531,532"}},{"content":"imperative","children":[],"payload":{"lines":"532,533"}}],"payload":{"lines":"530,533"}},{"content":"avoid encodings","children":[],"payload":{"lines":"533,534"}},{"content":"avoid mental mapping","children":[],"payload":{"lines":"534,535"}},{"content":"don’t pun or use humor","children":[],"payload":{"lines":"535,536"}},{"content":"pick one word per concept","children":[],"payload":{"lines":"536,537"}},{"content":"add meaningful context","children":[],"payload":{"lines":"537,538"}}],"payload":{"lines":"521,538"}},{"content":"function","children":[{"content":"short functions","children":[{"content":"below 20 lines","children":[],"payload":{"lines":"540,541"}}],"payload":{"lines":"539,541"}},{"content":"does one thing","children":[],"payload":{"lines":"541,542"}},{"content":"\"The longer the scope of a function, the shorter its name should be.\"","children":[],"payload":{"lines":"542,543"}},{"content":"limits the number of arguments","children":[{"content":"possible no more than 3","children":[],"payload":{"lines":"544,545"}}],"payload":{"lines":"543,545"}},{"content":"do not use flags","children":[],"payload":{"lines":"545,546"}},{"content":"no side effects","children":[],"payload":{"lines":"546,547"}},{"content":"exceptions instead of error codes","children":[],"payload":{"lines":"547,548"}}],"payload":{"lines":"538,548"}},{"content":"comments","children":[{"content":"self documenting -- possibly no comments","children":[],"payload":{"lines":"549,550"}},{"content":"bad comments","children":[{"content":"separating comments","children":[],"payload":{"lines":"551,552"}},{"content":"journal comment","children":[],"payload":{"lines":"552,553"}},{"content":"noise comments","children":[],"payload":{"lines":"553,554"}},{"content":"closing brace comments","children":[],"payload":{"lines":"554,555"}},{"content":"todo comment","children":[{"content":"fix instead or create a task","children":[],"payload":{"lines":"556,557"}}],"payload":{"lines":"555,557"}}],"payload":{"lines":"550,557"}},{"content":"good comments","children":[{"content":"legal comments","children":[],"payload":{"lines":"558,559"}},{"content":"informative comments","children":[],"payload":{"lines":"559,560"}},{"content":"documentation","children":[],"payload":{"lines":"560,562"}}],"payload":{"lines":"557,562"}}],"payload":{"lines":"548,562"}}],"payload":{"lines":"515,562"}}],"payload":{"lines":"511,512"}},{"content":"code quality","children":[{"content":"software craftmanship","children":[{"content":"not only working software, but also well-crafted software","children":[{"content":"high quality","children":[],"payload":{"lines":"566,567"}},{"content":"well-designed","children":[],"payload":{"lines":"567,568"}},{"content":"validated and verified","children":[],"payload":{"lines":"568,569"}},{"content":"tested","children":[],"payload":{"lines":"569,570"}},{"content":"clean","children":[],"payload":{"lines":"570,571"}}],"payload":{"lines":"565,571"}},{"content":"not only responding to change, but also steadily adding value","children":[],"payload":{"lines":"571,572"}},{"content":"not only individuals and interactions, but also a community of professionals","children":[],"payload":{"lines":"572,573"}},{"content":"not only customer collaboration, but also productive partnerships","children":[],"payload":{"lines":"573,574"}}],"payload":{"lines":"564,574"}},{"content":"software rot","children":[{"content":"degradation, deterioration, or loss of the use or performance of software over time","children":[],"payload":{"lines":"575,576"}},{"content":"active","children":[{"content":"due to constant modifications the software gradually loses its integrity","children":[],"payload":{"lines":"577,578"}}],"payload":{"lines":"576,578"}},{"content":"dormant","children":[{"content":"software is not changed, but as the environment evolves it becomes dysfunctional","children":[],"payload":{"lines":"579,580"}}],"payload":{"lines":"578,580"}}],"payload":{"lines":"574,580"}},{"content":"code smell","children":[{"content":"surface indication of a deeper problem","children":[],"payload":{"lines":"581,582"}},{"content":"smells","children":[{"content":"any violation of the clean code","children":[],"payload":{"lines":"583,584"}},{"content":"magic number","children":[],"payload":{"lines":"584,585"}},{"content":"god class (too large class)","children":[],"payload":{"lines":"585,586"}},{"content":"a class does more than one thing","children":[],"payload":{"lines":"586,587"}},{"content":"duplicated code","children":[{"content":"DRY","children":[],"payload":{"lines":"588,589"}}],"payload":{"lines":"587,589"}},{"content":"speculative generality","children":[{"content":"YAGNI","children":[],"payload":{"lines":"590,591"}},{"content":"focus on today’s problem","children":[],"payload":{"lines":"591,592"}}],"payload":{"lines":"589,592"}},{"content":"dead code","children":[],"payload":{"lines":"592,593"}},{"content":"circular dependency","children":[],"payload":{"lines":"593,594"}},{"content":"too complex (cyclomatic complexity)","children":[],"payload":{"lines":"594,595"}},{"content":"refused bequest","children":[{"content":"inheriting from a class, but never using any of the inherited functionality","children":[],"payload":{"lines":"596,597"}}],"payload":{"lines":"595,597"}},{"content":"indecent exposure","children":[{"content":"unnecessarily exposed internals","children":[],"payload":{"lines":"598,599"}}],"payload":{"lines":"597,599"}},{"content":"feature envy","children":[{"content":"extensive usage of other class's features","children":[],"payload":{"lines":"600,601"}}],"payload":{"lines":"599,601"}},{"content":"obsolete comment","children":[],"payload":{"lines":"601,602"}},{"content":"redundant comment","children":[],"payload":{"lines":"602,603"}},{"content":"commented-out code","children":[],"payload":{"lines":"603,604"}}],"payload":{"lines":"582,604"}}],"payload":{"lines":"580,604"}},{"content":"measuring code quality","children":[{"content":"number of source lines of code","children":[],"payload":{"lines":"605,606"}},{"content":"number of code style guides violations","children":[],"payload":{"lines":"606,607"}},{"content":"cyclomatic complexity","children":[{"content":"number of linearly independent paths through the code","children":[],"payload":{"lines":"608,609"}}],"payload":{"lines":"607,609"}},{"content":"test coverage","children":[],"payload":{"lines":"609,610"}},{"content":"WTF / minute during code review","children":[],"payload":{"lines":"610,611"}}],"payload":{"lines":"604,611"}}],"payload":{"lines":"562,563"}},{"content":"code review","children":[{"content":"what?","children":[{"content":"every work product","children":[{"content":"requirement","children":[],"payload":{"lines":"618,619"}},{"content":"architecture","children":[{"content":"risk storming","children":[],"payload":{"lines":"620,621"}}],"payload":{"lines":"619,621"}},{"content":"design","children":[],"payload":{"lines":"621,622"}},{"content":"code","children":[],"payload":{"lines":"622,623"}}],"payload":{"lines":"617,623"}}],"payload":{"lines":"616,623"}},{"content":"why?","children":[{"content":"avoid errors","children":[{"content":"find errors at early stage","children":[],"payload":{"lines":"625,626"}},{"content":"decreases the risk of failure","children":[],"payload":{"lines":"626,627"}}],"payload":{"lines":"624,627"}}],"payload":{"lines":"623,627"}},{"content":"who?","children":[{"content":"anyone who's competent in the topic","children":[],"payload":{"lines":"628,629"}}],"payload":{"lines":"627,629"}},{"content":"types","children":[{"content":"informal","children":[{"content":"ask a colleague to have a look at the code","children":[],"payload":{"lines":"631,632"}},{"content":"over the shoulder","children":[],"payload":{"lines":"632,633"}},{"content":"pair programming","children":[],"payload":{"lines":"633,634"}}],"payload":{"lines":"630,634"}},{"content":"walkthrough","children":[{"content":"led by the author(s)","children":[],"payload":{"lines":"635,636"}},{"content":"not a formal process / review","children":[],"payload":{"lines":"636,637"}},{"content":"useful for higher level documents like requirement specification","children":[],"payload":{"lines":"637,638"}}],"payload":{"lines":"634,638"}},{"content":"technical","children":[{"content":"less formal review","children":[],"payload":{"lines":"639,640"}},{"content":"led by the trained moderator or a technical expert","children":[],"payload":{"lines":"640,641"}},{"content":"issues are found by experts","children":[],"payload":{"lines":"641,642"}},{"content":"can vary from quite informal to very formal","children":[],"payload":{"lines":"642,643"}},{"content":"often performed as a peer review without management","children":[],"payload":{"lines":"643,644"}}],"payload":{"lines":"638,644"}},{"content":"inspection","children":[{"content":"most formal","children":[],"payload":{"lines":"645,646"}},{"content":"rigorously documented","children":[],"payload":{"lines":"646,647"}},{"content":"led by the trained moderator","children":[],"payload":{"lines":"647,648"}},{"content":"high effort","children":[],"payload":{"lines":"648,649"}},{"content":"phases","children":[{"content":"planning","children":[{"content":"the inspection is planned by the moderator","children":[],"payload":{"lines":"651,652"}}],"payload":{"lines":"650,652"}},{"content":"overview meeting","children":[{"content":"the author describes the background of the work product","children":[],"payload":{"lines":"653,654"}}],"payload":{"lines":"652,654"}},{"content":"preparation","children":[{"content":"inspectors examine the work product","children":[],"payload":{"lines":"655,656"}},{"content":"\"actual\" review","children":[],"payload":{"lines":"656,657"}}],"payload":{"lines":"654,657"}},{"content":"inspection meeting","children":[{"content":"reader reads through the work product","children":[],"payload":{"lines":"658,659"}},{"content":"inspectors point out the defects","children":[],"payload":{"lines":"659,660"}}],"payload":{"lines":"657,660"}},{"content":"rework","children":[{"content":"author makes changes","children":[],"payload":{"lines":"661,662"}}],"payload":{"lines":"660,662"}},{"content":"follow-up","children":[{"content":"changes are checked to make sure everything is correct","children":[],"payload":{"lines":"663,664"}}],"payload":{"lines":"662,664"}}],"payload":{"lines":"649,664"}},{"content":"roles","children":[{"content":"author","children":[],"payload":{"lines":"665,666"}},{"content":"moderator","children":[],"payload":{"lines":"666,667"}},{"content":"reader","children":[],"payload":{"lines":"667,668"}},{"content":"recorder","children":[],"payload":{"lines":"668,669"}},{"content":"inspector","children":[],"payload":{"lines":"669,670"}}],"payload":{"lines":"664,670"}}],"payload":{"lines":"644,670"}}],"payload":{"lines":"629,670"}},{"content":"finding","children":[{"content":"severe / major","children":[{"content":"must be changed","children":[],"payload":{"lines":"672,673"}}],"payload":{"lines":"671,673"}},{"content":"suggestion / minor","children":[{"content":"may be changed","children":[],"payload":{"lines":"674,675"}}],"payload":{"lines":"673,675"}},{"content":"question","children":[],"payload":{"lines":"675,676"}}],"payload":{"lines":"670,676"}},{"content":"author's perspective","children":[{"content":"be humble","children":[],"payload":{"lines":"677,678"}},{"content":"open to feedback","children":[],"payload":{"lines":"678,679"}},{"content":"the goal is to deliver higher quality code","children":[{"content":"not about arguing who was right","children":[],"payload":{"lines":"680,681"}}],"payload":{"lines":"679,681"}},{"content":"you and the reviewer are in the same side","children":[],"payload":{"lines":"681,682"}},{"content":"you can learn from the review","children":[],"payload":{"lines":"682,683"}},{"content":"you are not your code","children":[{"content":"the subject of the code review is not you, but your code","children":[],"payload":{"lines":"684,685"}}],"payload":{"lines":"683,685"}}],"payload":{"lines":"676,685"}},{"content":"reviewer's perspective","children":[{"content":"you and the author are in the same side","children":[],"payload":{"lines":"686,687"}},{"content":"pay attention how you formulate your feedback","children":[{"content":"use I-messages","children":[{"content":"formulate your feedback as expressing your personal thoughts","children":[{"content":"it's hard to argue against personal feelings","children":[],"payload":{"lines":"690,691"}}],"payload":{"lines":"689,691"}},{"content":"you-messages sound like an absolute statement","children":[{"content":"lead to a defensive stance","children":[],"payload":{"lines":"692,693"}}],"payload":{"lines":"691,693"}},{"content":"examples","children":[{"content":"I suggest","children":[],"payload":{"lines":"694,695"}},{"content":"I think","children":[],"payload":{"lines":"695,696"}},{"content":"I would","children":[],"payload":{"lines":"696,697"}},{"content":"I believe","children":[],"payload":{"lines":"697,698"}},{"content":"it's hard for me to","children":[],"payload":{"lines":"698,699"}},{"content":"for me, it seems like","children":[],"payload":{"lines":"699,700"}}],"payload":{"lines":"693,700"}}],"payload":{"lines":"688,700"}},{"content":"talk about the code, not the coder","children":[],"payload":{"lines":"700,701"}},{"content":"ask questions","children":[{"content":"feels less like a criticism","children":[],"payload":{"lines":"702,703"}},{"content":"can trigger a constructive thought process","children":[],"payload":{"lines":"703,704"}},{"content":"by asking questions you can reveal the intention behind a design decision","children":[],"payload":{"lines":"704,705"}}],"payload":{"lines":"701,705"}},{"content":"refer to the author's behavior, not their traits","children":[],"payload":{"lines":"705,706"}}],"payload":{"lines":"687,706"}},{"content":"praise","children":[],"payload":{"lines":"706,707"}},{"content":"OIR-rule of giving feedback","children":[{"content":"observation","children":[],"payload":{"lines":"708,709"}},{"content":"impact","children":[],"payload":{"lines":"709,710"}},{"content":"request","children":[],"payload":{"lines":"710,711"}}],"payload":{"lines":"707,711"}},{"content":"three filters for feedback","children":[{"content":"is it true?","children":[],"payload":{"lines":"712,713"}},{"content":"is it necessary?","children":[],"payload":{"lines":"713,714"}},{"content":"it it kind?","children":[],"payload":{"lines":"714,715"}}],"payload":{"lines":"711,715"}},{"content":"200 to 400 lines of code at a time","children":[],"payload":{"lines":"715,716"}},{"content":"don't review for more than 60 minutes at a time","children":[],"payload":{"lines":"716,718"}}],"payload":{"lines":"685,718"}}],"payload":{"lines":"614,615"}}]},{"colorFreezeLevel":3,"initialExpandLevel":2})